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

在克拉斯,损失似乎与学习率成正比

池麒
2023-03-14

我正在Keras的MNIST数据集上训练一个简单的神经网络,其中包含一个密集层。

这是代码:

model = Sequential()
model.add(Input(shape=(28, 28)))
model.add(Flatten())
model.add(Dense(10, activation='sigmoid'))

model.compile(
    optimizer=tf.keras.optimizers.SGD(learning_rate=0.01),
    loss='categorical_crossentropy',
    metrics=['accuracy']
)

history = model.fit(x_train, y_train, validation_data=(x_test, y_test), batch_size=32, epochs=10)

这是学习率为0.01时的输出:

Epoch 1/10
1875/1875 [==============================] - 2s 946us/step - loss: 315.4696 - accuracy: 0.8432 - val_loss: 195.9139 - val_accuracy: 0.8957
Epoch 2/10
1875/1875 [==============================] - 2s 877us/step - loss: 263.0978 - accuracy: 0.8674 - val_loss: 233.7138 - val_accuracy: 0.8782
Epoch 3/10
1875/1875 [==============================] - 2s 889us/step - loss: 251.8907 - accuracy: 0.8730 - val_loss: 208.0299 - val_accuracy: 0.8906
Epoch 4/10
1875/1875 [==============================] - 2s 882us/step - loss: 246.9039 - accuracy: 0.8754 - val_loss: 229.8979 - val_accuracy: 0.8937
Epoch 5/10
1875/1875 [==============================] - 2s 876us/step - loss: 234.6116 - accuracy: 0.8786 - val_loss: 263.7991 - val_accuracy: 0.8682
Epoch 6/10
1875/1875 [==============================] - 2s 942us/step - loss: 239.2780 - accuracy: 0.8781 - val_loss: 217.1707 - val_accuracy: 0.8892
Epoch 7/10
1875/1875 [==============================] - 2s 943us/step - loss: 235.9433 - accuracy: 0.8805 - val_loss: 233.0448 - val_accuracy: 0.8926
Epoch 8/10
1875/1875 [==============================] - 2s 941us/step - loss: 237.9058 - accuracy: 0.8812 - val_loss: 229.1561 - val_accuracy: 0.8912
Epoch 9/10
1875/1875 [==============================] - 2s 888us/step - loss: 235.2525 - accuracy: 0.8826 - val_loss: 318.9307 - val_accuracy: 0.8683
Epoch 10/10
1875/1875 [==============================] - 2s 885us/step - loss: 238.1098 - accuracy: 0.8810 - val_loss: 275.0455 - val_accuracy: 0.8809

这是0.03时的输出,所有其他超参数都是固定的:

Epoch 1/10
1875/1875 [==============================] - 2s 1ms/step - loss: 931.7540 - accuracy: 0.8417 - val_loss: 618.5505 - val_accuracy: 0.8952
Epoch 2/10
1875/1875 [==============================] - 2s 945us/step - loss: 767.9313 - accuracy: 0.8701 - val_loss: 618.2877 - val_accuracy: 0.8940
Epoch 3/10
1875/1875 [==============================] - 2s 892us/step - loss: 756.3298 - accuracy: 0.8730 - val_loss: 847.1705 - val_accuracy: 0.8582
Epoch 4/10
1875/1875 [==============================] - 2s 956us/step - loss: 739.8559 - accuracy: 0.8748 - val_loss: 687.9159 - val_accuracy: 0.8901
Epoch 5/10
1875/1875 [==============================] - 2s 888us/step - loss: 731.3071 - accuracy: 0.8760 - val_loss: 693.1130 - val_accuracy: 0.8942
Epoch 6/10
1875/1875 [==============================] - 2s 877us/step - loss: 728.4488 - accuracy: 0.8787 - val_loss: 685.3834 - val_accuracy: 0.8841
Epoch 7/10
1875/1875 [==============================] - 2s 878us/step - loss: 712.8240 - accuracy: 0.8798 - val_loss: 640.9078 - val_accuracy: 0.8972
Epoch 8/10
1875/1875 [==============================] - 2s 890us/step - loss: 693.1299 - accuracy: 0.8811 - val_loss: 657.0080 - val_accuracy: 0.8902
Epoch 9/10
1875/1875 [==============================] - 2s 884us/step - loss: 700.5771 - accuracy: 0.8803 - val_loss: 739.0408 - val_accuracy: 0.8871
Epoch 10/10
1875/1875 [==============================] - 2s 897us/step - loss: 696.2348 - accuracy: 0.8833 - val_loss: 785.1879 - val_accuracy: 0.8762

