在这个简单的玩具示例中,网络倾斜XOR操作:
import tensorflow as tf
import numpy as np
from sklearn.metrics import accuracy_score, precision_score, recall_score
model = tf.keras.Sequential(layers=[
tf.keras.layers.Input(shape=(2,)),
tf.keras.layers.Dense(4, activation='relu'),
tf.keras.layers.Dense(1)
])
model.compile(
loss=tf.keras.losses.binary_crossentropy,
optimizer=tf.keras.optimizers.SGD(learning_rate=0.01)
)
x_train = np.random.uniform(-1, 1, (10000, 2))
tmp = x_train > 0
y_train = (tmp[:, 0] ^ tmp[:, 1])
model.fit(x=x_train, y=y_train, epochs=10)
x_test = np.random.uniform(-1, 1, (1000, 2))
tmp = x_test > 0
y_test = (tmp[:, 0] ^ tmp[:, 1])
prediction = model.predict(x_test) > 0.5
print(f'Accuracy: {accuracy_score(y_pred=prediction, y_true=y_test)}')
print(f'recall: {recall_score(y_pred=prediction, y_true=y_test)}')
print(f'precision: {precision_score(y_pred=prediction, y_true=y_test)}')此示例也可在tensorflow游乐场中找到。
当初始损失小于3时,这将迅速收敛(在2-3期).但有时,初始条件导致它有~7损失,在这种情况下,它永远不会收敛(甚至在1000年代以后)。
在第一个时代之后,很容易知道它是否起作用,但这使得寻找超参数变得非常困难,因为你永远不知道是否由于初始条件而偶然地成功地收敛,或者超级参数是否是原因。
有没有办法使这个网络减少对初始条件的依赖?不同的优化器?一些优化器的超参数?体重正规化?
我试过改变这些,但没有得到持续的改进。
在操场的例子中,它永远不会被这种高损失所困扰。
编辑:如果你的训练时间足够长,它可能跳到损失7,即使在一个好的解决方案后,损失< 0.03。
发布于 2020-07-26 15:04:45
理论上,没有办法100%确定是超调还是初始配置。当出现分歧时,您需要为这种情况实现一些东西。
实际上,你可以:
tf.random.set_seed初始化的随机种子,但这当然会对您的性能产生很大影响,所以我认为这并不是您真正想要的。您可以断言,您现在确信网络性能良好是因为该体系结构,但这只适用于特定的随机种子,而不是所有的人。发布于 2021-01-05 10:45:07
根据这个博客的说法,添加批处理规范会降低网络对初始化方法的敏感性。
https://stackoverflow.com/questions/63096850
复制相似问题