我正在训练一种无监督的NN模型,由于某种原因,在恰好一个时期(80步)之后,该模型停止学习。 ] 您是否知道为什么会发生这种情况,我应该怎么做才能防止这种情况发生?
这是有关我的NN的更多信息:
我有一个深层次的NN试图解决优化问题。我的损失函数是自定义的,它是优化问题中的目标函数。
因此,如果我的优化问题是k = open ("key.bin", "rb")
t = open ("text.bin", "rb")
k.seek(0); t.seek(0); position = 0
while 1:
offset = k.read(1)
mask = bytes(chr(k.read(2)[1]),'utf8')
print(str(mask))
if not offset:
break
if not mask:
break
shift=int(ord(offset))
print(shift)
position = position + shift
t.seek(position)
a = t.read(1)
output = (ord(mask)^ord(a))
print (chr(output), end="")
k.close() ; d.close()
,现在在我的DNN min f(x) ==> loss
中。我有64个输入,64个输出,介于两者之间:
loss = f(x)
最后一层是:
self.l1 = nn.Linear(input_size, hidden_size)
self.relu1 = nn.LeakyReLU()
self.BN1 = nn.BatchNorm1d(hidden_size)
扩展我的网络。 拥有更多的层和节点(两倍:每200个节点8层),我可以朝着更低的误差获得更多的进步,但是经过100步的训练误差又变得平坦了!
答案 0 :(得分:0)
症状是训练损失相对较早地停止改善。假设您的问题是完全可以学习的,则出现这种现象的原因很多。以下是最相关的:
因此,您可能要从所有图像中减去平均值(例如,从3个通道中的每个通道中减去127.5)。缩放以使每个通道的单位标准偏差也可能会有所帮助。
网络的泛化能力:网络并不复杂 或足够深的任务。
这很容易检查。您只需几个培训网络 图片(例如3到10)。网络应该能够适应 数据并导致损失几乎为零。如果不是这种情况,则可能 必须添加更多的层,例如使用1个以上的密集层。
另一个好主意是使用预先训练的砝码(在Keras文档的应用程序中)。您可以调整顶部的密集层以适合您的问题。
权重初始化不正确。重量初始化不当会 阻止网络融合(https://youtu.be/gYpoJMlgyXA, 和以前一样的视频。
对于ReLU激活,您可能需要使用He初始化 而不是默认的Glorot初始化。我发现这可能是 有时但并非总是必要。
最后,您可以使用Keras调试工具,例如keras-vis,keplr-io,deep-viz-keras。它们对于打开卷积网络的黑匣子非常有用。
我遇到了同样的问题,然后遵循以下规定: 看完博客文章后,我设法确定我的问题是由标签的编码引起的。最初,我将它们作为一键编码,看起来像[[0,1],[1,0],[1,0]],在博客文章中它们的格式为[0 1 0 0 1]。更改标签并使用二进制交叉熵已经使我的模型可以正常工作。感谢Ngoc Anh Huynh和rafaelvalle!