val_accuracy 和 val_loss 在模型训练期间不可见,即使在添加验证数据之后

问题描述 投票:0回答:1

我正在训练一个 ResNet 50 模型来将图像分类为 Covid 感染或正常。训练时,唯一显示的指标是训练准确性和损失。 val_accuracy 和 val_loss 在任何时代都不可见。我已经通过了验证数据,但它仍然没有出现。

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)
print('The train Data Shape ', X_train.shape[0])
 
X_test, X_valid, y_test, y_valid = train_test_split(X_test,y_test, test_size = 0.5)
print('The validation Data Shape ', X_valid.shape[0])
print('The test Data Shape ', X_test.shape[0])

lr = 1e-3
epochs = 50
bs = 8
optimizer = Adam(learning_rate = lr, decay= lr/epochs)
model.compile(optimizer, loss='binary_crossentropy', metrics=['accuracy'])

epochs = 100

#initialize the training data augmentation object
train_datagen = ImageDataGenerator(
        rotation_range=15,
        fill_mode ="nearest")
metric = "accuracy"
 
checkpointer = ModelCheckpoint(filepath = "./Model/CDX_Best_RestNet50.h5", save_best_only = True, monitor = metric , verbose=1)
start = time.time()
 
# let's get started !
 
history=model.fit(train_datagen.flow(X_train, y_train, batch_size = bs),
                            steps_per_epoch = len(X_train)//bs,
                            validation_data = (X_valid, y_valid),
                            validation_steps = len(X_valid)//bs,
                            epochs =epochs,
                            callbacks= [checkpointer])
 
end = time.time()
duration = end - start
print ('\n This Model took %0.2f seconds (%0.1f minutes) to train for %d epochs'%(duration, duration/60, epochs) )

此外,这是 X_train 的形状:火车数据形状 (224, 224, 3)

验证指标仅在第一个时期可见


python tensorflow machine-learning keras deep-learning
1个回答
0
投票

似乎传递给 model.fit() 方法的验证数据可能存在问题。在提供的代码片段中,X_valid 和 y_valid 作为验证数据传递,但 X_valid 的形状为 (224, 224, 3),这似乎对应于单个图像而不是一组验证数据。

要解决此问题,您可以尝试在将 X_valid 传递给 model.fit() 之前使用 np.reshape() 将其重塑为 (1, 224, 224, 3) 的形状。

此外,val_accuracy 和 val_loss 等验证指标仅在第一个 epoch 可见是正常的,因为这些指标仅在每个 epoch 结束时计算。但是,您可以通过将 validation_data 参数传递给 model.fit() 来监控所有时期的这些指标。在你的情况下,你已经传递了这个参数,所以一旦验证数据的问题得到解决,验证指标应该对所有时期都是可见的

X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.2)
print('The train Data Shape ', X_train.shape[0])

X_test, X_valid, y_test, y_valid = train_test_split(X_test,y_test, test_size = 0.5)
print('The validation Data Shape ', X_valid.shape[0])
print('The test Data Shape ', X_test.shape[0])

lr = 1e-3
epochs = 50
bs = 8
optimizer = Adam(learning_rate = lr, decay= lr/epochs)
model.compile(optimizer, loss='binary_crossentropy', metrics=['accuracy'])

#initialize the training data augmentation object
train_datagen = ImageDataGenerator(
        rotation_range=15,
        fill_mode ="nearest")

metric = "accuracy"

checkpointer = ModelCheckpoint(filepath = "./Model/CDX_Best_RestNet50.h5", save_best_only = True, monitor = metric , verbose=1)
start = time.time()

# let's get started !
 
history=model.fit(train_datagen.flow(X_train, y_train, batch_size = bs),
                            steps_per_epoch = len(X_train)//bs,
                            validation_data = train_datagen.flow(X_valid, y_valid, batch_size=bs),
                            validation_steps = len(X_valid)//bs,
                            epochs =epochs,
                            callbacks= [checkpointer])
 
end = time.time()
duration = end - start
print ('\n This Model took %0.2f seconds (%0.1f minutes) to train for %d epochs'%(duration, duration/60, epochs) )

对代码所做的更改是:

  1. 通过 train_datagen.flow(X_valid, y_valid, batch_size=bs) 作为 验证数据而不是 (X_valid, y_valid)。
  2. 删除了多余的第二个纪元声明。
  3. 在 model.fit() 中为验证数据添加了一个 train_datagen 参数。
© www.soinside.com 2019 - 2024. All rights reserved.