想入门深度学习,感觉无从下手,怎么办?除了理论上的学习之外,最快速的方法就是做项目:包括但不限于别人已经做好的项目,导师布置的项目作业,自己接到的项目。做项目的方法是模仿,也就是抄。抄别人的项目,再自己总结:
- 这个模块的作用是什么
- 这个模块有哪些重要的类和函数
- 这些重要的类和函数在哪里调用的,作用是什么
- 数据输入输出的格式,为什么要这么用
从mnist分类开始,到经典的RCNN或者YOLO。抄完一遍基本上已经算是能够自己完成一些小项目了。剩下的就是思考怎么涨点的问题了。项目做多了就会发现,基本所有的深度学习项目都是一个套路,不同的是有一些项目复杂一些,函数比较多或者是引入了其它的代码库。但是总体还是差不多的,举cnn网络为例,一般包括以下3部分:
- dataloader(包括预处理)
- train
- predict
1.dataloader:
最主要是写好继承自dataset的类,写好以后丢到dataloader里面不就OK啦。那这个类最主要的是三个方法:
- init():主要是数据格式的转换,还有一部分预处理
- getitem():主要就是从数据集里获取数据项的item和label
- lens():返回数据项个数
2.train:
网络结构五花八门,但是基本都是那么几个步骤,跟八股文一样。
-
定义网络结构 class Net()
-
定义损失函数和optimizer
-
划分数据集
-
定义训练过程(以梯度下降算法为例,基本的流程都是差不多的)
### 梯度下降算法 ### loss = loss_func(output, input) # 损失函数,输出和真实标签的loss,二者位置不可颠倒 optimizer.zero_grad() # 清除之前学到的梯度的参数 loss.backward() # 反向传播,计算梯度 optimizer.step() # 应用梯度(权重更新) ### 梯度下降算法 ###
-
保存模型
3.predict:
- 加载模型
model = torchvision.models.resnet50(pretrained=True)
model.load_state_dict(torch.load("resnet.pt"))
- 加载数据
for images, labels in test_loader:
images = images.to(device)
labels = labels.to(device)
with torch.no_grad():
outputs = model(images)
loss = loss_func(outputs, labels)
_, predicts = torch.max(outputs, 1)
loss_val += loss.item() * images.size(0)
corrects += torch.sum(predicts.view(-1) == labels.view(-1)).item()
- 计算结果
test_loss = loss_val / len(test_loader.dataset)
test_acc = corrects / len(test_loader.dataset)
print("Test Loss: {}, Test Acc: {},corrects is: {}".format(test_loss, test_acc,corrects))
此外,还有一些需要考虑到的,比如如何使用pytorch调用gpu进行训练、如何使用多个gpu进行训练等等。