簡體   English   中英

在張量流中使用conv2d

[英]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 == 1in_width = 300
  • w.shape[5, 300, 1, 3] w.shape [5, 300, 1, 3] ,因此filter_height == 5filter_width == 300

如果padding="VALID"stride=[1, 1, 1, 1]然后conv2d操作將通過減去“縮水”在空間維度輸入張量filter_size在空間維度。 例如,如果in_height == 20 ,而filter_height == 4則輸出張量高度可能為in_height == 1 =16。在您的in_height == 1filter_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM