Правильно ли я делаю увеличение данных?

Мне сказали, что использование аугментации данных поможет мне получить более точные прогнозы рукописных цифр, которые я извлек из документа (поэтому этого нет в наборе данных 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

Я ожидаю, что это очень поможет правильно идентифицировать рукописные символы, предполагая, что они использовались правильно. Но я даже не уверен, правильно ли я это сделал, чтобы это сильно повлияло на точность модели.

РЕДАКТИРОВАТЬ: это немного помогло идентифицировать некоторые из извлеченных символов, но модель все еще не правильно поняла большинство извлеченных символов, что заставило меня усомниться в том, правильно ли я ее реализовал.


person mashedpotatoes    schedule 02.05.2019    source источник