我在开始训练模型时遇到了一个问题。这个错误表明val_loss没有从inf和loss:nan中得到改善。一开始我以为这是因为学习率,但现在我不确定是什么,因为我尝试了几种不同的学习率,都不适用。我希望有人能帮助我。
我的偏好优化器=adam,学习率=0.01(我已经尝试了很多不同的学习率,例如:0.0005、0.001、0.00146、0.005、0.5、0.6、0.7、0.8,但这些都不适用于我(EarlyStoping=已启用(由于在epoch 3停止EarlyStoping,训练正在停止,因为没有任何改进。我还禁用了EarlyStop,每次模型在epoch3停止训练时,让它在不启用EarlySTOPing的情况下生成100个epoch。(ReduceLR=已禁用
关于我尝试训练我的模型我尝试在我的gpu(EVGA RTX 3080 FTW3 ULTRA(上训练这个模型
model = Sequential()
model.add(Conv2D(32,(3,3),padding='same',kernel_initializer='he_normal',input_shape=(img_rows, img_cols,1)))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(Conv2D(32,(3,3),padding='same',kernel_initializer='he_normal',input_shape=(img_rows,img_cols,1)))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(64,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(Conv2D(64,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(128,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(Conv2D(128,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Conv2D(256,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(Conv2D(256,(3,3),padding='same',kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(MaxPooling2D(pool_size=(2,2)))
model.add(Dropout(0.2))
model.add(Flatten())
model.add(Dense(64,kernel_initializer='he_normal'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(64,kernel_initializer='he_normal'))
model.add(Activation('elu'))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Dense(num_classes,kernel_initializer='he_normal'))
model.add(Activation('softmax'))
print(model.summary())
from keras.optimizers import RMSprop,SGD,Adam
from keras.callbacks import ModelCheckpoint,EarlyStopping,ReduceLROnPlateau
checkpoint = ModelCheckpoint('Wave.h5',
monitor='val_loss',
mode='min',
save_best_only=True,
verbose=1)
earlystop = EarlyStopping(monitor='val_loss',
min_delta=0,
patience=3,
verbose=1,
restore_best_weights=True)
'''reduce_lr = ReduceLROnPlateau(monitor='val_loss',
factor=0.2,
patience=3,
verbose=1,
min_delta=0.0001)'''
callbacks = [earlystop,checkpoint] #reduce_lr
model.compile(loss='categorical_crossentropy',
optimizer= Adam(lr=0.01),
metrics=['accuracy'])
为遇到同样问题的我找到了问题。问题是我的train/val集合中有nan/inf值。这些值是由df.pct_change()
函数为某些特定数据集创建的。
如果要规范化值,请确保用于规范化值的边界不是nan/inf。
很少有评论
在这种情况下,最可取的方法是试错法。在训练中,你的参数似乎出现了偏差。很多可能性可能是个问题。此外,你似乎也在规范你的网络(辍学、BatchNorm等(
建议:
- 在输入网络之前规范化输入数据
- 注释掉/删除您偏好中使用的所有退出(正则化(/kernel_initializer(使用默认初始化(/提前停止等,并让网络成为一个只有conv层、池化、批处理规范和密集层的普通CNN网络。如果您看到改进,然后开始逐个取消注释,您就会了解问题的原因
- 尝试在密集层中使用较大的单位,例如1000,因为密集层提取CNN层压缩的所有内容(图像特征(