Python Keras神经网络精度仅为10%

Python Keras神经网络精度仅为10%,python,tensorflow,keras,conv-neural-network,mnist,Python,Tensorflow,Keras,Conv Neural Network,Mnist,我正在学习如何在MNIST数据集上训练keras神经网络。然而,当我运行这段代码时,经过10次训练后,我只得到10%的准确率。这意味着神经网络只预测一类,因为有10类。我确信这是数据准备中的一个bug,而不是网络体系结构的问题,因为我从教程()中获得了体系结构。你知道为什么模特不训练吗 我的代码: from skimage import io import numpy as np from numpy import array from PIL import Image import csv i

我正在学习如何在MNIST数据集上训练keras神经网络。然而,当我运行这段代码时,经过10次训练后,我只得到10%的准确率。这意味着神经网络只预测一类,因为有10类。我确信这是数据准备中的一个bug,而不是网络体系结构的问题,因为我从教程()中获得了体系结构。你知道为什么模特不训练吗

我的代码:

from skimage import io
import numpy as np
from numpy import array
from PIL import Image
import csv
import random
from keras.preprocessing.image import ImageDataGenerator
import pandas as pd
from keras.utils import multi_gpu_model
import tensorflow as tf
train_datagen = ImageDataGenerator()
train_generator = train_datagen.flow_from_directory(
    directory="./trainingSet",
    class_mode="categorical",
    target_size=(50, 50),
    color_mode="rgb",
    batch_size=1,
    shuffle=True,
    seed=42
)
print(str(train_generator.class_indices) + " class indices")
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation, Flatten
from keras.layers.convolutional import Conv2D
from keras.layers.pooling import MaxPooling2D, GlobalAveragePooling2D
from keras.optimizers import SGD
from keras import backend as K
from keras.layers import Input
from keras.models import Model
import keras
from keras.layers.normalization import BatchNormalization

K.clear_session()
K.set_image_dim_ordering('tf')
reg = keras.regularizers.l1_l2(1e-5, 0.0)
def conv_layer(channels, kernel_size, input):
    output = Conv2D(channels, kernel_size, padding='same',kernel_regularizer=reg)(input)
    output = BatchNormalization()(output)
    output = Activation('relu')(output)
    output = Dropout(0)(output)
    return output

model = Sequential()
model.add(Conv2D(28, kernel_size=(3,3), input_shape=(50, 50, 3)))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Flatten()) # Flattening the 2D arrays for fully connected layers
model.add(Dense(128, activation=tf.nn.relu))
model.add(Dropout(0.2))
model.add(Dense(10, activation=tf.nn.softmax))


from keras.optimizers import Adam
import tensorflow as tf

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])
from keras.callbacks import ModelCheckpoint

epochs = 10

checkpoint = ModelCheckpoint('mnist.h5', save_best_only=True)

STEP_SIZE_TRAIN=train_generator.n/train_generator.batch_size
model.fit_generator(generator=train_generator,
                    steps_per_epoch=STEP_SIZE_TRAIN,
                    epochs=epochs,
                    callbacks=[checkpoint]
)
我得到的结果如下:

Using TensorFlow backend.
Found 42000 images belonging to 10 classes.
{'0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9} class indices
Epoch 1/10
42000/42000 [==============================] - 174s 4ms/step - loss: 14.4503 - acc: 0.1035
/home/ec2-user/anaconda3/envs/tensorflow_p36/lib/python3.6/site-packages/keras/callbacks.py:434: RuntimeWarning: Can save best model only with val_loss available, skipping.
  'skipping.' % (self.monitor), RuntimeWarning)
Epoch 2/10
42000/42000 [==============================] - 169s 4ms/step - loss: 14.4487 - acc: 0.1036
Epoch 3/10
42000/42000 [==============================] - 169s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 4/10
42000/42000 [==============================] - 168s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 5/10
42000/42000 [==============================] - 169s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 6/10
42000/42000 [==============================] - 168s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 7/10
42000/42000 [==============================] - 168s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 8/10
42000/42000 [==============================] - 168s 4ms/step - loss: 14.4483 - acc: 0.1036
Epoch 9/10
42000/42000 [==============================] - 168s 4ms/step - loss: 14.4480 - acc: 0.1036
Epoch 10/10
 5444/42000 [==>...........................] - ETA: 2:26 - loss: 14.3979 - acc: 0.1067

trainingSet目录包含每个1-9位数的文件夹,文件夹中包含图像。我正在使用Amazon Deep Learning Linux AMI对AWS EC2 p3.2x大型实例进行培训。

以下是我看到的一些奇怪点的列表:

  • 不重新缩放图像->
    ImageDataGenerator(重新缩放=1/255)
  • 批量大小为1(您可能希望增加该值)
  • MNIST是灰度图片,因此
    颜色模式
    应该是
    “灰度”

(您的代码中还有几个未使用的部分,您可能希望从问题中删除)

在@abcdaire的答案中再添加两点

  • mnist
    的图像大小为
    (28,28)
    ,您将其分配错误
  • 二值化
    是另一种可以使用的方法。这也使得网络学习速度加快。可以这样做
  • `

    imges_dataset = imges_dataset/255.0
    imges_dataset = np.where(imges_dataset>0.5,1,0)