我正在尝试训练一个简单的神经网络模型来对图像是否是叉子图片进行分类。我有 400 张图片,它们都很简单,即工具在一张空白页上。所以我正在尝试用神经网络来训练它,但几乎每次它都完全正常,但随后在随机时期会损失,因为 nan 然后我的计算机就会崩溃。
这是我的代码
import numpy as np
import tensorflow as tf
from keras.layers import Dense
from keras import Sequential
from tensorflow.python.keras.losses import BinaryCrossentropy
from keras.optimizers import Adam
from keras.regularizers import l2
imageX = np.load('forkImages.npy')
imageY = np.load('forkY.npy')
print(imageX[0])
print(imageY.shape)
imageX = imageX.astype('float32') /255
print(imageX[0])
model = Sequential([
Dense(units=25,activation='sigmoid',kernel_regularizer=l2(0.0001)),
Dense(units=15,activation='sigmoid',kernel_regularizer=l2(0.0001)),
Dense(units=1,activation='sigmoid',kernel_regularizer=l2(0.0001))
])
model.compile(loss=BinaryCrossentropy(),optimizer=Adam(0.00001))
model.fit(imageX,imageY,epochs=100)
print(imageX.shape[0])
for i in range(imageX.shape[0]):
prediction = model.predict(np.expand_dims(imageX[i],axis=0))
print('Actual: ' + str(imageY[i]) + ', Prediction: ' + str(prediction))
我已经尝试了我能想到的和我在互联网上找到的一切。我将隐藏层的激活更改为“relu”。我尝试过更复杂的模型,比如很多层,每个层中有更多单元。我曾尝试取消所有管制。这些都对我的脚本结果没有任何改变。
我在堆栈溢出上看到了类似的问题,但没有一个答案对我有用。
互联网上有很多很好的猜测,例如这里:使用 Adam 求解器发出 NaN 。在您的情况下,放弃正则化或增加网络规模不太可能有帮助。
我假设您的
imageY
数据是正确的,值在 0 和 1 之间(包含两者)并且不包含任何 NaN。然后我可以认为要么你的权重增长得太高并且 sigmoid 输出太接近 0 或 1,导致交叉熵损失计算中的 NaN(可能是由于数据非常倾斜),或者 Adam 求解器由于某种原因变得不稳定。
对于前一种情况,可以尝试通过加强正则化来防止权重增长过大,即增大
l2
正则化参数的值。
对于第二种情况,您可以尝试设置一些
Adam
稳定性参数,例如设置 clipnorm
或 clipvalue
参数,这些参数会裁剪过大的权重或梯度,或者增加 epsilon
稳定性参数的值。