2017-12-05 5 views
0

入力=出力以上のネットワークを訓練しようとします:f(x)= x < ==> y = x < ==> x = x入力が出力と等しく、重みが1に初期化されても平均二乗誤差がより大きくなる

したがって、私はサイズの入力を持っています。 [1、500、500、3]と私のネットワークは次のようになります。

logits = tf.layers.conv2d(inputs=x, filters=3, kernel_size=1, padding='SAME', name ='logits', kernel_initializer=tf.ones_initializer(), trainable=True) 

それから私は損失の計算:

loss = tf.losses.mean_squared_error(x, logits) > 0 

をしかし、ネットワークが0

の損失を示していません

私の意見では、私はx = yを設定すると、1で重みを初期化するときに損失が0になるはずだと思いました。

私の心に何か問題はありますか?

答えて

1

conv2dの演算は入力チャンネルで合計します。したがって、カーネルを1で初期化すると、同じ出力チャネルが得られます。各出力チャネルは、入力チャネルの合計です。

bias_initializerをゼロに設定するか、use_biasパラメータをFalseに設定しない限り、ランダムに初期化されたバイアスも出力に影響します。

import tensorflow as tf 
import numpy as np 


with tf.Graph().as_default(): 
    x = tf.placeholder(tf.float32, [None, 500, 500, 3]) 
    y = tf.layers.conv2d(x, 3, 1, padding='same', use_bias=False, kernel_initializer=tf.ones_initializer()) 
    sess = tf.Session() 
    sess.run(tf.global_variables_initializer()) 

# Evaluate 
np.random.seed(1) 
_x = np.random.uniform(0, 1, (1, 500, 500, 3)) 
_y = sess.run(y, {x: _x}) 

# Check that the channels are identical 
np.testing.assert_allclose(_y[..., 0], _y[..., 1]) 

# Check that each channel is the sum over channels 
np.testing.assert_allclose(_y[..., 0], _x.sum(axis=-1), rtol=1e-5) 
+0

あなたの入力のチャンネルの合計はどういう意味ですか?あなたがチャネル= 1を持っていたら、それは合計ではないでしょうか? 注:別のテストでuse_bias = Falseを設定しましたが、まだ動作しませんでした。 – thigi

+0

'conv2d'のリンクされたドキュメントは、私ができるよりも優れていると思います。 –

+0

そう、私が言ったように、チャネル= 1の場合、合計がないので、損失が0.0を返すべきであるように動作するはずです。 – thigi

関連する問題