微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

改善张量流中的异或神经网络,并使用密集作为输入层

如何解决改善张量流中的异或神经网络,并使用密集作为输入层

作为一个初学者的挑战,我试图在tf中建立神经网络,而且我的模型不是很好,这意味着很多时候它不是非常准确(尽管有时准确度是1,但大多数时候不是,甚至损失很大。

所以我有两个问题:

  1. 如何改善该NN?
  2. 使用Input作为输入层和使用Dense有什么区别?

代码如下:

import tensorflow as tf
from tensorflow import keras

model = keras.Sequential()
model.add(tf.keras.Input(shape=(2,)))
#model.add(keras.layers.Dense(2))
model.add(keras.layers.Dense(4,activation='relu'))
model.add(keras.layers.Dense(1,activation='sigmoid'))

model.compile(optimizer='adam',loss=tf.losses.BinaryCrossentropy(),metrics=['accuracy'])

# X_train,Y_train = ([[0,0],[0,1],[1,1]],[[0],[1],[0]])
X_train = tf.cast([[0,tf.float32)
Y_train = tf.cast([0,1,tf.float32)

model.fit(X_train,Y_train,epochs=500,steps_per_epoch=1)


print(model.predict([[0,1]]))
print(model.predict([[1,0]]))
print(model.predict([[0,0]]))

解决方法

您应该尝试在隐藏层中放置更多神经元。我尝试使用64,但效果很好。

model.add(keras.layers.Dense(64,activation='relu'))

输入层被配置为接收初始数据,这意味着您可以自定义NN的输入形状数据,并明确要求输入的形状。使用密集模式时,您可以配置图层中需要多少个神经元,此外,您还可以在此处自定义激活功能。

请注意,您使用密集来设置输出层,其中神经元的数量是您要预测的类的数量(在这种情况下为一个)。

,

上面的代码有几个明显的问题:

首先,steps_per_epoch=1参数意味着对于每个时期,您的模型只会看到一个示例。效率很低。删除该参数。

接下来,这500个时代还远远不够。没有预训练,即使在最简单的问题上,NN也需要花费大量时间进行训练。我刚刚运行了您的代码,大约在3500个纪元内,它收敛到了最佳解决方案。


没有尝试过,但是您也可以尝试更高的学习率,如下所示:

optimizer = keras.optimizers.Adam(lr=5e-2) #for example
model.compile(optimizer=optimzer,...)

此外,如果您知道如何使用回调,则可以始终使用EarlyStopping回调使模型运行,直到找到最佳模型为止。

关于提前停止: 如果您使用提前停止,则必须还必须使用单独的验证集。验证集会告诉您何时该是停止训练的正确时间。提前停止是当今该领域中最简单的(在我看来)最有用的正则化技术之一。

因此,如果与验证集一起使用,则尽早停止是没有问题的。默认参数就可以解决问题。

此外,如果您有很多(+50)个时期,请尝试绘制历史记录以获取见识。

赞:

hist = model.fit(...)
plt.plot(hist.history['loss'])

如果行末尾跳动,则可能需要EarlyStopping甚至是Learning rate decay

请问我是否还有其他含糊之处。 干杯。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。