[英]Using conv2d in tensorflow
我想在tensorflow中使用conv2d,代碼如下:
import tensorflow as tf
filter_num = 3
filter_size = 5
char_embed_size = 300
max_word_length = 1
max_seq_length = 15
embeddings = tf.Variable(tf.random_normal([512,14,300]))
#cnn_inputs = tf.reshape(word_embeddings, (-1, max_word_length, char_embed_size, 1))
cnn_inputs = tf.reshape(embeddings, (-1, max_word_length, char_embed_size, 1))
filter_shape = [filter_size, char_embed_size, 1, filter_num]
w = tf.Variable(tf.truncated_normal(filter_shape, stddev=0.1), name="cnn_w")
b = tf.Variable(tf.constant(0.1, shape=[filter_num]), name="cnn_b")
conv = tf.nn.conv2d(
cnn_inputs,
w,
strides=[1, 1, 1, 1],
padding="VALID")
當我運行它時,它會發生如下錯誤:
ValueError:負尺寸大小是由於輸入形狀為[7168,1,300,1],[5,300,1,3]的'Conv2D'(運算符:'Conv2D')的1減去5引起的
輸入形狀似乎不匹配,如何解決該問題?
TL; DR答案。
使用padding =“ SAME”:
conv = tf.nn.conv2d(
cnn_inputs,
w,
strides=[1, 1, 1, 1],
padding="SAME") # old value is padding="VALID"
詳細的答案。
根據TF文檔,輸入張量( cnn_inputs
)的形狀應為[batch, in_height, in_width, in_channels]
而內核張量(應為w
)的形狀應為[filter_height, filter_width, in_channels, out_channels]
在您的示例中:
cnn_input.shape
為[7168, 1, 300, 1]
cnn_input.shape
[7168, 1, 300, 1]
因此in_height == 1
和in_width = 300
w.shape
為[5, 300, 1, 3]
w.shape
[5, 300, 1, 3]
,因此filter_height == 5
和filter_width == 300
如果padding="VALID"
和stride=[1, 1, 1, 1]
然后conv2d操作將通過減去“縮水”在空間維度輸入張量filter_size
在空間維度。 例如,如果in_height == 20
,而filter_height == 4
則輸出張量高度可能為in_height == 1
=16。在您的in_height == 1
和filter_height == 5
的樣本中,沿着高度尺寸的輸出張量的形狀約為in_height - filter_height = 1 - 5 = -4
,即您收到的張量為負高度,這是不可能的,並且會導致錯誤。
使用padding="SAME"
,conv2d操作嘗試通過添加零值來保留空間尺寸(該過程稱為“零填充”)。 因此輸出張量的高度與in_height
保持相同
您可以在此處找到有關padding
更多詳細說明: tensorflow的tf.nn.max_pool中的'SAME'和'VALID'填充有什么區別?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.