2016-02-18 16 views
19

Tôi nhận được thông báo lỗi này khi sử dụng conv2d_transpose:Confused về conv2d_transpose

W tensorflow/core/common_runtime/executor.cc:1102] 0x7fc81f0d6250 Compute status: Invalid argument: Conv2DBackpropInput: Number of rows of out_backprop doesn't match computed: actual = 32, computed = 4 
[[Node: generator/g_h1/conv2d_transpose = Conv2DBackpropInput[T=DT_FLOAT, padding="SAME", strides=[1, 2, 2, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](generator/g_h1/conv2d_transpose/output_shape, generator/g_h1/w/read, _recv_l_0)]] 

Tuy nhiên, nó xảy ra sau khi biểu đồ được xây dựng khi biên dịch hàm tổn thất (Adam). Bất kỳ ý tưởng về những gì sẽ gây ra điều này? Tôi nghi ngờ nó liên quan đến kích thước đầu vào nhưng tôi không chắc chắn chính xác lý do tại sao.

Full lỗi: https://gist.github.com/jimfleming/75d88e888044615dd6e3

đang liên quan:

# l shape: [batch_size, 32, 32, 4] 

output_shape = [self.batch_size, 8, 8, 128] 
filter_shape = [7, 7, 128, l.get_shape()[-1]] 
strides = [1, 2, 2, 1] 
with tf.variable_scope("g_h1"): 
    w = tf.get_variable('w', filter_shape, initializer=tf.random_normal_initializer(stddev=0.02)) 
    h1 = tf.nn.conv2d_transpose(l, w, output_shape=output_shape, strides=strides, padding='SAME') 
    h1 = tf.nn.relu(h1) 

output_shape = [self.batch_size, 16, 16, 128] 
filter_shape = [7, 7, 128, h1.get_shape()[-1]] 
strides = [1, 2, 2, 1] 
with tf.variable_scope("g_h2"): 
    w = tf.get_variable('w', filter_shape, initializer=tf.random_normal_initializer(stddev=0.02)) 
    h2 = tf.nn.conv2d_transpose(h1, w,output_shape=output_shape, strides=strides, padding='SAME') 
    h2 = tf.nn.relu(h2) 

output_shape = [self.batch_size, 32, 32, 3] 
filter_shape = [5, 5, 3, h2.get_shape()[-1]] 
strides = [1, 2, 2, 1] 
with tf.variable_scope("g_h3"): 
    w = tf.get_variable('w', filter_shape, initializer=tf.random_normal_initializer(stddev=0.02)) 
    h3 = tf.nn.conv2d_transpose(h2, w,output_shape=output_shape, strides=strides, padding='SAME') 
    h3 = tf.nn.tanh(h3) 
+0

vấn đề tương tự đã được giải quyết ở đây: http://stackoverflow.com/questions/36967872/tensorflow-conv2d-transpose-size-error-number-of-rows- của-out-backprop-không-m –

Trả lời

29

Cảm ơn cho câu hỏi! Bạn hoàn toàn đúng --- vấn đề là các tham số đầu vào và đầu ra được truyền tới tf.nn.conv2d_transpose không đồng ý. (Các lỗi có thể được phát hiện khi tính toán gradient, nhưng việc tính toán độ dốc không phải là vấn đề.)

Hãy nhìn vào chỉ là phần đầu của mã của bạn, và đơn giản hóa nó một chút:

sess = tf.Session() 
batch_size = 3 
output_shape = [batch_size, 8, 8, 128] 
strides = [1, 2, 2, 1] 

l = tf.constant(0.1, shape=[batch_size, 32, 32, 4]) 
w = tf.constant(0.1, shape=[7, 7, 128, 4]) 

h1 = tf.nn.conv2d_transpose(l, w, output_shape=output_shape, strides=strides, padding='SAME') 
print sess.run(h1) 

Tôi đã thay thế các biến bằng hằng số --- nó dễ dàng hơn để xem những gì đang xảy ra.

Nếu bạn cố gắng chạy mã này, bạn nhận được một lỗi tương tự:

InvalidArgumentError: Conv2DCustomBackpropInput: Size of out_backprop doesn't match computed: actual = 32, computed = 4 
    [[Node: conv2d_transpose_6 = Conv2DBackpropInput[T=DT_FLOAT, data_format="NHWC", padding="SAME", strides=[1, 2, 2, 1], use_cudnn_on_gpu=true, _device="/job:localhost/replica:0/task:0/cpu:0"](conv2d_transpose_6/output_shape, Const_25, Const_24)]] 

Bây giờ, lỗi này là một chút sai lệch --- nó nói về 'out_backprop' lập luận để 'Conv2DCustomBackpropInput'. Điều quan trọng là tf.nn.conv2d_transpose thực sự chỉ là gradient của tf.nn.conv2d, vì vậy Tensorflow sử dụng cùng một mã bên trong (Conv2DCustomBackpropInput) để tính toán độ dốc của tf.nn.conv2d và để tính toán tf.nn.conv2d_transpose.

Lỗi có nghĩa là 'output_shape' bạn đã yêu cầu không thể, với các hình dạng 'l' và 'w'.

Kể từ tf.nn.conv2d_transpose là (gradient) đối lạc hậu của tf.nn.conv2d, một cách để xem những gì các hình dạng chính xác nên được là sử dụng các hoạt động tương ứng về phía trước:

output = tf.constant(0.1, shape=output_shape) 
expected_l = tf.nn.conv2d(output, w, strides=strides, padding='SAME') 
print expected_l.get_shape() 
# Prints (3, 4, 4, 4) 

Đó là, theo hướng về phía trước, nếu bạn cung cấp một tensor của hình dạng 'output_shape', bạn sẽ nhận được một tensor của hình dạng (3, 4, 4, 4). Vì vậy, một cách để khắc phục vấn đề là thay đổi hình dạng của 'l' thành (3, 4, 4, 4); nếu bạn thay đổi mã ở trên thành:

l = tf.constant(0.1, shape=[batch_size, 4, 4, 4]) 

mọi thứ đều hoạt động tốt.

Nói chung, hãy thử sử dụng tf.nn.conv2d để có được cảm nhận về mối quan hệ giữa hình dạng tensor. Vì tf.nn.conv2d_transpose là đối tác lạc hậu của nó, nó có cùng mối quan hệ giữa hình dạng đầu vào, đầu ra và bộ lọc (nhưng với vai trò của đầu vào và đầu ra bị đảo ngược.)

Hy vọng điều đó sẽ hữu ích!

1

Sử dụng padding='SAME' trong tf.nn.conv2d_transpose() chức năng có thể làm việc quá

Các vấn đề liên quan