Точность нейросети Keras всего 10% - PullRequest
0 голосов
/ 20 января 2019

Я учусь обучать нейронную сеть keras в наборе данных MNIST. Однако, когда я запускаю этот код, я получаю только 10% точности после 10 эпох обучения. Это означает, что нейронная сеть предсказывает только один класс, поскольку существует 10 классов. Я уверен, что это ошибка в подготовке данных, а не проблема сетевой архитектуры, потому что я получил архитектуру из учебника ( medium tutorial ). Есть идеи, почему модель не тренировочная?

Мой код:

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 с изображениями внутри папок. Я тренируюсь на экземпляре AWS EC2 p3.2xlarge с AMI Amazon Deep Learning Linux.

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Добавив еще два пункта в ответ @ abcdaire,

  1. mnist имеет размер изображения (28,28), вы неправильно его присвоили.
  2. Binarization - это еще одинметод, который можно использовать.Это также делает сеть, чтобы учиться быстро.Это можно сделать так.

`

imges_dataset = imges_dataset/255.0
imges_dataset = np.where(imges_dataset>0.5,1,0)
0 голосов
/ 20 января 2019

Вот список некоторых странных моментов, которые я вижу:

  • Не масштабировать изображения -> ImageDataGenerator(rescale=1/255)
  • Размер партии 1 (Вы можете увеличить это)
  • MNIST - изображения в оттенках серого, поэтому color_mode должно быть "grayscale".

(Также в вашем коде есть несколько неиспользуемых частей, которые вы можете удалить из вопроса)

...