我正在尝试实现中介绍的网络
this paper
.
这段摘录有一个描述图像,并附有一个解释。
输入是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)