我正在开发一个神经网络,它在运行过程中出现了问题,大约运行20个周期后,准确率突然急剧下降。我了解到这可能是学习率的问题,通过学习率调度来降低学习率可能是解决方案。我尝试使用Keras LearningRateScheduler
来解决这个问题。我在模型接受新的学习率时遇到了问题。它会在前十个周期正常运行。当第一次改变学习率时,会出现以下错误:ValueError: The output of the "schedule" function should be float.
我尝试使用float()
转换返回值,但没有成功。我找不到任何合理的解释。希望这里有人能帮我解决这个问题。
我使用Google Colab GPU上的Python来进行这个实验。网络的代码如下。如果需要更多信息,请告诉我。
X_train, X_validate, Y_train, Y_validate=train_test_split(X,Y,test_size=0.2)from keras.backend import sigmoiddef swish(x): return (x*sigmoid(x))from keras.utils.generic_utils import get_custom_objectsfrom keras.layers import Activationget_custom_objects().update({'swish': Activation(swish)})model=Sequential()model.add(Dense(1024, activation='swish',input_shape=(6,)))model.add(Dense(512, activation='swish'))model.add(Dense(256, activation='swish'))model.add(Dense(128, activation='swish'))model.add(Dense(64, activation='swish'))model.add(Dense(32, activation='swish'))model.add(Dense(16, activation='swish'))model.add(Dense(10, activation='softmax'))model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])from keras.callbacks import LearningRateSchedulerdef scheduler(epochs, lr): if epochs < 10: return 0.001 elif 10 < epochs < 20: return 0.0005 elif 20 < epochs < 30: return 0.00025 elif 30 < epochs < 50: return 0.000125 elif 50 < epochs < 75: return 0.0000625 elif 75 < epochs: return 0.0000313callback=LearningRateScheduler(scheduler, verbose=1)model.fit(X_train, Y_train, batch_size=75, epochs=50, callbacks=[callback], verbose=1) #Line referenced in errormodel.summary()score=model.evaluate(X_validate, Y_validate, verbose=1)print("The loss and accuracy of the validation set are: "+str(score))x=X_validate[52]y=np.argmax(Y_validate[52])y_pred=model.predict(np.array([x]))y_pred=np.argmax(y_pred)print("For the input data, the known mode is: "+str(y))print("For the input data, the predicted mode is: "+str(y_pred))
回答:
我已经解决了这个问题。返回值不能只是一个学习率的值。相反,它需要传递一个函数。例如:return lr * math.exp(-0.1)
。
此外,学习率调度似乎已经解决了我之前遇到的问题,即准确率突然下降的问题。