手写体作为深度学习的“Hello world”,几乎所有的课程都会讲到这个,今天带着大家一些看看吧。
如果对你有所帮助,点个赞给个小关注,以后一起交流学习。
前言
首先和大家讲讲我为啥会看到这个,因为我需要写论文,关于图像增强的,比如夜视,曝光,去雨,去雪,去雾等,以往采用的是传统的方法“直方图,暗通道,retinex”等,现在随着深度学习的发展,只从12年人机大战,深度学习迅速爆棚,由于结果惊艳,所以深度学习进入了人们感兴趣的领域。
好不夸张的说,现在各行各业都在使用深度学习,这个也是我需要研究的课题。
为了实现这些,需要从零开始,慢慢摸索。
好啦,不扯了。
一、需要的基础
1 Python编程语法
2 numpy学习
3 matplotlib学习
4 pytorch(tensorflow等也可以)
5 数据集导入相关
6 CV2(有可能会用到)
7 卷积神经网络知识(卷积,池化,融合,步长,padding,激活函数等)
8 线性回归,分类等问题(部分数学知识,均方误差,梯度求导,激活函数等)
先列举这么多吧,这么多基础就可以看懂今天的例子,然后你也会明白我说的内容,由于能力有限,难免有说错或者不准确的地方,感谢各位可以进行指导和纠正,自己也是初入茅庐,仅供大家参考。
二、正式讲解
做深度学习无非就是
导入数据集
大家模型
训练模型
测试模型
2.1 导入本例程需要的库
import torch
from torchvision import transforms
from torchvision import datasets
from torch.utils.data import DataLoader
import torch.nn.functional as F
import torch.optim as optim
import matplotlib.pyplot as plt
import torch.nn.modules
这些库的作用很清晰,有编程基础和深度学习的小伙伴一眼就可以看出,就是常见的语法,框架,绘图,数据集导入等
这里补充说明两个
import torch.nn.functional as F
import torch.optim as optim
这两个就是为了使用torch框架中的函数,已经优化等
2.2 加载数据集
这里导入下载的minist数据集(注意:minist数据集分为测试集,训练集)
batch_size = 64
transform = transforms.Compose([
transforms.ToTensor(), #转成张量
transforms.Normalize((0.1307,),(0.3081,)) # 神经网络使用(0,1)分布
])
train_dataset = datasets.MNIST('MNIST_data',
train=True,
download=True,
transform=transform)
train_loader = DataLoader(train_dataset,
shuffle = True,
batch_size = batch_size)
test_dataset = datasets.MNIST('MNIST_data',
train=False,
download=True,
transform=transform)
test_loader = DataLoader(test_dataset,
shuffle = False,
batch_size=batch_size)
batch_size = 64这个需要和大家说一下,这个是干啥的呢?
一开始我也不太了解,只知道是批次训练,一次训练多少,最好发现,是为了计算机的内存考虑的,假如数据集比较小还好,不用管这些,但是如果数据集比较大,跑起来可以把电脑内存跑爆炸。所以这里采用批次训练,一次一个批次,不仅可以正常运行,而且还可以提高模型的泛化性。
shuffle = False,这个也要说一下,这个是重新洗牌,避免每次选的一样,打乱顺序。
2.3 卷积层操作
class InceptionA(torch.nn.Module):
def __init__(self,in_channels):
super(InceptionA,self).__init__()
self.branch1x1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
self.branch5x5_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
self.branch5x5_2 = torch.nn.Conv2d(16,24,kernel_size=5,padding=2)
self.branch3x3_1 = torch.nn.Conv2d(in_channels,16,kernel_size=1)
self.branch3x3_2 = torch.nn.Conv2d(16,24,kernel_size=3,padding=1)
self.branch3x3_3 = torch.nn.Conv2d(24,24,kernel_size=3,padding=1)
self.branch_pool = torch.nn.Conv2d(in_channels,24,kernel_size=1)
def forward(self,x):
branch1x1 = self.branch1x1(x)
branch5x5 = self.branch5x5_1(x)
branch5x5 = self.branch5x5_2(branch5x5)
branch3x3 = self.branch3x3_1(x)
branch3x3 = self.branch3x3_2(branch3x3)
branch3x3 = self.branch3x3_3(branch3x3)
branch_pool = F.avg_pool2d(x,kernel_size=3,stride=1,padding=1)</