有人告诉我,使用数据增强将有助于我更准确地预测从文档中提取的手写数字(因此它不在我正在使用的MNIST数据集中),因此我在模型中使用了它。但是,我很好奇是否正确,因为在使用数据增强之前训练集的大小为60000,但是在添加数据增强之后,训练集的大小降低到每个时期3750?我这样做正确吗?
在this tutorial的数据增强部分之后,我对其进行了调整,以使其可以用于创建和训练模型的方式。到目前为止,我还没有真正理解的功能中没有可选参数。
我正在使用的当前模型来自my previous question给出的答案之一,因为它的性能要比我为了尝试而拼凑的第二个模型更好。我认为我所做的唯一更改是使它使用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
我希望它会在正确使用手写字符的情况下极大地帮助正确识别手写字符。但是我什至不确定我是否正确地做到了,以至于它对模型的准确性有很大的贡献。
编辑:它确实有助于识别一些提取的字符,但是该模型仍然无法正确提取大多数提取的字符,这使我怀疑我是否正确实施了该方法。