#python #tensorflow #machine-learning #keras #deep-learning
#python #тензорный поток #машинное обучение #keras #глубокое обучение
Вопрос:
Я использую архитектуру Xception и расширение данных для 3 классов. Мой исходный набор данных содержит 3 изображения в каждом из трех классов, организованных в каталог.
# import the necessary packages
from main.cnn.networks.lenet import LeNet
from sklearn.model_selection import train_test_split
from keras.datasets import mnist
from keras.optimizers import SGD
from keras.utils import np_utils
from keras import backend as K
import numpy as np
import argparse
import cv2 as cv
import ssl
from tensorflow import keras
from tensorflow.keras.preprocessing import image_dataset_from_directory
from tensorflow.keras.preprocessing.image import ImageDataGenerator
train_datagen = ImageDataGenerator(
fill_mode='constant',
cval=255.0,
rotation_range=90,
zoom_range=[1.0, 1.3],
rescale=1.0/255.0
)
it = train_datagen.flow_from_directory('training_data/',
target_size=(260, 380),
batch_size=9,
save_to_dir='augmented_data/',
save_format='jpeg'
)
validation_ds = image_dataset_from_directory (
directory='validation_data/',
labels='inferred',
label_mode='categorical',
batch_size=1,
image_size=(380, 260))
# scale data to the range of [0, 1]
def normalize(data, labels):
return data / 255.0, labels
validation_ds = validation_ds.map(normalize)
# initialize the optimize and model
print("[INFO] compiling model...")
model = keras.applications.Xception(weights=None, input_shape=(380, 260, 3), classes=3)
opt = SGD(lr=0.01)
model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"])
print("[INFO] training...")
model.fit(it, steps_per_epoch=1, epochs=100, verbose=1)
# show the accuracy on the testing set
print("[INFO] evaluating...")
(loss, accuracy) = model.evaluate(validation_ds, batch_size=3, verbose=1)
print("[INFO] accuracy: {:.2f}%".format(accuracy * 100))
for img, label in validation_ds:
probs = model.predict(img)
prediction = probs.argmax(axis=1)
print("PREDICTION: " str(probs))
print("ACTUAL LABEL: " str(label))
Моя точность обучения сходится к 1.0000, но вызов model.predict выглядит так:
[INFO] accuracy: 33.33%
PREDICTION: [[0.30813622 0.3550096 0.3368542 ]]
ACTUAL LABEL: tf.Tensor([[1. 0. 0.]], shape=(1, 3), dtype=float32)
PREDICTION: [[0.3081677 0.35502157 0.33681074]]
ACTUAL LABEL: tf.Tensor([[0. 1. 0.]], shape=(1, 3), dtype=float32)
PREDICTION: [[0.3081628 0.35502544 0.3368117 ]]
ACTUAL LABEL: tf.Tensor([[0. 1. 0.]], shape=(1, 3), dtype=float32)
PREDICTION: [[0.30813095 0.3550423 0.33682677]]
ACTUAL LABEL: tf.Tensor([[0. 0. 1.]], shape=(1, 3), dtype=float32)
...
По какой-то причине всегда выбирается второй класс, поэтому моя точность model.evaluate застряла на уровне 33,3%. Я пытался переключать различные размеры пакетов, скорость обучения и другие гиперпараметры, но не могу изменить этот результат.
Ответ №1:
Возможно, ваша нейронная сеть просто недостаточно обучена. У вас есть размер пакета 9, 1 шаг на эпоху и 100 эпох. Это означает, что к концу вашего обучения через сеть пройдет только 900 выборок. Я не уверен, в какой момент Keras перетасовывает, но это может быть даже в 900 раз больше одинаковых изображений.
Я предлагаю вам значительно увеличить steps_per_epoch
и, вероятно, увеличить размер пакета.
Комментарии:
1. В какой-то момент ваш размер изображения равен (260, 380), затем (380, 260), это нормально?
2. Да, это связано с тем, что target_size по какой-то причине равен (height, width), в то время как другие экземпляры (width, height) . В любом случае, спасибо за совет — я попробую.