【问题标题】:Neural Network Using ReLU Activation Function使用 ReLU 激活函数的神经网络
【发布时间】:2021-02-10 22:09:09
【问题描述】:

我正在尝试使用神经网络来预测房价。这是数据集顶部的样子:

    Price   Beds    SqFt    Built   Garage  FullBaths   HalfBaths   LotSqFt
    485000  3       2336    2004    2       2.0          1.0        2178.0
    430000  4       2106    2005    2       2.0          1.0        2178.0
    445000  3       1410    1999    1       2.0          0.0        3049.0

...

我正在尝试使用 ReLU 激活函数,但即使在 100 个 epoch 之后我的准确度也为零。我在这里遗漏了什么吗?

X = dataset[:,1:8] #predictor variables
Y = dataset[:,0] #sell price

#Normalize data
from sklearn import preprocessing
X_scale = min_max_scaler.fit_transform(X)
X_scale

#Split Data
from sklearn.model_selection import train_test_split
X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(X_scale, Y, test_size=0.3)
X_val, X_test, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size=0.5)
print(X_train.shape, X_val.shape, X_test.shape, Y_train.shape, Y_val.shape, Y_test.shape)
  • 实施模型
from keras.models import Sequential
from keras.layers import Dense

model = Sequential(
    Dense(32, activation='relu', input_shape=(7,)))

model.compile(optimizer='sgd',
              loss='binary_crossentropy',
              metrics=['accuracy'])

hist = model.fit(X_train, Y_train,
          batch_size=32, epochs=100,
          validation_data=(X_val, Y_val))

model.evaluate(X_test, Y_test)[1]
## Output: 3/3 [==============================] - 0s 3ms/step - loss: -5698781.5000 - accuracy: 0.0000e+00

【问题讨论】:

    标签: python-3.x tensorflow keras neural-network relu


    【解决方案1】:

    你正在解决一个回归问题,

    所以你应该使用均方作为损失函数...

    而且您正在尝试预测一个值,因此您应该再添加一层来输出该值。

    【讨论】:

    • 另一层输出值?我该怎么做?
    • 如前所述,最后一层将是 tf.keras.layers.Dense(1),一个值作为输出,激活是线性的。也显示为 Timbus 上面发布的答案
    【解决方案2】:

    您的准确度为 0,因为您忘记添加输出层,因此您的损失计算不正确。除此之外,准确性不是相关指标,因为您正在进行回归而不是分类。

    你需要像这样修改你的模型:

    model = Sequential(
        Dense(32, activation='relu', input_shape=(7,)),
        Dense(1, activation='linear'))
    

    此外,在您的 model.compile() 中,您必须将损失修改为“mse”而不是“binary_crossentropy”,因为您正在进行回归而不是分类。

    model.compile(optimizer='sgd',
                  loss='mse',
                  metrics=['mean_squared_error'])
    

    【讨论】: