import torch import torchvision from torch import nn from torch.utils.data import DataLoader from torch.nn import Conv2d from torch.utils.tensorboard import SummaryWriter
step=0 tudui1=Tudui() writer=SummaryWriter("dataloader") print(tudui1) for data in dataloader: imgs,targets=data output=tudui1(imgs) print(imgs.shape) print(output.shape) writer.add_images("input",imgs,step) output=torch.reshape(output,(-1,3,30,30))
import torch import torchvision from torch import nn from torch.nn import MaxPool2d from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter
import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter
defforward(self,x): x=self.model1(x) return x tudui=Tudui() for data in dataloader: imgs,targets=data outputs=tudui(imgs) print(outputs) print(targets) loss=nn.CrossEntropyLoss() result_loss=loss(outputs, targets) print(result_loss) result_loss.backward() print("ok")
import torch import torchvision from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linear, Sequential from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter
# 利用DataLoader来加载数据集 train_dataloader=DataLoader(train_data,batch_size=64) test_dataloader=DataLoader(test_data,batch_size=64) #创建网络模型 tudui=Tudui() #损失函数 loss_fn=nn.CrossEntropyLoss() #优化器 learning_rate=1e-2 optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate) # 设置训练网络的一些参数 total_train_step=0 # 训练的轮数 epoch=10 total_test_step=0 for i inrange(epoch): print("第{}轮训练开始".format(i+1)) # 训练步骤开始 for data in train_dataloader: imgs,targets=data outputs=tudui(imgs) loss=loss_fn(outputs,targets) # 优化器模型cc optimizer.zero_grad() loss.backward() optimizer.step()
total_train_step=total_train_step+1 if total_train_step % 10==0: print("训练次数:{},Loss:{}".format(total_train_step,loss.item())) writer.add_scalar("train_loss",loss.item(),total_train_step) # 测试步骤开始 total_test_loss=0 total_accuracy=0 # with torch.no_grad():的意思是测试过程中不用对模型进行调优直接用现有的模型就行 with torch.no_grad(): for data in test_dataloader: imgs,targets=data outputs=tudui(imgs) loss=loss_fn(outputs,targets) total_test_loss=total_test_loss+loss.item() accuracy=(outputs.argmax(1)==targets).sum() total_accuracy=total_accuracy+accuracy print("整体测试集上的LOSS:{}".format(total_test_loss)) print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size)) total_test_step = total_test_step+1 writer.add_scalar("test_loss", loss.item(), total_test_step) writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step) torch.save(tudui,"tudui_{}.pth".format(i)) print("模型已保存")
writer.close()
GPU训练
第一种训练方式新增以下代码
1 2 3 4 5 6 7
if torch.cuda.is_available(): tudui=tudui.cuda() if torch.cuda.is_available(): loss_fn=loss_fn.cuda() if torch.cuda.is_available(): imgs=imgs.cuda() targets=targets.cuda()
import torch import torchvision from torch import nn from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter import time from model import Tudui
# 利用DataLoader来加载数据集 train_dataloader=DataLoader(train_data,batch_size=64) test_dataloader=DataLoader(test_data,batch_size=64) #创建网络模型 tudui=Tudui() if torch.cuda.is_available(): tudui=tudui.cuda()
#损失函数 loss_fn=nn.CrossEntropyLoss() if torch.cuda.is_available(): loss_fn=loss_fn.cuda() #优化器 learning_rate=1e-2 optimizer=torch.optim.SGD(tudui.parameters(),lr=learning_rate)
# 设置训练网络的一些参数 total_train_step=0 # 训练的轮数 epoch=10 total_test_step=0 for i inrange(epoch): print("第{}轮训练开始".format(i+1)) # 训练步骤开始 tudui.train() for data in train_dataloader: imgs,targets=data if torch.cuda.is_available(): imgs=imgs.cuda() targets=targets.cuda() outputs=tudui(imgs) loss=loss_fn(outputs,targets) # 优化器模型cc optimizer.zero_grad() loss.backward() optimizer.step()
total_train_step=total_train_step+1 if total_train_step % 100==0: end_time = time.time() print(end_time - start_time) print("训练次数:{},Loss:{}".format(total_train_step,loss.item())) writer.add_scalar("train_loss",loss.item(),total_train_step) # 测试步骤开始 tudui.eval() total_test_loss=0 total_accuracy=0 # with torch.no_grad():的意思是测试过程中不用对模型进行调优直接用现有的模型就行 with torch.no_grad(): for data in test_dataloader: imgs,targets=data if torch.cuda.is_available(): imgs = imgs.cuda() targets = targets.cuda() outputs=tudui(imgs) loss=loss_fn(outputs,targets) total_test_loss=total_test_loss+loss.item() accuracy=(outputs.argmax(1)==targets).sum() total_accuracy=total_accuracy+accuracy print("整体测试集上的LOSS:{}".format(total_test_loss)) print("整体测试集上的正确率:{}".format(total_accuracy/test_data_size)) total_test_step = total_test_step+1 writer.add_scalar("test_loss", loss.item(), total_test_step) writer.add_scalar("test_accuracy", total_accuracy/test_data_size, total_test_step) torch.save(tudui,"tudui_{}.pth".format(i)) print("模型已保存") writer.close()
第二种训练方式主要使用语句device=torch.device("cuda" if torch.cuda.is_available() else "cpu") 在第9行要加image=image.convert('RGB') 因为png格式是四个通道,除了RGB三通道外,还有一个透明度通道。 所以,我们调用image=image.convert(RGB),保留其颜色通道 当然,如果图片本来就是三个颜色通道,经过此操作,不变。 加上这一步后,可以适应png,jpg各种格式的图片。
import torch import torchvision from torch import nn from torch.nn import Sequential, Conv2d, MaxPool2d, Flatten, Linear from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter import time from model import Tudui