Я правильно делаю увеличение данных? - PullRequest
1 голос
/ 02 мая 2019

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...