CNN的学习方式有所不同,具体取决于提供数据的方式

时间:2019-02-01 06:37:18

标签: keras

首先,我将描述问题,下面引用所有必需的代码。 我使用的数据是正确的,我对此进行了测试。

因此,我有一个CNN,我通过提供图像数组来进行授课(我们称之为案例1)。学得好。 然后,我更改了提供训练数据的方式:我使用自定义数据生成器(如下)从磁盘中逐批加载图像(案例2)。

这是问题所在:第二种情况根本没有学到。 除非。 除非我在短时间内运行第一种情况,否则停止它,并使用第二种情况教导所得的网。 然后它学习的就像第一个案例一样。

我的理解是,第二种情况错过了一些重要的初始化,并且通过用第一种情况踢它,我将其设置为正确。

您知道第二种情况遗漏了什么吗?

===详细信息

我有一个CNN用于图像分类。没什么特别的:

model = Sequential()

model.add(Conv2D(32, (7, 7), strides = (1, 1), input_shape = (IMAGE_SIZE, IMAGE_SIZE, 1),
    kernel_regularizer=regularizers.l2(REGULARIZER),
    activity_regularizer=regularizers.l1(REGULARIZER)))
model.add(BatchNormalization(axis = 3, name = 'bn0'))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))

model.add(MaxPooling2D((2, 2), name='max_pool'))
model.add(Conv2D(64, (3, 3), strides = (1,1), name="conv1",
    kernel_regularizer=regularizers.l2(REGULARIZER),
    activity_regularizer=regularizers.l1(REGULARIZER)))
model.add(Activation('relu'))
model.add(Dropout(DROPOUT))
model.add(AveragePooling2D((3, 3), name='avg_pool'))

model.add(Flatten())
model.add(Dense(500, activation="relu", name='rl',
    kernel_regularizer=regularizers.l2(REGULARIZER),
    activity_regularizer=regularizers.l1(REGULARIZER)))
model.add(Dropout(DROPOUT))
model.add(Dense(train_labels.shape[1], activation='softmax', name='sm',
    kernel_regularizer=regularizers.l2(REGULARIZER),
    activity_regularizer=regularizers.l1(REGULARIZER)))

model.compile(loss='categorical_crossentropy', optimizer="adam", metrics=['accuracy'])
model.summary()

现在,如果我向它提供图像数组,它会很好地学习。图像被加载到一个单独的函数中,并提供了一个ENTIRE数组,因此该模型将其分为批处理:

datagen = ImageDataGenerator(
    rotation_range=30,
    width_shift_range=0.2,
    height_shift_range=0.2,
    zoom_range=0.2)

history = model.fit_generator(datagen.flow(x_train, train_labels, shuffle=True,
    batch_size=BATCH_SIZE), steps_per_epoch=len(x_train) / BATCH_SIZE, epochs=EPOCHS,
    validation_data=([x_valid[:,:,:, :1]], [valid_labels]), # class_weight=class_weights,
    callbacks=[saveBestModel]) 

网络学习得很好。 现在,如果我从磁盘上批量加载图像,则使用以下代码:

def image_generator(image_file_names, labels):
    while 1:
        total = len(image_file_names)
        for start in range(0, total, BATCH_SIZE):
            x_batch = []
            end = min(start + BATCH_SIZE, total)
            y_batch = labels[start:end, :]
            file_names_batch = image_file_names[start:end]

            text_file = open("log.txt", "a")
            text_file.write("\n".join(file_names_batch))
            text_file.write("\n%s\n===================\n" % start)
            text_file.close()

            for file_name in file_names_batch:
                img = load_img("../input/train/" + file_name,
                target_size=(IMAGE_SIZE, IMAGE_SIZE), grayscale=True)
                img = img_to_array(img)
                #img = datagen.random_transform(img, seed=42)
                img = img / 255.
                x_batch.append(img)
            yield np.array(x_batch), y_batch

在这种情况下,函数调用为:

history = model.fit_generator(image_generator(np_train[:, 0], train_labels), 
    steps_per_epoch=len(np_train) / BATCH_SIZE, epochs=EPOCHS, shuffle=True,
    validation_data=([x_valid[:,:,:, :1]], [valid_labels]), #class_weight=class_weights,
    callbacks=[saveBestModel])

这是问题所在:第二种情况根本没有学到。 除非。 除非我在短时间内运行第一种情况,否则停止它,并使用第二种情况教导所得的网。 然后学习。

我的理解是,第二种情况错过了一些重要的初始化,并且通过用第一种情况踢它,我将其设置为正确。

您知道第二种情况遗漏了什么吗?

0 个答案:

没有答案