【问题标题】:keras MLP accuracy zerokeras MLP 精度为零
【发布时间】:2023-03-29 00:46:01
【问题描述】:

以下是我的MLP模型,

layers = [10,20,30,40,50]
model = keras.models.Sequential()
#Stacking Layers
model.add(keras.layers.Dense(layers[0], input_dim = input_dim, activation='relu'))
#Defining the shape of input
for layer in layers[1:]:
    model.add(keras.layers.Dense(layer, activation='relu'))
    #Layer activation function
# Output layer
model.add(keras.layers.Dense(1, activation='sigmoid'))
#Pre-training
model.compile(loss = 'binary_crossentropy', optimizer = 'adam', metrics = ['accuracy'])
#Training
model.fit(train_set, test_set, validation_split = 0.10, epochs = 50, batch_size = 10, shuffle = True, verbose = 2)
# evaluate the network
loss, accuracy = model.evaluate(train_set, test_set)
print("\nLoss: %.2f, Accuracy: %.2f%%" % (loss, accuracy*100))
#predictions
predt = model.predict(final_test)
print(predt)

问题是,准确率总是0,错误日志如图,

Epoch 48/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
Epoch 49/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
Epoch 50/50 - 0s - loss: 1.0578 - acc: 0.0000e+00 - val_loss: 0.4885 - val_acc: 0.0000e+00 
2422/2422 [==============================] - 0s 17us/step

损失:1.00,准确度:0.00%

按照建议,我已将学习信号从 -1,1 更改为 0,1,但以下是错误日志

Epoch 48/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
Epoch 49/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
Epoch 50/50 - 0s - loss: 8.5879 - acc: 0.4672 - val_loss: 8.2912 - val_acc: 0.4856 
2422/2422 [==============================] - 0s 19us/step

【问题讨论】:

  • 数据是什么样的?
  • 有开盘、高盘、低盘、收盘数据,输出学习信号为-1和+1
  • 我认为目标值应该是 0/1 而不是 -1/+1。
  • 我试过了,又贴了一个错误日志。
  • 尝试将您的优化器更改为另一个,例如 adadelta,它们传递的不同参数(如学习率)可能会帮助您的模型更快地收敛。

标签: python machine-learning neural-network keras


【解决方案1】:

您的代码很难阅读。这不是编写 Keras 模型的推荐标准。试试这个,让我们知道你得到了什么。假设 X 是一个矩阵,其中行是实例,列是特征。 Y是标签

您需要按照使用 TensorFlow 后端时的说明添加通道作为最后一个维度。此外,标签应分成 2 个节点,以获得更好的成功机会。与使用具有 2 个节点的概率输出相比,单个神经元映射通常不太成功。

n = 1000         # Number of instances
m = 4            # Number of features
num_classes = 2  # Number of output classes

... # Your code for loading the data

X = X.reshape(n, m,) 
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.33)

y_train = keras.utils.to_categorical(y_train, num_classes)
y_test = keras.utils.to_categorical(y_test, num_classes)

构建您的模型。最后一层应该使用 sigmoid 或 softmax 进行分类任务。尝试使用 Adadelta 优化器,它已被证明可以通过更有效地遍历梯度并减少振荡来产生更好的结果。我们还将使用交叉熵作为我们的损失函数,这是分类任务的标准。二进制交叉熵也很好。

尝试使用标准模型配置。越来越多的节点实际上并没有多大意义。该模型应该看起来像一个棱镜、一小组输入特征、许多隐藏节点和一小组输出节点。您应该以最少的隐藏层为目标,使层更厚,而不是添加层。

input_shape = (m,)

model = Sequential()
model.add(Dense(32, activation='relu', input_shape=input_shape))
model.add(Dense(64, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer=keras.optimizers.Adadelta(),
              metrics=['accuracy'])

您可以使用以下方法获得模型的摘要

model.summary()

训练你的模型

epochs = 100
batch_size = 128
# Fit the model weights.
history = model.fit(x_train, y_train,
          batch_size=batch_size,
          epochs=epochs,
          verbose=1,
          validation_data=(x_test, y_test))

查看训练期间发生的事情

plt.figure(figsize=(8,10))
plt.subplot(2,1,1)

# summarize history for accuracy
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('model accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='lower right')

plt.subplot(2,1,2)
# summarize history for loss
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'validation'], loc='upper right')
plt.show()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-08
    • 2016-09-09
    • 2019-08-28
    • 2018-04-17
    相关资源
    最近更新 更多