【问题标题】:Model gives same output, accuracy, loss for all inputs (keras)模型为所有输入(keras)提供相同的输出、准确性和损失
【发布时间】:2019-07-25 11:00:17
【问题描述】:

这是我的 udacity 自动驾驶汽车模型!

model = Sequential()
model.add(Lambda(lambda x: x/127.5-1.0, input_shape=(64,64,3)))
model.add(Conv2D(3, 1, 1, activation="elu"))
model.add(Conv2D(32, 3, 3, activation='elu'))
model.add(Conv2D(32, 3, 3, activation='elu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(64, 3, 3, activation='elu'))
model.add(Conv2D(64, 3, 3, activation='elu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Dropout(0.5))
model.add(Conv2D(128, 3, 3, activation='elu'))
model.add(Conv2D(128, 3, 3, activation='elu'))
model.add(MaxPooling2D((2,2), strides=(2,2)))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(512, activation="elu"))
model.add(Dense(64, activation="elu"))
model.add(Dense(16, activation="elu"))
model.add(Dense(1, activation="softmax"))
model.summary()

我正在使用adam编译器来编译模型

from keras.optimizers import Adam
model.compile(optimizer=Adam(lr=0.0001),loss='mean_squared_error',metrics='accuracy'])
model.fit(X_train, y_train, batch_size=256, epochs=250, shuffle = True,  validation_split=0.2)

我已经尝试了每个批次大小和时代组合,但结果似乎是一样的。我最初拍摄了 12000 张图像来训练和测试模型。我的问题准确性非常低,并且在整个时代都是恒定的。它还为每个预处理图像预测相同的输出。 (ps:我在训练之前已经对图像进行了预处理)。这里的示例输出显示了恒定的准确性和损失(太低了)。

 Train on 8084 samples, validate on 2021 samples
    Epoch 1/250
    8084/8084 [==============================] - 8s 1ms/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 2/250
    8084/8084 [==============================] - 6s 763us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 3/250
    8084/8084 [==============================] - 6s 779us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 4/250
    8084/8084 [==============================] - 6s 779us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 5/250
    8084/8084 [==============================] - 6s 790us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 6/250
    8084/8084 [==============================] - 6s 770us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 7/250
    8084/8084 [==============================] - 6s 739us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 8/250
    8084/8084 [==============================] - 6s 735us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 9/250
    8084/8084 [==============================] - 6s 724us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 10/250
    8084/8084 [==============================] - 6s 727us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015
    Epoch 11/250
    8084/8084 [==============================] - 6s 729us/step - loss: 1.0467 - acc: 0.0014 - val_loss: 1.0666 - val_acc: 0.0015

请帮忙。谢谢

【问题讨论】:

  • 具有一个输出神经元的 Softmax 没有意义,它会给出恒定的 1.0 输出。这个模型、回归或分类的任务是什么?
  • @MatiasValdenegro Regression... 它应该预测在 -1 到 1 范围内的转向角值。您为什么认为该模型具有分类任务?
  • 因为准确率只适用于分类。对于这个范围,你应该在输出端使用一个神经元的 tanh 激活
  • @MatiasValdenegro 是否正确选择了损失函数...由于输出范围很小,因此损失函数的值较小,因此模型可能无法获得正确的损失值。那么你能帮我确定这个模型的损失函数吗?
  • 不,损失函数是正确的。

标签: python tensorflow keras


【解决方案1】:

您的模型没有学到任何东西,因为您使用了带有一个输出神经元的 softmax 激活,这意味着无论权重值如何,输出都是常数 1.0。

您应该将激活更改为双曲正切 (tanh),因为它与您的输出范围 [-1, 1] 匹配。您还应该删除准确度指标,因为它是一个回归任务,准确度仅适用于分类。

【讨论】:

    猜你喜欢
    • 2020-11-15
    • 1970-01-01
    • 2023-03-30
    • 2019-01-10
    • 1970-01-01
    • 2018-09-13
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多