首先,我将描述问题,下面引用所有必需的代码。 我使用的数据是正确的,我对此进行了测试。
因此,我有一个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])
这是问题所在:第二种情况根本没有学到。 除非。 除非我在短时间内运行第一种情况,否则停止它,并使用第二种情况教导所得的网。 然后学习。
我的理解是,第二种情况错过了一些重要的初始化,并且通过用第一种情况踢它,我将其设置为正确。
您知道第二种情况遗漏了什么吗?