1

完全に接続されたアップサンプリング レイヤーを使用するこの論文を模倣したいと思います。寄稿したものを使用してconv3d_transposeいますが、コンセプトは2D版と同じはずです。

畳み込み層からの出力が、出力する[6,6,6,256]はずのアップサンプリング層に供給されています[13,13,13,128]。レイヤーが完全に接続されている必要があるため、フィルターは[13,13,13,128]適切である必要がありますか? (特徴マップのサイズを小さくする)

1さらに、ストライドは正しいはずですか?

たぶん私はこれを逆に考えているので、説明させてください。フィルターは、逆受容野のサイズ (完全に構成されています) を定義します。これは、出力層にある重み行列のサイズ(つまり、 full [13,13,13,128]) です。EDIT INCORRECT [ストライドは、単一ウィンドウが入力画像上を移動するストライドの長さです。] --> ストライドも出力層に関連していることがわかりました。たとえば、ストライド 2 のフィルター サイズ 2 は、出力次元を 2 倍にします。これは、完全に接続されたレイヤーの場合、ストライドは であるべきですが0、それは不可能です...

アップサンプリングのコードは次のとおりです。

temp_batch_size = tf.shape(x)[0] #batch_size shape
with tf.name_scope("deconv6") as scope:
    output_shape = [temp_batch_size, (n_input_z / 4), n_input_x / 4, n_input_y / 4, 128]
    strides = [1,1,1,1,1]
    conv7 = deconv3d(conv6, weights['wdc1'], biases['bdc1'], output_shape, strides, padding=1)
    conv7 = tf.reshape(conv7, [-1, n_input_x / 4, n_input_y / 4, (n_input_z / 4) * 128])
    conv7 = tf.contrib.layers.batch_norm(conv7)
    conv7 = tf.reshape(conv7, [-1, (n_input_z / 4), n_input_x / 4, n_input_y / 4, 128])

関数は次のdeconvようになります。

def deconv3d(prev_layer, w, b, output_shape, strides, padding=0):
    # Deconv layer
    if padding == 0:
        deconv = tf.nn.conv3d_transpose(prev_layer, w, output_shape=output_shape, strides=strides, padding="SAME")
    else:
        deconv = tf.nn.conv3d_transpose(prev_layer, w, output_shape=output_shape, strides=strides, padding="VALID")
    deconv = tf.nn.bias_add(deconv, b)
    deconv = tf.nn.relu(deconv)
    return deconv

重みとバイアスは次のとおりです。

'wdc1' : tf.get_variable("weights_7", shape=[13, 13, 13, 128, 256],
           initializer=tf.contrib.layers.xavier_initializer(), dtype=tf.float32),
...

'bdc1': tf.Variable(tf.zeros([128], dtype=tf.float32), name="biases_7", dtype=tf.float32),

デバッグから、入力と出力の次元を確認できます。

(Pdb) conv6
<tf.Tensor 'conv5_1/Reshape_1:0' shape=(?, 6, 6, 6, 256) dtype=float32>
(Pdb) output_shape
[<tf.Tensor 'strided_slice:0' shape=() dtype=int32>, 13, 13, 13, 128]

このコードを実行すると、次のエラーが発生します。

tensorflow.python.framework.errors.InvalidArgumentError: Conv3DBackpropInput: Number of planes of out_backprop doesn't match computed:  actual = 6, computed = 1
     [[Node: deconv6/conv3d_transpose = Conv3DBackpropInputV2[T=DT_FLOAT, padding="VALID", strides=[1, 1, 1, 1, 1], _device="/job:localhost/replica:0/task:0/gpu:0"](deconv6/conv3d_transpose/output_shape, weights_7/read, conv5_1/Reshape_1)]]
     [[Node: deconv8/BatchNorm/moments/sufficient_statistics/Shape/_39 = _Recv[client_terminated=false, recv_device="/job:localhost/replica:0/task:0/cpu:0", send_device="/job:localhost/replica:0/task:0/gpu:0", send_device_incarnation=1, tensor_name="edge_3797_deconv8/BatchNorm/moments/sufficient_statistics/Shape", tensor_type=DT_INT32, _device="/job:localhost/replica:0/task:0/cpu:0"]()]]

Node最初の行から問題が にあると想定しましたdeconv6が、実際に にあると思われる場合はコードを投稿しますdeconv8

4

0 に答える 0