Потери NAN, точность 0, предоставлен полный код - PullRequest
0 голосов
/ 09 мая 2020

Я пытаюсь создать NN, который может распознавать буквы алфавита (26 классов). Прошу прощения за объемный пост, но я включил весь свой соответствующий код, чтобы быть максимально ясным. В конце концов, я объяснил проблему.

В следующем блоке я правильно называю пути, стандартизирую / нормализую изображение и готовлю его к обучению.

X = [] # Image data
y = [] # Labels

datagen = ImageDataGenerator(samplewise_center=True)

for path in imagepaths:
  img = cv2.imread(path)
  img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 
  img = cv2.resize(img, (200, 200))
  img = image.img_to_array(img)
  img = datagen.standardize(img)
  X.append(img)

  # Processing label in image path
  category = path.split("\\")[1]
  #print(category)
  split = (category.split("_"))     
  if int(split[0]) == 0:
    label = int(split[1])
  else:
    label = int(split[0])
  y.append(label)

# Turn X and y into np.array to speed up train_test_split
X = np.array(X, dtype="uint8")
X = X.reshape(len(imagepaths), 200, 200, 1) 
y = np.array(y)

Создание тестового набора.

ts = 0.3 
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=ts, random_state=42)

Создание модели. Плотность 26, один вывод для каждой буквы и размер 200,200,1 для соответствия входу:

model = Sequential()
model.add(Conv2D(32, (3, 3), activation='relu', input_shape=(200, 200, 1))) 
model.add(MaxPooling2D((2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Conv2D(64, (3, 3), activation='relu')) 
model.add(MaxPooling2D((2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Conv2D(64, (3, 3), activation='relu'))
model.add(MaxPooling2D((2, 2)))
model.add(BatchNormalization())
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(26, activation='softmax'))

Компилятор модели и соответствие:

model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) 
model.fit(X_train, y_train, epochs=1, batch_size=64, verbose=1, validation_data=(X_test, y_test))

Проблема возникает здесь, когда вывод my model.fit:

Train on 54600 samples, validate on 23400 samples
Epoch 1/1
54600/54600 [==============================] - 79s 1ms/step - loss: nan - accuracy: 1.8315e-05 - val_loss: nan - val_accuracy: 0.0000e+00

Я понимаю, что это может быть не высокая точность или что-нибудь из get- go, но почему потери нан? Я писал в другом месте, и мне сначала сказали нормализовать мои данные (что я исправил для этого поста). Затем мне сказали, что, возможно, мой набор данных поврежден или протекает - это не тот случай, потому что, когда я не пишу 26 букв одновременно, он работает отлично. (Это означает, что я тестировал код, используя буквы AJ, плотный = 10, et c) и получил высокую точность около 95%.

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

РЕДАКТИРОВАТЬ: Некоторые люди предлагали мне использовать one-hot и преобразовать его в категориальный ... Я не t сделал это, когда делал буквы AJ (размер 10), и без него он работал нормально. Проблема возникает только при переходе с 10 классов на 26 (полный алфавит)

...