代码之家  ›  专栏  ›  技术社区  ›  Gertjan Brouwer

Tensorflow使用tf规范化输出。数学tanh总是返回1或-1

  •  0
  • Gertjan Brouwer  · 技术社区  · 6 年前

    我正在尝试实现中介绍的网络 this paper .
    这段摘录有一个描述图像,并附有一个解释。
    enter image description here
    输入是353个浮点数的特征,标签是一个按比例缩放的浮点数(-15001500) -1, 1 .
    输出还应在以下范围内进行缩放: -1, 1 我用过 tf.math.tanh() 这样做。
    然而,我得到的唯一结果是 -1 和 1 但两者之间什么都没有。 原因是当打印从第二层到最后一层的输出时,我得到了一个数组,例如:

    [[-5670.9859206034189]
     [-3783.2489875296314]
     [6674.3844754595357]
     [-1985.6217861227797]
     [5615.7066561151887]]
    

    据我所知,这导致 tf.math.tanh 对数组中的每个值执行。导致 1. 或者 -1 取决于输入是负还是正。

    因为所有标签都在 -1500 和 1500 包容性和标准化 -1 和 1. .我可以选择添加 -1500 和 1500 并通过 tanh 作用这将导致一个适当的缩放值,即使它超出了界限,因为它可能在最大值 1. 或 -1 . 然而,这种方法可能比不使用tanh而只是将值除以 1500 并在 1. 和 -1 .

    另一种选择是将所有值添加到一个数组中,并通过 谭 作用但直觉上这是错误的。想象一下阵列: [200, 300, 400, 500] . Tanh 会扩大规模 500 到 1. ,而实际上 1500 应该等同于 1. -因此给了一个错误的标签。这意味着 谭 这在很大程度上取决于批量大小,例如,1000个样本可能会比100个样本给出更好的结果。推理也会有同样的问题,要求我总是使用大批量。

    这个问题的正确解决方案是什么?

    这是我的网络代码的一部分,为了简洁起见,我省略了一些层。

    class FullFullyConnectedOutputLayer(tf.keras.layers.Layer):
      def __init__(self):
        super(FullFullyConnectedOutputLayer, self).__init__()
    
      def build(self, input_shape):
        stddev = 2 / np.sqrt(input_shape[-1] + 1)
        self.w = tf.Variable(tf.random.truncated_normal((input_shape[-1], 1), dtype='float64'), trainable=True)
    
        b_init = tf.zeros_initializer()
        self.b = tf.Variable(initial_value=b_init(shape=(1), dtype='float64'), trainable=True)
    
      def call(self, input):
        return tf.matmul(input, self.w) + self.b
    
    class FullNetwork(tf.keras.Model):
      def __init__(self, ):
        super(FullNetwork, self).__init__(name='')
    
        self.inputLayer = FullFeatureLayer()
        self.hiddenLayer1 = FullFeatureLayer()
        self.hiddenLayer2 = FullFullyConnectedFeatureLayer()
        self.outputLayer = FullFullyConnectedOutputLayer()
    
      def call(self, input):
        x = self.inputLayer(input)
        x = self.hiddenLayer1(x)
        x = self.hiddenLayer2(x)
        x = self.outputLayer(x)
        return tf.math.tanh(x)
    
    tf.keras.backend.set_floatx('float64')
    
    fullNetwork = FullNetwork()
    
    optimizer = tf.keras.optimizers.Adam(learning_rate=1e-3)
    fullNetwork.compile(optimizer, loss=tf.keras.losses.MeanAbsoluteError(), metrics=["accuracy"])
    
    #epoch is 1 for debugging, batch_size is yet to be determined but probably 1000
    fullNetwork.fit(feature_array[:10], score_array[:10], epochs=1, batch_size=5)
    
    0 回复  |  直到 6 年前