当前位置: 首页 > 知识库问答 >
问题:

val_loss没有改善从inf损失:南错误而训练

乜华翰
2023-03-14

当我开始训练我的模型时,出现了一个问题。该错误表示val_损失没有从inf和loss:nan得到改善。一开始我以为这是因为学习率,但现在我不确定这是什么,因为我尝试了几种不同的学习率,但没有一种对我有效。我希望有人能帮助我。

我的首选项optimizer=adam,学习率=0.01(我已经尝试了一系列不同的学习率,例如:0.0005、0.001、0.00146、0.005、0.5、0.6、0.7、0.8,但这些都不适用于我)EarlyStop=enabled(训练正在停止,因为在第3纪元出现了提前停止,因为没有任何改进。我还禁用了每次模型在第3纪元停止训练时的提前停止,并让它在未启用提前停止的情况下创建100个纪元。)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'])

共有1个答案

傅元章
2023-03-14

很少有评论。。。

在这种情况下,最好采用试错法。看起来你的参数在训练时出现了偏差。很多可能性可能是问题所在。此外,你似乎也在规范你的人际网络(辍学、BatchNorm等)

  • 在馈入网络之前将输入数据规范化
  • 注释掉/删除所有的退出(正则化)/kernel_initializer(使用默认初始化)/提前停止等,你正在使用从你的首选项,并让网络是一个简单的CNN网络,只有conv层,池,batch规范和密集层。如果你看到了改进,然后开始一个接一个地取消评论,你就会明白是什么导致了问题。
  • 尝试在密集层中使用更大的单位,例如1000,因为密集层提取了CNN层压缩的所有(图像特征)。
 类似资料:
  • 关于使用Lenet5网络解释MNIST上某些优化器的性能,我有几个问题,以及验证损失/精度与训练损失/精度图确切地告诉我们什么。因此,所有的事情都是在Keras中使用标准的LeNet5网络完成的,它运行了15个历元,批处理大小为128。 有两个图,列车acc vs val acc和列车损失vs val损失。我生成了4个图,因为我运行了两次,一次是validation_split=0.1,一次是va

  • 问题内容: 我有一个“一键编码”(全1和全0)的数据矩阵,具有260,000行和35列。我正在使用Keras训练简单的神经网络来预测连续变量。组成网络的代码如下: 但是,在训练过程中,我看到损失下降得很好,但是在第二个时期的中间,它就变成了nan: 我尝试使用代替,尝试替代,尝试使用和不使用辍学,但都无济于事。我尝试使用较小的模型,即仅具有一个隐藏层,并且存在相同的问题(在不同的点它变得很困难)。

  • 我为文本分类问题设计了一个网络。为此,我使用huggingface transformet的BERT模型,上面有一个线性层进行微调。我的问题是训练集上的损失在减少,这很好,但是当涉及到在开发集上的每个时代之后进行评估时,损失会随着时代而增加。我正在发布我的代码来调查它是否有问题。 下面是训练器文件,我使用它对给定批次进行前向传递,然后相应地反向传播。 最后,以下是我的模型(即分类器)类: 为了可视

  • 问题内容: 我是tensorflow和Machine Learning的新手。最近,我正在制作模型。我的模特如下 字符级嵌入向量->嵌入查找-> LSTM1 字级嵌入向量->嵌入查找-> LSTM2 [LSTM1 + LSTM2]->单层MLP-> softmax层 [LSTM1 + LSTM2]->单层MLP-> WGAN鉴别器 他的模型代码 当我使用此模型时,出现以下错误。我以为我的批次太大了

  • 问题内容: 我正在看TensorFlow“ MNIST对于ML初学者”教程,我想在每个训练步骤之后打印出训练损失。 我的训练循环目前看起来像这样: 现在,定义为: 我要打印的损失在哪里: 一种打印方式是在训练循环中显式计算: 我现在有两个问题: 鉴于已经在期间进行了计算,因此将其计算两次效率低下,这需要所有训练数据的前向通过次数的两倍。有没有一种方法可以访问在计算期间的value ? 我如何打印?

  • 我正在使用JVMTI代理进行动态字节码检测。我必须测试那些“热”的方法,即调用JIT编译器的方法。为此,我监听,并在其回调函数中调用。这反过来对包含“hot”函数的类调用,然后开始实际的检测。 目前,我正在安装我的类来生成一些线程。我也听线程启动和打印他们在我的代理。在类加载时使用简单的(不使用),我的插装可以完美地工作并生成新的线程。当在类加载时仪器时,我得到以下输出: 当我通过调用和来检测类文