Мне сказали, что использование дополнения данных поможет мне получить более точные прогнозы для рукописных цифр, которые я извлек из документа (так что его нет в наборе данных MNIST, который я использую), поэтому я использовал его в своей модели.Тем не менее, мне любопытно, правильно ли я это сделал, так как размер тренировочного набора до использования дополнения данных составляет 60000, но после добавления дополнения данных он снизился до 3750 за эпоху?Правильно ли я это делаю?
Следуя части дополнения данных этого урока , я настроил его так, чтобы он работал при создании и обучении моей модели.Я также пропустил необязательные параметры в функциях, которые на данный момент не совсем понятны.
Текущая модель, которую я использую, основана на одном из ответов, которые я получил от моего предыдущеговопрос , поскольку он работает лучше, чем вторая модель, которую я собрал ради попытки.Я думаю, что единственное изменение, которое я сделал, - это использование sparse_categorical_crossentropy
вместо потери, поскольку я классифицирую цифры, а рукописные символы не могут принадлежать двум категориям цифр, верно,
def createModel():
model = keras.models.Sequential()
# 1st conv & maxpool
model.add(keras.layers.Conv2D(40, (5, 5), padding="same", activation='relu', input_shape=(28, 28, 1)))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2), strides=(2, 2)))
# 2nd conv & maxpool
model.add(keras.layers.Conv2D(200, (3, 3), padding="same", activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(1,1)))
# 3rd conv & maxpool
model.add(keras.layers.Conv2D(512, (3, 3), padding="valid", activation='relu'))
model.add(keras.layers.MaxPooling2D(pool_size=(3, 3), strides=(1,1)))
# reduces dims from 2d to 1d
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(units=100, activation='relu'))
# dropout for preventing overfitting
model.add(keras.layers.Dropout(0.5))
# final fully-connected layer
model.add(keras.layers.Dense(10, activation='softmax'))
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
return model
Обучение выполняется отдельной функцией, и именно здесь я подключил часть дополнения данных:
def trainModel(file_model, epochs=5, create_new=False, show=False):
model = createModel()
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()
x_train = x_train.reshape((60000, 28, 28, 1)) / 255.0
x_test = x_test.reshape((10000, 28, 28, 1)) /255.0
x_gen = np.array(x_train, copy=True)
y_gen = np.array(y_train, copy=True)
datagen = keras.preprocessing.image.ImageDataGenerator(featurewise_center=True, featurewise_std_normalization=True, rotation_range=20)
datagen.fit(x_gen)
x_train = np.concatenate((x_train, x_gen), axis=0)
y_train = np.concatenate((y_train, y_gen), axis=0)
# if prev model exists and new model isn't needed..
if (os.path.exists(file_model)==True and create_new==False):
model = keras.models.load_model(file_model)
else:
history = model.fit_generator(datagen.flow(x_train, y_train), epochs=epochs, validation_data=(x_test, y_test))
model.save(file_model)
if (show==True):
model.summary()
return model
Я ожидаю, что это очень поможет с правильной идентификацией рукописных символов при условии, что они использовались правильно.Но я даже не уверен, правильно ли я сделал это так, что это сильно повлияет на точность модели.
РЕДАКТИРОВАТЬ: Это немного помогло в идентификации некоторых из извлеченных символов, но модель все еще не 'Я правильно понял большинство извлеченных символов, что заставляет меня усомниться в том, что я правильно его реализовал ..