{/"batch/_size/": 64,/n/"transform/": /"transforms.Compose([/n transforms.ToTensor(),/n transforms.Normalize((0.1307), (0.3081)) #两个参数,平均值和标准差/n])/",/n/"train/_dataset/": /"datasets.ImageFolder(/n root=/"./data/train/",/n transform=transform/n)/",/n/"train/_loader/": /"DataLoader(train/_dataset,/n shuffle=True,/n batch/_size=batch/_size)/",/n/"test/_dataset/": /"datasets.ImageFolder(/n root=/"./data/validation/",/n transform=transform/n)/",/n/"test/_loader/": /"DataLoader(test/_dataset,/n shuffle=True,/n batch/_size=batch/_size)/",/n/"model/": /"Net()/",/n/"device/": /"torch.device(/"cuda/" if torch.cuda.is_available() else /"cpu/")/",/n/"model.to(device)/": null,/n/"criterion/": /"torch.nn.CrossEntropyLoss()/",/n/"optimizer/": /"optim.SGD(model.parameters(), lr=0.01, momentum=0.5)/",/n/"train(epoch)/": /"def train(epoch):/n total = 0/n running/_loss = 0.0/n train/_loss = 0.0 #记录每次epoch的损失/n accuracy = 0 #记录每次epoch的accuracy/n for batch/_id, data in enumerate(train/_loader,0):/n inputs, target = data/n inputs, target = inputs.to(device), target.to(device)/n optimizer.zero/_grad()/n # forword + backward + update/n outputs = model(inputs)/n loss = criterion(outputs, target)/n/n _, predicted = torch.max(outputs.data, dim=1)/n accuracy += (predicted == target).sum().item()/n total += target.size(0)/n/n loss.backward()/n optimizer.step()/n/n running/_loss += loss.item()/n train/_loss = running/_loss/n #每迭代300次,求一下这三百次迭代的平均/n if batch/_id % 300 == 299:/n print('[%d, %5d] loss: %.3f' %(epoch+1, batch/_id+1, running/_loss / 300))/n running/_loss = 0.0/n print('第 %d epoch的 Accuracy on train set: %d %%, Loss on train set: %f' % (epoch + 1, 100 * accuracy / total, train/_loss))/n/n #返回acc和loss/n return 1.0 * accuracy / total, train/_loss/",/n/"validation(epoch)/": /"def validation(epoch):/n correct = 0/n total = 0/n val/_loss = 0.0/n with torch.no/_grad():/n for data in test/_loader:/n images, target = data/n images, target = images.to(device), target.to(device)/n outputs = model(images)/n loss = criterion(outputs, target)/n val/_loss += loss.item()/n _, predicted = torch.max(outputs.data, dim=1)/n total += target.size(0)/n correct += (predicted == target).sum().item()/n print('第 %d epoch的 Accuracy on validation set: %d %%, Loss on validation set: %f' %(epoch+1,100*correct / total, val/_loss))/n/n #返回acc和loss/n return 1.0 * correct / total, val/_loss/",/n/"draw/_in/_one(list,epoch)/": /"def draw/_in/_one(list,epoch):/n # x/_axix,train/_pn/_dis这些都是长度相同的list()/n # 开始画图/n x/_axix = [x for x in range(1, epoch+1)] #把ranage转化为list/n train/_acc = list[0]/n train/_loss = list[1]/n val/_acc = list[2]/n val/_loss = list[3]/n #sub/_axix = filter(lambda x: x % 200 == 0, x/_axix)/n plt.title('Result Analysis')/n plt.plot(x/axix, train/acc, color='green', label='training accuracy')/n plt.plot(x/axix, train/loss, color='red', label='training loss')/n plt.plot(x/axix, val/acc, color='skyblue', label='val accuracy')/n plt.plot(x/axix, val/loss, color='blue', label='val loss')/n plt.legend() # 显示图例/n plt.xlabel('epoch times')/n plt.ylabel('rate')/n plt.show()/n # python 一个折线图绘制多个曲线/",/n/"if //name// == '//main//':/": /"if //name// == '//main//':/n train/_loss = []/n train/_acc = []/n val/_loss = []/n val/_acc = []/n epoches = 10/n list = []/n for epoch in range(epoches):/n acc1, loss1 = train(epoch)/n train/_loss.append(loss1)/n train/_acc.append(acc1)/n acc2, loss2 = validation(epoch)/n val/_loss.append(loss2)/n val/_acc.append(acc2)/n # 如果验证准确率达到97.5%以上,停止训练/n if acc2 >= 0.975:/n break/n # 保存模型/n if not os.path.exists(/"./train/"):/n os.makedirs(/"./train/")/n torch.save(model.state/_dict(), /"./train/model.h5/")/n # 四幅图合并绘制/n list.append(train/_acc)/n list.append(train/_loss)/n list.append(val/_acc)/n list.append(val/_loss)/n draw/_in/_one(list, epoch+1)/n /&quot

PyTorch 图像分类模型训练与评估 - 达到 97.5% 准确率

原文地址: https://www.cveoy.top/t/topic/pYRa 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录