【问题标题】:How to predict a function/table using Keras?如何使用 Keras 预测函数/表?
【发布时间】:2019-10-12 07:02:12
【问题描述】:

我目前正在学习 keras。我的目标是创建一个简单的模型来预测函数的值。首先,我创建了两个数组,一个用于 X 值,一个用于相应的 Y 值。

# declare and init arrays for training-data
X = np.arange(0.0, 10.0, 0.05)
Y = np.empty(shape=0, dtype=float)

# Calculate Y-Values
for x in X:
    Y = np.append(Y, float(0.05*(15.72807*x - 7.273893*x**2 + 1.4912*x**3 - 0.1384615*x**4 + 0.00474359*x**5)))

然后我创建并训练模型

# model architecture
model = Sequential()
model.add(Dense(1, input_shape=(1,)))
model.add(Dense(5))
model.add(Dense(1, activation='linear'))

# compile model
model.compile(loss='mean_absolute_error', optimizer='adam', metrics=['accuracy'])

# train model
model.fit(X, Y, epochs=150, batch_size=10)

并使用模型预测值

# declare and init arrays for prediction
YPredict = np.empty(shape=0, dtype=float)

# Predict Y
YPredict = model.predict(X)

# plot training-data and prediction
plt.plot(X, Y, 'C0')
plt.plot(X, YPredict, 'C1')

# show graph
plt.show()

我得到这个输出(蓝色是训练数据,橙色是预测):

我做错了什么?我猜这是网络架构的根本问题,对吧?

【问题讨论】:

    标签: python machine-learning keras neural-network


    【解决方案1】:

    问题确实出在您的网络架构上。具体来说,您在所有层中都使用线性激活:这意味着网络只能拟合线性函数。你应该在输出层保持线性激活,但你应该在隐藏层使用 ReLU 激活:

    model.add(Dense(1, input_shape=(1,)))
    model.add(Dense(5, activation='relu'))
    model.add(Dense(1, activation='linear'))
    

    然后,使用隐藏层的数量/大小;我建议你多用几个。

    【讨论】:

      【解决方案2】:

      在黑熊提供的答案之上:

      • 在将输入 X 和输出 Y 输入神经网络之前,您应该标准化

        # Feature Scaling (ignore possible warnings due to conversion of integers to floats)
        from sklearn.preprocessing import StandardScaler
        
        sc_X = StandardScaler()
        X_train = sc_X.fit_transform(X)
        
        sc_Y = StandardScaler()
        Y_train = sc_Y.fit_transform(Y)
        
        # [...]
        model.fit(X_train, Y_train, ...)
        

        请参阅this answer 以了解如果您不这样做会发生什么,在与您的回归设置非常相似的情况下。请记住,您应该使用sc_X 类似地缩放任何测试数据;此外,如果您稍后需要将模型生成的任何 predictions 缩放回 Y 的原始比例,您应该使用

        sc_Y.inverse_transform(predictions)
        
      • 在像您这样的回归设置中,准确性没有任何意义;你应该从你的模型编译中删除metrics=['accuracy'](损失本身作为一个指标就足够了)

      【讨论】:

        猜你喜欢
        • 2020-10-30
        • 2019-11-21
        • 2019-06-07
        • 2017-10-23
        • 2021-07-07
        • 2020-06-28
        • 2018-03-03
        • 2020-04-06
        • 2018-09-24
        相关资源
        最近更新 更多