模型搭建过程中,参数都需要进行初始化,如果每次初始化的结果不同,训练模型的结果就不一样
因此为了保证每次输出结果一致,就需要设置随机数种子,保证代码的可复现性
random.random() #这个方法生产每次产生的随机数都是不同的
random.seed(x) #只要设定了随机数种子x,那么得到的随机数序列就是相同的
随机数种子的值可以是任意数字
规范化后平均值为0,标准差为1
内置函数 .mean() 、 .std()函数可以分别用来计算平均值和标准差
导入torchvision.transforms模块,用于人工创建更多数据集的方式操纵可用的训练数据。
class 模型名称(nn.Model):
def __init__ (self,input_dim,output_dim):
super().__init__()
self.input_fc = nn.连接方式(input_dim,输出维度)
self.hidden_fc1 = nn.连接方式(输入维度,输出维度)
#多个隐藏层
self.output_fc = nn.连接方式(输入维度,output_dim)
def foward(self,x)
h_1 = F.激活函数(self.input_fc(x))
h_2 = F.激活函数(self.hidden_fc1(h_2))
#...
h_n = F.激活函数(self.hidden_fcn(h_n-1))
y_pred = self.output_fc(h_n)
#定义优化器
optimizer = optim.优化器名(model.parameters())
#定义损失函数,如:criterion = nn.CrossEntropyLoss()
LossFunction = nn.损失函数名()
def train(model,iterator,optimizer,LossFuction):
epoch_loss = 0 #损失总和
epoch_acc = 0 #精确度总和
model.train()
for (x,y) in iterator:
optimizer,zero_grad()#自动清除梯度
y_pred = model(x)
loss = LossFunction(y_pred,y) #计算loss
acc = calculate_accuarcy(y_pred,y) #计算准确度
loss.backward() #梯度下降
optimizer.step()
epoch_loss += loss.item()
epoch_acc += acc.item()
return epoch_loss/len(iterator), epoch_acc/len(iterator)
用于转变数组或矩阵的的形状,常用,特此记录一下
reshape()的默认排列方式是"按行"排列,即行优先,reshape(m,n)=reshape(m,n,order=‘c’);若要改为“按列”排列,可通过修改order参数进行改变,即reshape(m,n,order=‘f’)
参数-1表示无意义
reshape(-1,n)代表将数组重整为n列的二维数组
reshape(n,-1)代表将数组重整为n行的二维数组
torchvision 是pytorch的一个图形库,常用函数有:
在这其中,transforms.Compose()用于串联多个图片变换的操作,transform中的常用操作:
DataLoader 是PyTorch读取数据的一个重要接口,基本上用PyTorch训练模型都会用到。这个接口的目的是:将自定义的Dataset根据batch size大小、是否shuffle等选项封装成一个batch size大小的Tensor,后续只需要再包装成Variable即可作为模型输入用于训练。
class torch.utils.data.DataLoader(dataset, batch_size=1, shuffle=False, sampler=None,
batch_sampler=None, num_workers=0, collate_fn=<function default_collate>,
pin_memory=False, drop_last=False, timeout=0, worker_init_fn=None)
常用参数有:
Conv2d(in_channels, out_channels, kernel_size, stride=1,padding=0, dilation=1, groups=1,bias=True, padding_mode=‘zeros’)
对由多个输入平面组成的输入信号进行二维卷积,常用参数有:
用于设置网络中的全连接层
torch.nn.Linear(in_features,out_features,bais=True)
in_features:输入样本的大小
out_features:输出样本的大小
从输入输出的张量的shape角度来理解,相当于一个输入为[batch_size, in_features]的张量变换成了[batch_size, out_features]的输出张量。
将一个固定不可训练的tensor转换成可以训练的类型parameter,并将这个parameter绑定到这个module里面(net.parameter()中就有这个绑定的parameter,所以在参数优化的时候可以进行优化的),所以经过类型转换这个self.v变成了模型的一部分,成为了模型中根据训练可以改动的参数了。
nn.Parameter()添加的参数会被添加到Parameters列表中,会被送入优化器中随训练一起学习更新
在nn.Module类中,pytorch 也是使用 nn.Parameter来对每一个module的参数进行初始化的
self.v = torch.nn.Parameter(torch.FloatTensor(hidden_size))
源码如下:
class Identity(Module):
r"""A placeholder identity operator that is argument-insensitive.
Args:
args: any argument (unused)
kwargs: any keyword argument (unused)
Examples::
>>> m = nn.Identity(54, unused_argument1=0.1, unused_argument2=False)
>>> input = torch.randn(128, 20)
>>> output = m(input)
>>> print(output.size())
torch.Size([128, 20])
"""
def __init__(self, *args, **kwargs):
super(Identity, self).__init__()
def forward(self, input: Tensor) -> Tensor:
return input
identity模块不改变输入,直接return input
不区分参数的占位符标识运算符。其实意思就是这个网络层的设计是用于占位的,即不干活,只是有这么一个层,放到残差网络里就是在跳过连接的地方用这个层,显得没有那么空虚!
比如我们要加深网络,有些层是不改变输入数据的维度的,在增减网络的过程中我们就可以用identity占个位置,这样网络整体层数永远不变