50.展开用reshape,或者view。不指定大小用-1代替。例如可以a.view(-1)将向量一维化。.item()能够将一个张量值标量取出。
51.与numpy之间转换关系,a.numpy()//torch.from_numpy()
52.通过创建张量时设置requires_grad=True可以实现自动微分,对张量进行各种运算操作,可以随时查看变量经历的操作使用x.grad_fn。需要求导时使用out.backward(),通过打印x.grad()即可。如果要查看在其他地方的梯度,使用v = torch.tensor([0.1, 1.0, 0.0001], dtype=torch.float) y.backward(v)
53.创建一个以nn.Module为父类的子类,__init__初始化一些名词,所使用的层,self.conv1=nn.Conv2d(32,6,5),分别为输入,输出,核大小。定义完之后需要利用forward添加一些层间操作.之后实例化Net,out=net(input)即可开始前向传播。out.backward(torch.randn(1, 10))随机一个梯度进行反向传播。
54.损失函数部分:实例化一个损失函数criterion = nn.MSELoss(),得到真值和计算值之后,计算损失loss = criterion(output, target)
55.计算损失函数的梯度后开始更新权重import torch.optim as optim
optimizer = optim.SGD(net.parameters(), lr=0.01),输入参数是网络参数和学习率。步骤:优化器权重清零,计算输出,计算损失函数,损失函数后向求梯度,更新权重。
56.构造transform将数据转化成(-1,1)的数据
--------------------PROCESS-------------------------------
1.首先导入需要的包
2.数据生成,按照架构保存数据到不同文件夹下,生成路径txt
3.定义网络初始化已经定义前向函数,注意每一层的输入输出和大小。并且实例化。
4.定义损失函数和优化器,以及学习率和momentum,根据分类情况选择损失函数
5.训练网络,for循环轮数,每轮loss归零,对于每个图片在trainloader迭代器循环,得到inputs,labels,初始化梯度,即opt.zero_grad(),在网络内部前向传播得到输出,根据输出和labels计算loss。计算梯度,而后更新权值。计算所有图片的loss,输出总的loss。
6.计算测试集精度,with torch.no_grad(): 测试只需要前向传播,在testloader中读取数据,得到images,labels,前向传播得到输出, _, predicted = torch.max(outputs.data, 1) # 找出分数最高的对应的channel,即为top-1类别,之后计算精度。
7.保存模型,save状态字典和路径,load加载路径即读取模型,使用时实例化后加载状态矩阵即可。