keras训练模型,训练集的准确率很高,但是测试集准确率很低的原因

今天在测试模型时发现一个问题,keras训练模型,训练集准确率很高,测试集准确率很低,因此记录一下希望能帮助大家也避坑:

首先keras本身不同的版本都有些不同的或大或小的bug,包括之前也困扰过我的BN层问题(相信很多人都中过招),因此我先说下我的对应版本:keras:2.3.1 tensorflow-gpu:1.15 CUDA:10.0 cudnn:7.6.3

在训练模型完成后在测试集测试模型准确率:

def valid_data(valid_data_dir='./data/val'):
    valid_datagen = ImageDataGenerator(rescale=1. / 255)
                                       
    valid_generator = valid_datagen.flow_from_directory(valid_data_dir,
                                                        target_size=(224, 224),
                                                        batch_size=16,
                                                        class_mode='categorical',
                                                        )
    return valid_generator

valid_generator = valid_data()

model = load_model('resnet.h5')
predictions = model.predict_generator(valid_generator,verbose=1)
predict_label = predictions.argmax(axis=-1) 
true_label = valid_generator.classes

acc=accuracy_score(true_label,predict_label)
print(acc, end='\n\n')

乍一看代码其实没有太大问题,但是最后准确率很低:
在这里插入图片描述

核心原因是对测试集的数据顺序做了打乱,使得预测label与真实label无法对应:
在这里插入图片描述
预测label是对打乱的数据预测的:

在这里插入图片描述

但是真实label是未打乱的:
在这里插入图片描述

解决的办法是对代码进行修改:shuffle=False
在这里插入图片描述
修改后的模型测试准确率就正常了:

在这里插入图片描述
当然,导致模型测试集准确率低的原因远不止这一种,还有很多其他的可能,所以希望大家在遇见具体问题的时候还是能够具体分析。

  • 13
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,我可以为您提供一个简单的示例代码来生成训练集和验证集的精确度曲线。在这个示例中,我们将使用PyTorch和Scikit-learn来生成数据和模型。 首先,我们需要生成一些模拟数据。我们可以使用Scikit-learn中提供的`make_classification`函数来生成二元分类数据。 ```python from sklearn.datasets import make_classification import numpy as np # Generate simulated data X, y = make_classification(n_samples=1000, n_features=10, n_informative=8, n_redundant=2, n_classes=2, random_state=42) # Add some noise to the data noise = np.random.normal(0, 0.1, size=X.shape) X += noise ``` 接下来,我们将使用PyTorch来定义一个简单的神经网络模型。在这个示例中,我们将使用一个具有两个隐藏层的全连接神经网络。 ```python import torch import torch.nn as nn class Net(nn.Module): def __init__(self): super(Net, self).__init__() self.fc1 = nn.Linear(10, 20) self.fc2 = nn.Linear(20, 10) self.fc3 = nn.Linear(10, 2) self.relu = nn.ReLU() def forward(self, x): x = self.fc1(x) x = self.relu(x) x = self.fc2(x) x = self.relu(x) x = self.fc3(x) return x ``` 接下来,我们将使用PyTorch和Scikit-learn来训练和测试模型。我们将使用Adam优化器和交叉熵损失函数来训练模型。我们将记录训练和验证的准确性,并在训练完成后绘制准确性曲线。 ```python import torch.optim as optim from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt # Split data into training and validation sets X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) # Convert data to PyTorch tensors X_train = torch.from_numpy(X_train).float() y_train = torch.from_numpy(y_train).long() X_val = torch.from_numpy(X_val).float() y_val = torch.from_numpy(y_val).long() # Define the model model = Net() # Define the optimizer and loss function optimizer = optim.Adam(model.parameters(), lr=0.01) criterion = nn.CrossEntropyLoss() # Train the model train_acc = [] val_acc = [] for epoch in range(100): # Train the model model.train() optimizer.zero_grad() outputs = model(X_train) loss = criterion(outputs, y_train) loss.backward() optimizer.step() # Evaluate the model on training and validation sets model.eval() train_pred = model(X_train).argmax(dim=1) train_accuracy = (train_pred == y_train).sum().item() / len(y_train) val_pred = model(X_val).argmax(dim=1) val_accuracy = (val_pred == y_val).sum().item() / len(y_val) train_acc.append(train_accuracy) val_acc.append(val_accuracy) print(f"Epoch {epoch + 1}: Train accuracy: {train_accuracy:.4f}, Val accuracy: {val_accuracy:.4f}") # Plot the accuracy curves plt.plot(train_acc, label='Train') plt.plot(val_acc, label='Validation') plt.xlabel('Epoch') plt.ylabel('Accuracy') plt.legend() plt.show() ``` 这个示例代码将生成一个包含训练和验证准确性的曲线,并在训练完成后绘制。你可以自己修改代码来满足你的具体要求,比如加入噪声等。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值