之前没有接触过机器学习和深度学习,打算通过学习框架顺带了解机器学习的应用,也顺便学习一下python的用法。
关于TensorFlow和Pytorch的选择上,因为是初学,没有在意两者之间的优劣势,直接选择了pytorch。我想等深入学习之后自然会对框架有更全面客观的判断。
此文记录自己从零学习机器学习和pytorch的过程,其中一些用语可能很不专业,因为全是我的菜鸟理解……
官方文档地址:DEEP LEARNING WITH PYTORCH: A 60 MINUTE BLITZ
中文版:http://pytorch123.com/SecondSection/what_is_pytorch/
1 NEURAL NETWORKS
教程中对一个神经网络训练过程做了以下介绍:
一个典型的神经网络训练过程包括以下几点:
1.定义一个包含可训练参数的神经网络
2.迭代整个输入
3.通过神经网络处理输入
4.计算损失(loss)
5.反向传播梯度到神经网络的参数
6.更新网络的参数,典型的用一个简单的更新方法:weight = weight - learning_rate *gradient
训练的过程通俗一点理解:输入数据,计算输出值与期待值的偏差(损失),将这个偏差通过一定形式反馈给神经网络,不断的迭代这个过程,直到这个偏差收敛。在接下来的代码分析中,要体会这个过程。
在这一节文档中,介绍了一个处理图片的卷积神经网络。因此需要先了解一下图片卷积的过程:
参考:理解图像卷积操作的意义
我理解的是:图片上的卷积,可以看做用一个小滤镜从头到尾过滤一张图片。滤镜中的值不同,最终处理后的图片效果也不同,或是平滑、或是锐化等。暂时先这么简单理解。
直接看代码,看一下Pytorch如何定义一个神经网络的:
import torch
import torch.nn as nn
import torch.nn.functional as F
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
# 1 input image channel, 6 output channels, 3x3 square convolution
# kernel
self.conv1 = nn.Conv2d(1, 6, 3)
self.conv2 = nn.Conv2d(6, 16, 3)
# an affine operation: y = Wx + b
self.fc1 = nn.Linear(16 * 6 * 6, 120) # 6*6 from image dimension
self.fc2 = nn.Linear(120, 84)
self.fc3 = nn.Linear(84, 10)
def forward(self, x):
# Max pooling over a (2, 2) window
x = F.max_pool2d(F.relu(self.conv1(x)), (2, 2))
# If the size is a square you can only specify a single number
x = F.max_pool2d(F.relu(self.conv2(x)), 2)
x = x.view(-1, self.num_flat_features(x))
x = F.relu(self.fc1(x))
x = F.relu(self.fc2(x))
x = self.fc3(x)
return x
def num_flat_features(self, x):
size = x.size()[1:] # all dimensions except the batch dimension
num_features = 1
for s in size:
num_features *= s
return num_features
net = Net()
print(net)
在上面的代码中,用到了几个Pytorch的库方法。Conv2d、Linear、max_pool2d、relu。分别了解一下这函数的功能:
1.1 Conv2d()
torch.nn.Conv2d(1, 6, 3)构造了一个卷积层,看一下Conv2d的构造参数列表:
class Conv2d(in_channels: int, out_channels: int, kernel_size: _size_2_t,
stride: _size_2_t=..., padding: _size_2_t=..., dilation: _size_2_t=..., groups: int=..., bias: bool=..., padding_mode: str=...)
- in_channels:表示输入通道数,如果是一张灰度图片,通道数就是1。
- out_chaneels:表示卷积后的通道数。
- kernel_size: 卷积核的大小。此处大小为 3*3。卷积核可以理解为一个处理图片的滤镜。
结合参数的含义,可以得知 torch.nn.Conv2d(1, 6, 3)
构造了一个能够处理 1通道图片为6通道图片的卷积层,这个卷积层的卷积核是 3*3。
未完待续……
网友评论