tf.nn.conv2d_transpose()
の2つのレイヤーをテンソルをアップサンプルするようにスタックしようとしています。フィードフォワード中はうまく動作しますが、後方伝搬中にエラーが発生します: ValueError: Incompatible shapes for broadcasting: (8, 256, 256, 24) and (8, 100, 100, 24)
。Tensorflowのconv2d_transpose()の複数のレイヤーをスタックする方法
は基本的に、私はちょうど二番目の入力として最初のconv2d_transpose
の出力を設定しました:
convt_1 = tf.nn.conv2d_transpose(...)
convt_2 = tf.nn.conv2d_transpose(conv_1)
を一つだけconv2d_transpose
を使用して、すべてが正常に動作します。複数のconv2d_transpose
が重なっている場合にのみエラーが発生します。
conv2d_transpose
の複数のレイヤを実装する正しい方法がわかりません。これについてどのように進むべきかアドバイスをいただければ幸いです。
はここでエラーを複製小さなコードです:私はあなたがconv2d_transposeであなたの「ストライド」PARAMTERを変更する必要があると思います
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)
ありがとう@ウィリアム!それがそれを解決しました。出力形状を計算する必要があることを認識していないため、指定されたストライドとパディングでカーネルと畳み込まれるとき、入力と同じ形状になるはずです。 – Pette