質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.91%

AdamOptimizer.minimizeのgradients計算のところでエラーがでます

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,111

theta_fon

score 6

前提・実現したいこと

PythonとTensorFlowを勉強し始めて一か月の初心者です.
TensorFlowでhttps://github.com/sugyan/face-generatorを参考に2層GANの実装を試みています。
2層目のGeneratorの変数の最適化のところで以下のエラーメッセージが出ました。
いろいろと調べてみましたがこのエラーの解決方法がわからなかったので教えていただきたいです。

発生している問題・エラーメッセージ

Traceback (most recent call last):
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 581, in merge_with
    new_dims.append(dim.merge_with(other[i]))
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 135, in merge_with
    self.assert_is_compatible_with(other)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 108, in assert_is_compatible_with
    % (self, other))
ValueError: Dimensions 4 and 1 are not compatible

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File ".\run_exp.py", line 180, in <module>
    tf.app.run()
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\platform\app.py", line 44, in run
    _sys.exit(main(_sys.argv[:1] + flags_passthrough))
  File ".\run_exp.py", line 89, in main
    train_op2 = stage2_gan.build(h_input_images , h_wrong_images, h_input_labels, feature_matching=False)
  File "C:\Users\username\Desktop\Coding_Space\gans\OriginalGAN\Stage2_GAN.py", line 285, in build
    h_g_opt_op = h_g_opt.minimize(self.losses['h_g'], var_list=self.g.variables)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\training\optimizer.py", line 288, in minimize
    grad_loss=grad_loss)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\training\optimizer.py", line 354, in compute_gradients
    colocate_gradients_with_ops=colocate_gradients_with_ops)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\ops\gradients_impl.py", line 500, in gradients
    in_grad.set_shape(t_in.get_shape())
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\ops.py", line 425, in set_shape
    self._shape = self._shape.merge_with(shape)
  File "C:\Users\username\AppData\Local\Programs\Python\Python35\lib\site-packages\tensorflow\python\framework\tensor_shape.py", line 585, in merge_with
    (self, other))
ValueError: Shapes (4, 4, 4, 234) and (4, 1, 1, 234) are not compatible

該当のソースコード

どこまでソースコードを張ればよいかわからず,中途半端なコードになりましたのでわからないところがあればすぐ追加,修正します.

class Generator:
    def __init__(self, depths=[1024, 512, 256, 128], f_size=16):
        self.reuse = False
        self.f_size = f_size
        self.depths = depths + [3]

    def model(self, x_images,c_labels):
        i_depth = self.depths[0:4]
        o_depth = self.depths[1:5]
        reverse_i_depth = self.depths[::-1][0:4]
        reverse_o_depth = self.depths[::-1][1:5]
        out = []
        with tf.variable_scope('h_g', reuse=self.reuse):
            # reshape from inputs
            outputs = x_images
            with tf.variable_scope('fc_reshape'):
                for i in range(4):
                    with tf.variable_scope('conv%d' % i):
                        w0 = tf.get_variable('w0',[5, 5, reverse_i_depth[i], reverse_o_depth[i]],tf.float32,tf.truncated_normal_initializer(stddev=0.02))
                        b0 = tf.get_variable('b0',[reverse_o_depth[i]],tf.float32,tf.zeros_initializer())
                        fc = tf.nn.conv2d(outputs, w0, [1, 2, 2, 1], 'SAME')
                        mean, variance = tf.nn.moments(fc, [0, 1, 2])
                        outputs = ops.leaky_relu(tf.nn.batch_normalization(fc, mean, variance, b0, None, 1e-5))
                        out.append(outputs)
                """
                outputs = tf.get_variable(
                            'sam',
                            [tf.shape(x_images)[0] ,self.f_size, self.f_size, self.depths[0]],
                            tf.float32,
                            tf.zeros_initializer())
                """
                outputs = ops.connect_label(outputs,c_labels)
                out.append(outputs)
                i_depth[0] += 18 #ラベルの次元分拡張する
            # deconvolution (transpose of convolution) x 4
            for i in range(4):
                with tf.variable_scope('conv%d' % (i + 1)):
                    w = tf.get_variable(
                        'w',
                        [5, 5, o_depth[i], i_depth[i]],
                        tf.float32,
                        tf.truncated_normal_initializer(stddev=0.02))
                    b = tf.get_variable(
                        'b',
                        [o_depth[i]],
                        tf.float32,
                        tf.zeros_initializer())
                    dc = tf.nn.conv2d_transpose(
                        outputs,
                        w,
                        [
                            int(outputs.get_shape()[0]),
                            self.f_size * 2 ** (i + 1),
                            self.f_size * 2 ** (i + 1),
                            o_depth[i]
                        ],
                        [1, 2, 2, 1])
                    if i < 3:
                        mean, variance = tf.nn.moments(dc, [0, 1, 2])
                        outputs = tf.nn.relu(tf.nn.batch_normalization(dc, mean, variance, b, None, 1e-5))
                    else:
                        outputs = tf.nn.tanh(tf.nn.bias_add(dc, b))
                    out.append(outputs)
        self.reuse = True
        self.variables = tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES, scope='h_g')
        return out

    def __call__(self, inputs,labels):
        return self.model(inputs,labels)