我尝试了多次,所以这不是随机的事情。我用RMSprop尝试了同样的结果。

根据我的理解,损失的减少应该与学习率成正比,而不是损失本身。

这是否与Keras如何以某种方式计算损失函数有关?

共有1个答案

章德惠
2023-03-14

您的代码有两个问题:

  1. learning_rate。它肯定太高了,因此出现了发散。M.Chak的观察非常好,当您到达具有更高梯度的点时,您会创建一个正反馈外观,因此观察到损失*k=learning_rate*k
  2. 您使用带有10个类的sigmoid进行多类分类。在这种情况下,您必须使用model.add(Dense(10,激活='softmax'))
 类似资料:
  • 我正在尝试使用ScalaTest和ScalaCheck进行基于属性的测试。我的测试概述如下: 现在我看到的是,如果我一遍又一遍地运行PropSpec1中的测试,有时第二个测试会通过,但大多数时候会失败。现在,如果0没有被b测试,那么很明显它会通过,但我认为这是它会一直尝试的事情之一。重复运行sbt clean test时,我看到了相同的行为;有时两项测试都通过了。 这对于基于属性的测试是正常的吗,

  • 我计划通过存储某种可以在JS中生成的校验和来实现一个解决方案,以确保数据完全存在。如果没有,则清除它并从服务器中取出。

  • #24届软开秋招面试经验大赏# 认准拉普拉斯,秋招必上岸 就业咨xun可私。 荣耀的面试体验真的很不错,面试官都是用“您”提问。而且面试过程也挺像唠嗑,还是很舒服的。 之前听说荣耀要变成国企,还有说要单独上市的,也不知道谁说得对。 整体来看,面试难度不高,而且今年好像给的很大方。 面了半小时,难度两颗星。 1 自我介绍 2 实习介绍 项目介绍 科研介绍 3 讲一下科研,挺感兴趣这个东西 4 说一下

  • #24届软开秋招面试经验大赏# 认准拉普拉斯,秋招必上岸 就业zixun可私。 荣耀一共就两轮面试,而且也没考coding。每轮都是半小时左右。去面试间等着叫号,还是体验挺好的。 出结果也挺快的,不像华子那么能泡。 二面应该是主管面了。 面试时间半小时,难度一颗星。 1 自我介绍 2 实习介绍 项目介绍 科研介绍 3 平时喜欢看哪方面的论文,分享一个。 4 看我实习挺多,方向是怎么选的,有没有什么

  • 也许这是一个过于笼统的问题,但谁能解释什么会导致卷积神经网络发散? 规格: 我正在使用Tensorflow的iris_training模型和我自己的一些数据,并不断获得 错误:张量流:模型因损失=NaN而发散。 追踪。。。 tensor flow . contrib . learn . python . learn . monitors . nanlosduring training error:

  • 我有我的项目在Android Studio工作正常,但然后: 我已升级到视窗 10 这破坏了我的java安装,但我现在也可以使用它(删除了所有内容,然后重新安装) 我现在也升级到了最新的稳定Android Studio 但是当我现在尝试构建我项目时,我得到了100个错误: W:\android-studio-projects\mycustomer\app\build\intermediates\e