6

tf.nn.conv2d_transpose()テンソルをアップサンプリングするために2 つのレイヤーをスタックしようとしています。フィード フォワード中は正常に動作しますが、後方伝播中にエラーが発生します: ValueError: Incompatible shapes for broadcasting: (8, 256, 256, 24) and (8, 100, 100, 24).

基本的に、最初の出力をconv2d_transpose2 番目の入力として設定しました。

convt_1 = tf.nn.conv2d_transpose(...)
convt_2 = tf.nn.conv2d_transpose(conv_1)

を 1 つだけ使用するとconv2d_transpose、すべて正常に動作します。エラーは、複数conv2d_transposeが一緒に積み重ねられた場合にのみ発生します。

の複数層を実装する適切な方法がわかりませんconv2d_transpose。これについてどうすればよいかについてのアドバイスは大歓迎です。

エラーを再現する小さなコードを次に示します。

import numpy as np
import tensorflow as tf

IMAGE_HEIGHT = 256
IMAGE_WIDTH = 256
CHANNELS = 1

batch_size = 8
num_labels = 2

in_data = tf.placeholder(tf.float32, shape=(batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, CHANNELS))
labels = tf.placeholder(tf.int32, shape=(batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, 1))

# Variables
w0 = tf.Variable(tf.truncated_normal([3, 3, CHANNELS, 32]))
b0 = tf.Variable(tf.zeros([32]))

# Down sample
conv_0 = tf.nn.relu(tf.nn.conv2d(in_data, w0, [1, 2, 2, 1], padding='SAME') + b0)
print("Convolution 0:", conv_0)


# Up sample 1. Upscale to 100 x 100 x 24
wt1 = tf.Variable(tf.truncated_normal([3, 3, 24, 32]))
convt_1 = tf.nn.sigmoid(
          tf.nn.conv2d_transpose(conv_0, 
                                 filter=wt1, 
                                 output_shape=[batch_size, 100, 100, 24], 
                                 strides=[1, 1, 1, 1]))
print("Deconvolution 1:", convt_1)


# Up sample 2. Upscale to 256 x 256 x 2
wt2 = tf.Variable(tf.truncated_normal([3, 3, 2, 24]))
convt_2 = tf.nn.sigmoid(
          tf.nn.conv2d_transpose(convt_1, 
                                 filter=wt2, 
                                 output_shape=[batch_size, IMAGE_HEIGHT, IMAGE_WIDTH, 2], 
                                 strides=[1, 1, 1, 1]))
print("Deconvolution 2:", convt_2)

# Loss computation
logits = tf.reshape(convt_2, [-1, num_labels])
reshaped_labels = tf.reshape(labels, [-1])
cross_entropy = tf.nn.sparse_softmax_cross_entropy_with_logits(logits, reshaped_labels)
loss = tf.reduce_mean(cross_entropy)

optimizer = tf.train.GradientDescentOptimizer(0.5).minimize(loss)
4

1 に答える 1

7

conv2d_transpose の「stride」パラメータを変更する必要があると思います。conv2d_transposと似conv2dていますが、入力と出力が逆になっています。

の場合conv2dstrideおよび入力形状が出力形状を決定します。の場合conv2d_transposestride出力形状は入力形状を決定します。これでストライドは [1 1 1 1] になりました。これは、出力と入力conv2d_transposeがほぼ同じであることを意味します (境界効果を無視)。

入力 H = W = 100 の場合stride = [1 2 2 1]、 の出力はconv2d_tranpose200 になるはずです ( の逆) 。 を SAMEconv2dに設定した場合。padding要するに、インプット、アウトプット、ストライドが両立している必要があります。

于 2016-05-25T20:18:50.160 に答える