介绍
这一章节主要介绍模型如何搭建起来的,以及模型上的一些训练方法。
1.模型搭建
1.1 直接训练
1 | loss_list = [] |
我batch_size的设置更改的比较多,再调整模型参数时主要调整了卷积的层数,神经元个数,卷积核的尺寸以及stride等。这里对参数需要注意的地方逐一记录一下。
1 | nn.Conv2d(in_channels=3, out_channels=256, kernel_size=7,stride=2) |
每一层的卷积都跟它上一层的输入输出有关,在第一层的卷积时,有几个参数需要注意。
in_channels: 为输入的维度,是图片的通道数
out_channels: 是自己可以随意设置的第一层卷积的输出
kernel_size: 是卷积核的尺寸
stride: 是卷积步长
卷积图片尺寸的计算为:
(W - kernel——size)/stride+1
因为我的图片较大,所以设置stride为2,可以快速的提取特征,经过池化后缩小尺寸。
注意:在此可以设置kernel_size为原始图像大小,但是输出的图片为XX1*1,就无法进行池化运算了。一般卷积核大小kernel_size设置为3,5,7为宜。
在卷积层之后,输入到线性层之前,使用了t.flatten(start_dim=1),这里是因为卷积核输出后的数据格式是[xx11],相当于是一个四维数据,输入linear的时候需要是[xx]的形式,所以用了flatten展平,start_dim=1是不改变原有的尺寸。
还有一点,在输入linear的时候实际上与数据做的是矩阵运算,所以,对于[xy]维度的数据,需要[yx]的权重矩阵进行乘法运算才行。
解决t.reshape(-1,…)的问题
t.reshape(-1,…)中的第二个参数是t.size()除了第一个参数之外参数的乘积,也是接下来linear层的第一个输入。
所以想要省事可以写成
1 | from functools import reduce |
reshape后的数据input=mul_t的维度即可,output可以自行设置。
1.2 Finetune模型微调
1 | # 冻结模型参数的函数 |
指修改部分层的参数
Fine-tune可以只保留部分层的参数,可是使用下面代码提取
1 | # 去掉model的后5层 |
可以修改原始resnet模型当中的参数,使用resnet_layer[][]进行提取,print(network)的时候有一些会给出某一层或者某一sequence的标号。
1 | self.resnet_layer[0] = nn.Conv2d(in_channels=1, out_channels=8, kernel_size=3,stride=1) |
修改模型是可以修改已有的resnet18当中的模型结构和模型参数的,可以直接使用model.进行修改。
一般图像类的模型,修改后几层的参数,而一般语义类的模型,修改前几层的参数,这于模型训练时先后提取的特征有关
2.自定义损失函数
针对样本不均衡的问题,使用focal_loss作为损失函数
1 | class focal_loss(nn.Module): |
注意,想要使用focal_loss函数,在训练的时候loss不能是F.的形式,要进行修改。
原始格式:
1 | preds = network(images) # Pass batch |
需要修改成:
1 | preds = network(images) # Pass batch |
3.实际训练
1 | loss_list = [] |
训练过程就是把数据放到我们已经搭建好的模型里面跑一下,这里需要注意的是损失函数的设置,将会影响分类的准确度。
这里的total_correct是整体准确的个数,用它除以总数就是准确率了。
- Post title:深度学习——模型训练篇
- Post author:Yang Li
- Create time:2022-08-24 21:12:00
- Post link:https://yangli-os.github.io//2022/08/24/深度学习-模型训练/
- Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.