Neural network I';我得到的这个keras神经网络的准确率为0%

Neural network I';我得到的这个keras神经网络的准确率为0%,neural-network,deep-learning,keras,mnist,Neural Network,Deep Learning,Keras,Mnist,我试图对MNIST数据集的子集进行二元分类。目标是预测一个样本是6还是8。因此,每个样本有784个像素特征,数据集中有8201个样本。我构建了一个由一个输入层、两个隐藏层和一个输出层组成的网络。我使用sigmoid作为激活函数来输出图层和隐藏图层的relu。我不知道为什么我最终得到了0%的准确率 #导入库 从keras.models导入顺序 从keras.layers导入稠密 作为pd进口熊猫 将numpy作为np导入 从sklearn.model\u选择导入列车\u测试\u拆分 导入操作系统

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

#导入库
从keras.models导入顺序
从keras.layers导入稠密
作为pd进口熊猫
将numpy作为np导入
从sklearn.model\u选择导入列车\u测试\u拆分
导入操作系统
np.随机种子(7)
chdir('C:/Users/olivi/Documents/Python workspace')
#数据加载
数据=pd.read\u csv('MNIST\u CV.csv')
#Y目标标签
Y=data.iloc[:,0]
#十:特点
X=data.iloc[:,1:]
X_序列,X_测试,y_序列,y_测试=序列测试分割(X,y,测试大小=0.25,随机状态=42)
#创建模型
模型=顺序()
添加(密集型(392,内核初始化器='normal',输入尺寸=784,
激活(='relu'))
添加(稠密(196,内核初始化器='normal',激活='relu'))
添加(稠密(98,内核初始化器='normal',激活='relu'))
model.add(密集型(1,激活='sigmoid'))
compile(loss='binary\u crossentropy',optimizer='adam',metrics=['accurity'])
model.summary()
#训练模型
模型拟合(X\U系列,y\U系列,历代=100,批量=50)
打印(模型预测(X_检验,批量=50))
分数=模型评估(X_检验、y_检验)
打印(“\n测试精度:”,分数[1])

选择MNIST的子集后,您必须确定样本中有多少不同类别的数字(包括训练集和测试集)

因此:

然后您应该对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的位置,选择此子样本并测试您的准确性。

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


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

非常感谢您,克拉伦斯!正如你提到的,我把6和8作为目标标签。我将所有内容转换为0(6个标签)或1(8个标签),效果非常好。现在我有96.78%的准确率。
model.predict_classes(X_test,batch_size= 50)