【问题标题】:I'm getting a 0% accuracy for this keras neural network我得到这个 keras 神经网络的 0% 准确率
【发布时间】:2018-05-06 15:41:56
【问题描述】:

我正在尝试对 MNIST 数据集的子集进行二进制分类。目标是预测样本是 6 还是 8。因此,每个样本有 784 个像素特征,数据集中有 8201 个样本。我构建了一个包含一个输入层、两个隐藏层和一个输出层的网络。我使用 sigmoid 作为输出层的激活函数和隐藏层的 relu。我不知道为什么最后我得到了 0% 的准确率。

#import libraries
from keras.models import Sequential
from keras.layers import Dense
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
import os
np.random.seed(7)

os.chdir('C:/Users/olivi/Documents/Python workspace')

#data loading
data = pd.read_csv('MNIST_CV.csv')

#Y target label
Y = data.iloc[:,0]

#X: features
X = data.iloc[:,1:]

X_train, X_test, y_train, y_test = train_test_split(X, Y,test_size=0.25,random_state=42)

# create model
model = Sequential()
model.add(Dense(392,kernel_initializer='normal',input_dim=784, 
activation='relu'))
model.add(Dense(196,kernel_initializer='normal', activation='relu'))
model.add(Dense(98,kernel_initializer='normal', activation='relu'))
model.add(Dense(1, activation='sigmoid'))


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


# Training the model
model.fit(X_train, y_train, epochs=100, batch_size=50)

print(model.predict(X_test,batch_size= 50))

score = model.evaluate(X_test, y_test)
print("\n Testing Accuracy:", score[1])

【问题讨论】:

    标签: neural-network deep-learning keras mnist


    【解决方案1】:

    如果您使用二元交叉熵,您的标签应为 0 或 1(分别表示“不是数字 6”或“是数字 6”)。

    如果您现在的 Y 目标标签是值 6 和 8,它将失败。

    【讨论】:

    • 非常感谢克拉伦斯!正如您所提到的,我将 6 和 8 作为目标标签。我将所有内容都转换为 0(6 个标签)或 1(8 个标签),并且效果很好。现在我有 96.78% 的准确率。
    【解决方案2】:

    一旦您选择了 MNIST 的一个子集,您必须确定您的样本(训练集和测试集)中有多少不同类别的数字。

    所以:

    classes=len(np.unique(Y))
    

    那么你应该对 Y 进行热编码:

    Y_train = np_utils.to_categorical(y_train, classes)
    Y_test = np_utils.to_categorical(y_test, classes)
    

    之后,将神经网络的最后一层更改为:

    model.add(Dense(classes, activation='sigmoid'))
    

    最后:

    model.predict_classes(X_test,batch_size= 50)
    

    确保训练集和测试集的 Y 类数量相同。

    预测后,使用 np.where() 找到 6 和 8 的位置,选择此子样本并测试您的准确性。

    【讨论】:

      猜你喜欢
      • 2019-06-13
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      • 2020-05-15
      • 1970-01-01
      • 2020-07-29
      • 2018-09-11
      相关资源
      最近更新 更多