我在 Keras 中设置了一个学习率调度器,使用历史损失作为 self.model.optimizer.lr 的更新器,但是 self.model.optimizer.lr 上的值没有被插入到 SGD 优化器中,优化器是使用默认学习率。代码是:
from keras.models import Sequential
from keras.layers import Dense, Dropout, Activation
from keras.optimizers import SGD
from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.preprocessing import StandardScaler
class LossHistory(keras.callbacks.Callback):
def on_train_begin(self, logs={}):
self.losses = []
self.model.optimizer.lr=3
def on_batch_end(self, batch, logs={}):
self.losses.append(logs.get('loss'))
self.model.optimizer.lr=lr-10000*self.losses[-1]
def base_model():
model=Sequential()
model.add(Dense(4, input_dim=2, init='uniform'))
model.add(Dense(1, init='uniform'))
sgd = SGD(decay=2e-5, momentum=0.9, nesterov=True)
model.compile(loss='mean_squared_error',optimizer=sgd,metrics['mean_absolute_error'])
return model
history=LossHistory()
estimator = KerasRegressor(build_fn=base_model,nb_epoch=10,batch_size=16,verbose=2,callbacks=[history])
estimator.fit(X_train,y_train,callbacks=[history])
res = estimator.predict(X_test)
使用 Keras 作为连续变量的回归器一切正常,但我想通过更新优化器学习率来获得更小的导数。
原文由 razimbres 发布,翻译遵循 CC BY-SA 4.0 许可协议
谢谢,我找到了替代解决方案,因为我没有使用 GPU:
输出是(lr是学习率):
这就是学习率在各个时期发生的情况: