Невозможно получить точность в наборе данных собственных цифр для mnist - PullRequest
0 голосов
/ 25 октября 2018

Я новичок в машинном обучении, я попробовал набор данных mnist, и я получил точность около 97%, но затем я попытался работать с моим набором данных изображений, и я получил точность 0%.Пожалуйста, помогите мне.

Это код модели точности 97%:

from keras.models import Sequential                  
from keras.layers import Dense, Dropout, Conv2D, Flatten  
from keras.callbacks import ModelCheckpoint               


x_train = tf.keras.utils.normalize(x_train, axis =1)
x_test = tf.keras.utils.normalize(x_test, axis = 1)

model = Sequential()
model.add(Flatten())
model.add(Dense(128, activation = 'relu')) 
model.add(Dense(128, activation = 'relu'))
model.add(Dense(10, activation = 'softmax')) 


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

checkpointer = ModelCheckpoint(filepath = 'mnist.model.weights.best.hdf5',verbose = 1,save_best_only = True, monitor = 'loss')

model.fit(x_train, y_train, epochs = 3, callbacks = [checkpointer], 
          batch_size = 32,verbose = 2,shuffle = True)

Теперь я попробовал с моими 10 изображениями, и ни одно из них не было предсказано правильно.Ниже приведен код:

from skimage import io
from skimage import color
import numpy as np
import tensorflow as tf
import keras

img_0 = color.rgb2gray(io.imread("0.jpg"))
img_2 = color.rgb2gray(io.imread("2.jpg"))
img_3 = color.rgb2gray(io.imread("3.jpg"))
img_4 = color.rgb2gray(io.imread("4.jpg"))
img_5 = color.rgb2gray(io.imread("5.jpg"))
img_6 = color.rgb2gray(io.imread("6.jpg"))
img_7 = color.rgb2gray(io.imread("7.jpg"))
img_8 = color.rgb2gray(io.imread("8.jpg"))
img_9 = color.rgb2gray(io.imread("9.jpg"))
array = [img_0, img_2, img_3, img_4, img_5, img_6, img_7, img_8, img_9]

#normalized the data between 0-1
array = tf.keras.utils.normalize(array, axis = 1)

#used the loop to increase the dimensions of the input layer as 1,28,28 which will be converted into 1*784
for i in array:
    i = np.expand_dims(i,axis = 0)
    print(i.shape)


new_model = tf.keras.models.load_model('mnist_save.model')
new_model.load_weights('mnist.model.weights.best.hdf5')
predictions = new_model.predict(array)

Можете ли вы помочь мне с моей проблемой.

1 Ответ

0 голосов
/ 26 октября 2018

На вашем месте я проверю следующие три вещи.

1.Визуализируйте как данные обучения, так и данные тестирования бок о бок

Это самый простой способ проверить, является ли низкая производительность разумной.По сути, если данные тестирования сильно отличаются от данных обучения, ваша предварительно обученная модель не сможет достичь высокой производительности в этой новой области тестирования.Даже если это не так, визуализация должна помочь решить, какую простую адаптацию домена можно применить для достижения лучшей производительности.

2.Двойная проверка с вашей нормализацией L2

Я взглянул на исходный код keras.utils.normalize

@tf_export('keras.utils.normalize')
def normalize(x, axis=-1, order=2):
  """Normalizes a Numpy array.
  Arguments:
      x: Numpy array to normalize.
      axis: axis along which to normalize.
      order: Normalization order (e.g. 2 for L2 norm).
  Returns:
      A normalized copy of the array.
  """
  l2 = np.atleast_1d(np.linalg.norm(x, order, axis))
  l2[l2 == 0] = 1
  return x / np.expand_dims(l2, axis)

Поскольку вы используете бэкэнд тензор потока, normalize вдоль 1-й осичто означает?Нормализовать каждый ряд?Это странно.Правильный способ нормализации состоит в том, чтобы (1) векторизовать ваше входное изображение, то есть каждое изображение становится вектором;и (2) normalize результирующий вектор (по оси = 1).

На самом деле, это несколько неуместно, особенно если вы хотите применить предварительно обученную модель в другом домене.Это связано с тем, что нормализация L2 более чувствительна к ненулевым значениям.В образцах MNIST, почти в двоичном виде, то есть 0 или 1 с.Однако на изображении в оттенках серого вы можете встретить значения в [0,255], что является совершенно другим распределением.

Вы можете попробовать простую (0,1) нормализацию, то есть

x_normalized = (x-min(x))/(max(x)-min(x))

, но для этого требуется переобучить новую модель.

3.Применяйте методы адаптации домена

Это означает, что вы хотите сделать следующие вещи перед подачей тестового изображения в вашу модель (даже до нормализации).

  • преобразовать в двоичную форму тестовое изображение,т. е. конвертировать в 0/1 изображения
  • отрицание тестового изображения, т. е. сделать 0 с 1 с и 1 с 0 с
  • централизовать тестовое изображение, т.е. сместить ваше изображение таким образом, чтобы его центр масс был изображениемcenter.

Конечно, какие методы применять, зависит от различий в доменах, которые вы наблюдаете в результатах визуализации.

...