仅供参考:我已经上传了你需要的所有文件来自己测试(数据 + 一个简化的脚本)。
这是我的问题:我尝试训练一个非常简单的模型,该模型使用四个输入值x(0), x(1), x(2), x(3)来预测值x(4),即y = x(4)。
然而,我修改了数据,使得y = x(4)成为一个完美的线性外推:y = x(3) + (x(3)-x(2))
我使用的模型是一个单一的密集层,包含四个神经元。权重“0 0 -1 2”将是一个完美的解决方案(损失为“0”)。
然而,我无法使其达到这些值。
你能帮我解决这个问题,或者告诉我为什么会这样吗?
文件在这里:https://ufile.io/5d2t4
主要脚本(带有人工数据):
import numpy as npimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Flatten, Densefrom keras.optimizers import Adadelta, Adamimport keras.backend as Kdef root_mean_squared_error(y_true, y_pred): return K.sqrt( K.mean( K.square( y_pred - y_true ) ) )X_train = np.random.random(240000*4)X_train = np.reshape( X_train, ( 240000, 1, 4 ) )# 预测y_train的梯度y_train = X_train[:,0,3] - X_train[:,0,2]inputShape = ( X_train.shape[1], X_train.shape[2] )# 创建模型model = Sequential()model.add( Flatten( input_shape=inputShape ) )model.add( Dense( 1 ) )model.compile( loss=root_mean_squared_error, optimizer=Adam( decay = 0.1 ) )# 训练模型batchSize = 8model.fit( X_train, y_train, nb_epoch=10, batch_size=batchSize, shuffle=True )y_train_predicted = model.predict( X_train)y_train_predicted = np.asarray(y_train_predicted).ravel()y_train_predicted_rmse = np.sqrt( np.mean( np.square( y_train_predicted - y_train ) ) )print( "y_train RMSE = " + str( y_train_predicted_rmse ) )
回答:
当我的“明显”的模型无法收敛时,我首先问自己的问题是超参数是否合适。
我调整了你的代码来修正学习率。我移除了衰减,并添加了0.01的学习率,而不是默认的0.001(见https://keras.io/optimizers/)。一个epoch后的结果权重是
[ 9.3402149e-04], [ 5.8139337e-04], [-9.9929601e-01], [ 1.0009530e+00]
这大致符合我们在代码中设置的值。
[0, 0, -1, 1]
如果你只是保持默认的学习率(0.001)而不使用衰减,它也能正常工作。请查看下面的工作代码。
import numpy as npimport matplotlib.pyplot as pltfrom keras.models import Sequentialfrom keras.layers import Flatten, Densefrom keras.optimizers import Adadelta, Adamimport keras.backend as Kdef root_mean_squared_error(y_true, y_pred): return K.sqrt( K.mean( K.square( y_pred - y_true ) ) )X_train = np.random.random(240000*4)X_train = np.reshape( X_train, ( 240000, 1, 4 ) )y_train = X_train[:,0,3] - X_train[:,0,2]inputShape = ( X_train.shape[1], X_train.shape[2] )# 创建模型model = Sequential()model.add( Flatten( input_shape=inputShape ) )model.add( Dense( 1 ) )model.compile( loss=root_mean_squared_error, optimizer=Adam( lr=0.01 ) )# 训练模型batchSize = 8model.fit( X_train, y_train, nb_epoch=1, batch_size=batchSize, shuffle=True )y_train_predicted = model.predict( X_train)y_train_predicted = np.asarray(y_train_predicted).ravel()y_train_predicted_rmse = np.sqrt( np.mean( np.square( y_train_predicted - y_train ) ) )print( "y_train RMSE = " + str( y_train_predicted_rmse ) )x = [model.layers]x[0][1].get_weights()