代码之家  ›  专栏  ›  技术社区  ›  user4911648

均方误差大于零,即使输入等于输出,权重初始化为1

  •  0
  • user4911648  · 技术社区  · 8 年前

    我试图训练一个网络,其中输入=输出,或者更数学:f(x)=x<==&燃气轮机;y=x<==&燃气轮机;x=x

    因此,我有一个输入的大小;[1500500,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 回复  |  直到 8 年前
        1
  •  0
  •   Till Hoffmann    8 年前

    这个 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)
    
    推荐文章