我正在使用人脸图像数据集训练卷积神经网络 . 该数据集有10,000张尺寸为700 x 700的图像 . 我的模型有12层 . 我正在使用生成器功能将图像读入Keras fit_generator函数,如下所示 .

train_file_names ==>包含训练实例文件名的Python列表
train_class_labels ==> Numpy数组的单热编码类标签([0,1,0],[0,0,1]等)
train_data ==> Numpy数组训练实例
train_steps_epoch ==> 16(批量大小为400,我有6400个实例用于训练 . 因此,单次遍历整个数据集需要16次迭代)
batch_size ==> 400
calls_made ==>当生成器到达训练实例的末尾时,它会重置索引以从下一个纪元中的第一个索引加载数据 .

我将此生成器作为参数传递给keras 'fit_generator'函数,以便为每个纪元生成新批量数据 .

val_data,val_class_labels ==>验证数据numpy数组
epochs ==>时代数

Using Keras fit_generator

model.fit_generator(generator=train_generator, steps_per_epoch=train_steps_per_epoch, epochs=epochs, use_multiprocessing=False, validation_data=[val_data, val_class_labels], verbose=True, callbacks=[history, model_checkpoint], shuffle=True, initial_epoch=0)

Code

def train_data_generator(self):     
    index_start = index_end = 0 
    temp = 0
    calls_made = 0

    while temp < train_steps_per_epoch:
        index_end = index_start + batch_size
        for temp1 in range(index_start, index_end):
            index = 0
            # Read image
            img = cv2.imread(str(TRAIN_DIR / train_file_names[temp1]), cv2.IMREAD_GRAYSCALE).T
            train_data[index]  = cv2.resize(img, (self.ROWS, self.COLS), interpolation=cv2.INTER_CUBIC)
            index += 1       
        yield train_data, self.train_class_labels[index_start:index_end]
        calls_made += 1
        if calls_made == train_steps_per_epoch:
            index_start = 0
            temp = 0
            calls_made = 0
        else:
            index_start = index_end
            temp += 1  
        gc.collect()

Output of fit_generator

大纪元86/300
16/16 [==============================] - 16s 1s / step - 损失:1.5739 - acc:0.2991 - val_loss :12.0076 - val_acc:0.2110
大纪元87/300
16/16 [==============================] - 16s 1s / step - loss:1.6010 - acc:0.2549 - val_loss :11.6689 - val_acc:0.2016
大纪元88/300
16/16 [==============================] - 16s 1s / step - 损失:1.5750 - acc:0.2391 - val_loss :10.2663 - val_acc:0.2004
Epoch 89/300
16/16 [==============================] - 16s 1s / step - 损失:1.5526 - acc:0.2641 - val_loss :11.8809 - val_acc:0.2249
大纪元90/300
16/16 [==============================] - 16s 1s / step - 损失:1.5867 - acc:0.2602 - val_loss :12.0392 - val_acc:0.2010
大纪元91/300
16/16 [==============================] - 16s 1s / step - 损失:1.5524 - acc:0.2609 - val_loss :12.0254 - val_acc:0.2027

我的问题是,虽然如上所述使用具有上述生成器功能的'fit_generator',但我的模型损失根本没有改善,并且验证准确性非常差 . 但是当我使用keras'fit'功能时,模型损失会减少,验证准确性会更好 .

Using Keras fit function without using a generator

model.fit(self.train_data, self.train_class_labels, batch_size=self.batch_size, epochs=self.epochs, validation_data=[self.val_data, self.val_class_labels], verbose=True, callbacks=[history, model_checkpoint])

Output when trained using fit function

大纪元25/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0207 - acc:0.9939 - val_loss :4.1009 - val_acc:0.4916
Epoch 26/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0197 - acc:0.9948 - val_loss :2.4758 - val_acc:0.5568
大纪元27/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0689 - acc:0.9800 - val_loss :1.2843 - val_acc:0.7361
大纪元28/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0207 - acc:0.9947 - val_loss :5.6979 - val_acc:0.4560
大纪元29/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0353 - acc:0.9908 - val_loss :1.0801 - val_acc:0.7817
大纪元30/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0362 - acc:0.9896 - val_loss :3.7851 - val_acc:0.5173
大纪元31/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0481 - acc:0.9896 - val_loss :1.1152 - val_acc:0.7795
大纪元32/300
6400/6400 [==============================] - 20s 3ms /步 - 损失:0.0106 - acc:0.9969 - val_loss :1.4803 - val_acc:0.7372