我这个测试集精度只有0或者100非常奇怪,用的是tesorflow2.0的版本,torch用的是1.1的版本
import torch
import torch.nn as nn
from net import vgg16
from torch.utils.data import DataLoader
from data import *
'''数据集'''
annotation_path='cls_train.txt'
with open(annotation_path,'r') as f:
lines=f.readlines()
np.random.seed(10101)
np.random.shuffle(lines)#打乱数据
np.random.seed(None)
num_val=int(len(lines)*0.1)
num_train=len(lines)-num_val
#输入图像大小
input_shape=[224,224]
train_data=DataGenerator(lines[:num_train],input_shape,True)
val_data=DataGenerator(lines[num_train:],input_shape,False)
val_len=len(val_data)
"""加载数据"""
gen_train=DataLoader(train_data,batch_size=5)
gen_test=DataLoader(val_data,batch_size=5)
'''构建网络'''
device=torch.device('cuda'if torch.cuda.is_available() else "cpu")
net=vgg16(pretrained=True, progress=True,num_classes=2)
net.to(device)
'''选择优化器和学习率的调整方法'''
lr=0.0001
optim=torch.optim.Adam(net.parameters(),lr=lr)
sculer=torch.optim.lr_scheduler.StepLR(optim,step_size=1)
'''训练'''
epochs=50
for epoch in range(epochs):
total_train=0
for data in gen_train:
img,label=data
with torch.no_grad():
img =img.to(device)
label=label.to(device)
optim.zero_grad()
output=net(img)
train_loss=nn.CrossEntropyLoss()(output,label).to(device)
train_loss.backward()
optim.step()
total_train+=train_loss
sculer.step()
total_test=0
total_accuracy=0
for data in gen_test:
img,label =data
with torch.no_grad():
img=img.to(device)
label=label.to(device)
optim.zero_grad()
out=net(img)
test_loss=nn.CrossEntropyLoss()(out,label).to(device)
total_test+=test_loss
accuracy=(out.argmax(1)==label).sum()
total_accuracy+=accuracy
print("训练集上的损失:{}".format(total_train))
print("测试集上的损失:{}".format(total_test))
print("测试集上的精度:{:.1%}".format(total_accuracy/val_len))
# torch.save(net,"dogandcat.{}.pt".format(epoch+1))
torch.save(net.state_dict(),"Adogandcat.{}.pth".format(epoch+1))
print("模型已保存")
print(total_accuracy)
print(val_len)
一些建议:
1、确保数据集是有效的,并且足够大以表示问题。如果数据集过小,就模型可能无法学习有效的表示,并且结果可能是不稳定的。
2、确保数据集是有偏差的,这意味着它应该代表想要模型预测的类别的比例。如果数据集中的某些类别的数据过少,就模型可能无法学习有效的表示,并且可能会产生偏差。
3、确保数据集是平衡的,这意味着它应该在所有类别之间平均分布。如果数据集中的某些类别的数据过多,就模型可能会偏向于预测这些类别,导致精度较低。
4、确保模型的结构是合理的,并且已经调整了超参数(例如学习率,权重衰减等)。
这个问题可能是由于您的数据集中出现了严重的类别不平衡导致的。例如,如果数据集中有超过90%的图像属于某一类,那么模型可能会经常预测这一类,因而在训练集上的准确率很高,但是在测试集上的准确率很低。
另一个可能的原因是模型的过拟合。如果模型在训练集上表现良好,但是在测试集上表现不佳,那么这可能是因为模型过度地学习了训练集的细节,而无法泛化到测试集。
为了解决这个问题,您可以尝试以下步骤:
检查您的数据集是否存在严重的类别不平衡,并尝试使用数据增强或数据重采样来解决这个问题。
尝试使用不同的模型或调整模型的超参数来减少过拟合。
尝试使用更多的数据来训练模型。
尝试使用正则化技术来防止过拟合。
尝试使用验证集来调整模型的超参数。
希望这些建议能够帮助您解决这个问题。