1.涉及一个类class的用法:
-1.非继承类,直接在类里面写操作,写函数即可
-2.继承类:该类里面直接操作可以引用父类,但是构造函数要是需要使用父类的函数则需要在函数开头增加super().。
变量有两种,一种是对函数参数在函数内的调用,只在函数内有效则可以直接调用,如果需要让变量储存在类里供所有函数以及操作调用,需要使用.self
2.对于块内参数调用直接切片调用即可,
eg:rgnet[0][1][0].bias.data,这里指rgnet块的第一大块第二个子块的第一层偏置的本身
3.调用weight,bias时候,直接调用会标出可不可导,.data是直接tensor数据,.grad是导数
4.这里是两种常见的参数调用方式,第一种会输出一个元组,分别是名字和数据,而第二个只有数据:
m.named_parameters()和m.parameters() 对第一种:print(*[(name, param.shape) for name, param in net[0].named_parameters()])('weight', torch.Size([8, 4])) ('bias', torch.Size([8]))分别是当前层的权重和偏执,应为只要求了一层,所有没有层数提示。 print(*[(name, param.shape) for name, param in net.named_parameters()]) ('0.weight', torch.Size([8, 4])) ('0.bias', torch.Size([8])) ('2.weight', torch.Size([1, 8])) ('2.bias', torch.Size([1]))分别是第一层的参数,第三层的参数
(这里解包是让输出好看,不然输出外层会有个[]
5.对块(网络)使用,参数分别是名字和要加入的新块。用于向原有块中加入新块。
.add_module
6.这里右边得到一个和m.weight同形的矩阵,是对绝对值大于5进行判断后得到的bool值,之后使原矩阵和这个bool矩阵相乘,bool矩阵会自动转变为0和1,结果就是得到一个绝对值大于5的元素归零的新矩阵。
m.weight.data *= m.weight.data.abs() >= 5
7.这是一个构造函数,用于将括号内的参数包装成可训练的参数赋予变量
nn.Parameter()
8.有两种快速保存模型参数防止事故丢失数据的方式:1.当只需要保存一些简单参数时,可以使用轻量化的快速存储:
torch.save(x, 'x-file'),把x保存在新建文件x-file中,可以通过x2 = torch.load('x-file')这样迅速获取文件内容。
2.需要保存整个模型当前所有参数,由于一般比较多比较大,所以使用:
torch.save(net.state_dict(), 'mlp.params'),第一个指定对应网络的所有参数,第二个指定保存文件,当需要调用(需要模型结构完全相同), clone = MLP(),clone.load_state_dict(torch.load('mlp.params')),(假设原模型是MLP()),只需要使用该函数即可将参数直接施加到模型上