神经网络在简单的线性插值任务上表现不佳

仅供参考:我已经上传了你需要的所有文件来自己测试(数据 + 一个简化的脚本)。

这是我的问题:我尝试训练一个非常简单的模型,该模型使用四个输入值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()

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注