Python 将每个批次或历元(Keras)的验证精度打印到控制台

Python 将每个批次或历元(Keras)的验证精度打印到控制台,python,neural-network,deep-learning,keras,Python,Neural Network,Deep Learning,Keras,我正在使用ImageDataGenerator和flow\u from\u directory生成我的数据,并且 使用model.fit_生成器拟合数据 这默认为仅输出训练数据集的精度。 似乎没有向终端输出验证准确性的选项 以下是我的代码的相关部分: #train data generator print('Starting Preprocessing') train_datagen = ImageDataGenerator(preprocessing_function = preproc

我正在使用
ImageDataGenerator
flow\u from\u directory
生成我的数据,并且 使用
model.fit_生成器
拟合数据

这默认为仅输出训练数据集的精度。 似乎没有向终端输出验证准确性的选项

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

#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

其思想是在每个历元之后,而不是在每个批次之后,通过验证集。 如果在每一批之后,您必须在整个验证集上评估模型的性能,那么您将浪费大量时间


在每个历元之后,您将拥有用于训练和验证的相应损失和准确度。但是在一个历元期间,您将只能访问训练损失和准确度。

一旦您指定验证分割,将为每个历元打印验证损失和验证准确度

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
model.fit(X, Y, epochs=1000, batch_size=10, validation_split=0.2)
我已经在我的代码中使用了上述内容,val_loss和val_acc将在每个历元打印,但不是在每个批次之后

希望这能回答你的问题

Epoch 1/500
1267/1267 [==============================] - 0s 376us/step - loss: 0.6428        - acc: 0.6409 - val_loss: 0.5963 - val_acc: 0.6656

安装发电机中

fit_生成器(生成器,每_epoch的步数=None,epoch=1,verbose=1,callbacks=None,**验证_数据=None,验证_步骤=None**,验证_频率=1,类_权重=None,最大_队列大小=10,工作者=1,使用_多处理=False,无序=True,初始_epoch=0)

由于没有
validation\u split
参数,您可以创建两个不同的
ImageDataGenerator
流,一个用于培训,一个用于验证,然后将“validation\u generator”放入
validation\u data
中。然后它将打印验证损失和准确性。

终端的输出是什么?您能给出吗我们有一些例子吗?@Tay2510我现在不能运行这个模型,但这是你基本的冗长[1]Keras output,它在每批之后输出进度。如果这是
verbose=1
,那么应该有
val\u loss
val\u acc
输出到您的终端。这就是为什么我要求显示您的输出。@Tay2510我已经更新了输出,所以没有办法做到这一点?在tensorflow中(使用他们的转移学习脚本),我能够做到这一点,而且保存的瓶颈也不错。据我所知,没有简单的方法可以做到这一点。我想知道,知道每个批次的验证损失有什么意义?
validation\u split
不作为
fit\u generator
的参数存在。