2016-05-25 9 views
4

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) 

答えて

6

conv2d_transposconv2dと同じですが、入力と出力が逆です。

conv2dについては、strideと入力シェイプが出力シェイプを決定します。 conv2d_transposeの場合、strideと出力シェイプが入力シェイプを決定します。今すぐあなたのストライドは[1 1 1 1]です。つまり、conv2d_transposeの出力と入力はほぼ同じです(境界効果は無視されます)。入力H = W = 100、stride = [1 2 2 1]について

同じにpaddingを設定した場合、conv2d_tranposeの出力は、200(conv2dの逆)であるべきです。要するに、入力、出力、ストライドは互換性が必要です。

+1

ありがとう@ウィリアム!それがそれを解決しました。出力形状を計算する必要があることを認識していないため、指定されたストライドとパディングでカーネルと畳み込まれるとき、入力と同じ形状になるはずです。 – Pette

関連する問題