def build(self, input_images,wrong_images,input_labels,
              learning_rate=0.0002, beta1=0.5, feature_matching=False):

        z = self.stage1_gan.z
        c = self.stage1_gan.c
        z_c = tf.concat([z,c],1)
        generated_images = self.g(self.stage1_gan.g(z_c)[-1],c)[-1]
        outputs_from_g = self.d(generated_images,self.c)
        outputs_from_i = self.d(input_images,input_labels)
        outputs_from_w = self.d(wrong_images,ops.make_C_noise(self.batch_size)) 
        logits_from_g = outputs_from_g[-1]
        logits_from_i = outputs_from_i[-1]
        logits_from_w = outputs_from_w[-1]
        # losses
        tf.add_to_collection(
            'h_g_losses',
            tf.reduce_mean(
                tf.nn.sparse_softmax_cross_entropy_with_logits(
                    labels=tf.ones([self.batch_size], dtype=tf.int64),
                    logits=logits_from_g)))
        tf.add_to_collection(
            'h_d_losses',
            tf.reduce_mean(
                tf.nn.sparse_softmax_cross_entropy_with_logits(
                    labels=tf.ones([self.batch_size], dtype=tf.int64),
                    logits=logits_from_i)))
        tf.add_to_collection(
            'h_d_losses',
            tf.reduce_mean(
                tf.nn.sparse_softmax_cross_entropy_with_logits(
                    labels=tf.zeros([self.batch_size], dtype=tf.int64),
                    logits=logits_from_g)))
        tf.add_to_collection(
            'h_d_losses',
            tf.reduce_mean(
                tf.nn.sparse_softmax_cross_entropy_with_logits(
                    labels=tf.zeros([self.batch_size], dtype=tf.int64),
                    logits=logits_from_w)))

        self.losses['h_g'] = tf.add_n(tf.get_collection('h_g_losses'), name='h_total_g_loss')
        self.losses['h_d'] = tf.add_n(tf.get_collection('h_d_losses'), name='h_total_d_loss')
        h_g_opt = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=beta1)
        h_d_opt = tf.train.AdamOptimizer(learning_rate=learning_rate, beta1=beta1)
        h_g_opt_op = h_g_opt.minimize(self.losses['h_g'], var_list=self.g.variables)
        h_d_opt_op = h_d_opt.minimize(self.losses['h_d'], var_list=self.d.variables)
        with tf.control_dependencies([h_g_opt_op, h_d_opt_op]):
            self.train = tf.no_op(name='trains')
        return self.train

試したこと

エラーをたどってみるとbuild関数のminimizeから発生しています.
しかし,build関数内の

generated_images = self.g(self.stage1_gan.g(z_c)[-1],c)[-1]


のself.g()のクラスであるGeneratorの

"""
                outputs = tf.get_variable(
                            'sam',
                            [tf.shape(x_images)[0] ,self.f_size, self.f_size, self.depths[0]],
                            tf.float32,
                            tf.zeros_initializer())
                """


のコメントアウトを消すと正常に実行されました.
このことからGeneretorクラスのmodel関数内のコメントアウトした付近が怪しいと思いましたが,エラーの原因は特定できませんでした.
エラー原因の特定と解決方法を教えていただきたいです.
よろしくお願いします.

補足情報(言語/FW/ツール等のバージョンなど)

TensorFlow1.0.0
Windows 10
Python 3.5.3

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

自己解決しました.
エラー通り各TensorのShapeを見直したところ、望んでいたShapeが作られていませんでした.

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.91%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る