为每个批次或时期打印出验证准确性到控制台(Keras)

时间:2017-12-21 17:45:47

标签: python neural-network deep-learning keras

我使用ImageDataGeneratorflow_from_directory生成我的数据,并且 使用model.fit_generator来拟合数据。

此默认设置仅输出训练数据集的精度。 似乎没有选择将验证准确性输出到终端。

以下是我的代码的相关部分:

#train data generator


print('Starting Preprocessing')

train_datagen = ImageDataGenerator(preprocessing_function = preprocess)

train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size = (img_height, img_width),
batch_size = batch_size, 
class_mode = 'categorical')  #class_mode = 'categorical'


#same for validation
val_datagen = ImageDataGenerator(preprocessing_function = preprocess)

validation_generator = val_datagen.flow_from_directory(
        validation_data_dir,
        target_size = (img_height, img_width),
        batch_size=batch_size,
        class_mode='categorical')





########################Model Creation###################################

#create the base pre-trained model
print('Finished Preprocessing, starting model creating \n')
base_model = InceptionV3(weights='imagenet', include_top=False)
x = base_model.output
x = GlobalAveragePooling2D()(x)
x = Dense(1024, activation='relu')(x)
predictions = Dense(12, activation='softmax')(x)
model = Model(input=base_model.input, output=predictions)




for layer in model.layers[:-34]:
   layer.trainable = False
for layer in model.layers[-34:]:
   layer.trainable = True


from keras.optimizers import SGD
model.compile(optimizer=SGD(lr=0.001, momentum=0.92),
              loss='categorical_crossentropy',
              metrics = ['accuracy'])



#############SAVE Model #######################################


file_name = str(datetime.datetime.now()).split(' ')[0] + '_{epoch:02d}.hdf5'
filepath = os.path.join(save_dir, file_name)



checkpoints =ModelCheckpoint(filepath, monitor='val_acc', verbose=1,
                                save_best_only=False, save_weights_only=False,
                                mode='auto', period=2)

###############Fit Model #############################

model.fit_generator(
train_generator,
steps_per_epoch =total_samples//batch_size,
epochs = epochs,
validation_data=validation_generator,
validation_steps=total_validation//batch_size,
callbacks = [checkpoints],
shuffle= True)

更新输出:

在整个训练过程中,我只获得训练准确性的输出, 但是在培训结束时,我得到了培训,验证准确性。

Epoch 1/10

  1/363 [..............................] - ETA: 1:05:58 - loss: 2.4976 - acc: 0.0640
  2/363 [..............................] - ETA: 51:33 - loss: 2.4927 - acc: 0.0760  
  3/363 [..............................] - ETA: 48:55 - loss: 2.5067 - acc: 0.0787
  4/363 [..............................] - ETA: 47:26 - loss: 2.5110 - acc: 0.0770
  5/363 [..............................] - ETA: 46:30 - loss: 2.5021 - acc: 0.0824
  6/363 [..............................] - ETA: 45:56 - loss: 2.5063 - acc: 0.0820

3 个答案:

答案 0 :(得分:6)

指定validation_split后,每个纪元都会打印验证丢失和验证准确性。

byte[] myBytes = new[] {1, 2, 5};
bool[] myBools = (bool[])myBytes;

我在我的代码中使用了上述内容,并且每个时期都会打印val_loss和val_acc,但不会在每个批次之后打印。

希望能回答你的问题。

model.fit(X, Y, epochs=1000, batch_size=10, validation_split=0.2)

答案 1 :(得分:4)

这个想法是你在每个时代之后通过你的验证集,而不是在每个批次之后。 如果在每批次之后,您必须在整个验证集上评估模型的性能,那么您将花费大量时间。

在每个时代之后,您将获得相应的损失和准确性,用于培训和验证。但在一个时代,您只能获得培训损失和准确性。

答案 2 :(得分:1)

fit_generator中,

fit_generator(generator, steps_per_epoch=None, epochs=1, verbose=1, callbacks=None, **validation_data=None, validation_steps=None**, validation_freq=1, class_weight=None, max_queue_size=10, workers=1, use_multiprocessing=False, shuffle=True, initial_epoch=0)

由于没有validation_split参数,您可以创建两个不同的ImageDataGenerator流,一个用于训练,一个用于验证,然后将“ validation_generator”放入validation_data中。然后将打印验证损失和准确性。