3

のように、入力サイズが固定されていない敵対的生成ネットワーク (GAN) を実装したいと考えています4-D Tensor (Batch_size, None, None, 3)

しかし、conv2d_transpose を使用する場合、パラメーターがありますoutput_shape。このパラメーターはtrue size、デコンボリューション後の操作を渡す必要があります。

たとえばthe size of batch_img is (64, 32, 32, 128), w is weight with (3, 3, 64, 128)

deconv = tf.nn.conv2d_transpose(batch_img, w, output_shape=[64, 64, 64, 64],stride=[1,2,2,1], padding='SAME')

だから、私は で取得deconvします。size (64, 64, 64, 64)を渡せば問題ありませんtrue size of output_shape

しかし、固定されていない入力サイズを使用し(64, None, None, 128)、 で取得deconvしたい(64, None, None, 64)

しかし、以下のようにエラーが発生します。

TypeError: Failed to convert object of type <type'list'> to Tensor...

では、deconv でこのパラメータを回避するにはどうすればよいでしょうか? または、修正されていないGANを実装する別の方法はありますか?

4

3 に答える 3

2
  • None オブジェクトは Tensor オブジェクトに変換できないため、出力形状リストはリストにNoneを持つことを受け入れません
  • Noneは次の形でのみ許可されますtf.placeholder
  • サイズを変えるためにNoneの代わりに output_shape を試してください-1たとえば、サイズが必要な(64, None, None, 128)ので試してください[64, -1, -1, 128]...これが機能するかどうか正確にはわかりません...最初の引数であるbatch_sizeで機能しましたが、サイズが固定されていなかったので、私は中古-1
  • 転置畳み込み用の高レベル API が 1 つある方法tf.layers.conv2d_transpose()
  • tf.layers.conv2d_transpose()さまざまな入力のテンソルを使用するため、高レベルの API が機能すると確信しています。
  • を指定する必要さえありません。使用するとoutput-shapeを指定するだけで済みます。output_channelkernel
  • 詳細については: https://www.tensorflow.org/api_docs/python/tf/layers/conv2d_transpose ...これが役立つことを願っています
于 2018-01-15T16:01:49.257 に答える
0

指定されていない形状には tf.shape を使用し、指定された形状には get_shape() を使用する解決策を見つけました。

def get_deconv_lens(H, k, d):
    return tf.multiply(H, d) + k - 1

def deconv2d(x, output_shape, k_h=2, k_w=2, d_h=2, d_w=2, stddev=0.02, name='deconv2d'):
    # output_shape: the output_shape of deconv op
    shape = tf.shape(x)
    H, W = shape[1], shape[2]
    N, _, _, C = x.get_shape().as_list()
    H1 = get_deconv_lens(H, k_h, d_h)
    W1 = get_deconv_lens(W, k_w, d_w)

    with tf.variable_scope(name):
        w = tf.get_variable('weights', [k_h, k_w, C, x.get_shape()[-1]], initializer=tf.random_normal_initializer(stddev=stddev))
        biases = tf.get_variable('biases', shape=[C], initializer=tf.zeros_initializer())

    deconv = tf.nn.conv2d_transpose(x, w, output_shape=[N, H1, W1, C], strides=[1, d_h, d_w, 1], padding='VALID')
    deconv = tf.nn.bias_add(deconv, biases)

    return deconv
于 2018-12-13T04:05:53.363 に答える