在本文章中,我们将使用PyTorch
从头开始实现一个简单的神经网络。
注:阅读本文之前,最好可以了解神经网络的工作原理。
虽然有很多库可以用于深度学习,但我最喜欢 PyTorch
。作为一名python
程序员,我喜欢 PyTorch
的 python
行为是原因之一。它主要使用了 python
的风格和能力,这是很容易理解和使用。
在其核心,PyTorch
提供两个主要特性:
-
一个类似于
numpy
的n
维张量,但可以在gpu
上运行; -
自动区分建立和训练神经网络。
什么是神经网络?
神经网络是一组可以模仿人类大脑,并被设计用来识别模式的算法。这些网络是由接近神经元的单个部分构成的,通常称为单元或简称为“神经元”每个单元有一定数量的加权输入。这些加权的输入总和在一起(一个线性组合) ,然后通过一个激活函数来得到单位输出。
神经网络中的节点类型:
-
输入单元ーー把外界的资讯输入网络,统称为「输入层」。这些节点不执行任何计算,它们只是将信息传递给隐藏节点;
-
隐藏单元ーー这些节点与外界没有任何直接联系。它们执行计算并将信息从 Input 节点传输到
Output
节点。一个隐藏节点的集合形成了一个“隐藏层”。虽然前馈网络只有一个输入层和一个输出层,但是它可以有零个或多个隐藏层; -
输出单元ーー输出节点统称为「输出层」 ,负责计算及将网络上的资讯传送到外界。
每一层包含一个或多个节点。
码字不易废话两句:有需要python学习资料的或者有技术问题交流 “点击”即可
建立神经网络
PyTorch
提供了一个模块 nn
,使得构建网络更加简单。我们将看到如何建立一个有784个输入,256个隐藏单元,10个输出单元和一个softmax
输出单元的神经网络。
from torch import nnclass Network(nn.Module):
def __init__(self):
super().__init__()
# Inputs to hidden layer linear transformation
self.hidden = nn.Linear(784, 256)
# Output layer, 10 units - one for each digit
self.output = nn.Linear(256, 10)
# Define sigmoid activation and softmax output
self.sigmoid = nn.Sigmoid()
self.softmax = nn.Softmax(dim=1)
def forward(self, x):
# Pass the input tensor through each of our operations
x = self.hidden(x)
x = self.sigmoid(x)
x = self.output(x)
x = self.softmax(x)
return x
注:Softmax
激活函数函数,也称为 softargmax
或 normalizd exponential
函数,可以讲一个含任意实数的K维向量z“压缩”至另一个K维实向量f(z)
中,使得每一个元素的范围都在(0, 1)
之间,且所有元素的和为1
。
让我们把这一行一行地过一遍。
class Network(nn.Module):
这里我们继承了 nn.Module
。与 super ().__init__()
结合将创建一个可以提供许多有用的方法和属性的类。当你为你的网络创建一个类的时候通常都会从nn.Module
进行继承。类的名称可以自定义。
self.hidden = nn.Linear(784, 256)
这一行创建了一个线性映射模块,xW + b
,包含784个输入和256个输出,并将其赋值给 self.hidden
。该模块自动创建的权重和偏差,我们将在forward
函数中使用,并且可以通过net.hidden.weight
和 net.hidden.bias
从创建的网络中访问权重和偏差。
self.output = nn.Linear(256, 10)
同样地,这也创建了另一个有256个输入和10个输出的线性映射。
self.sigmoid = nn.Sigmoid()
self.softmax = nn.Softmax(dim=1)
这里我定义了用于 sigmoid
激活和 softmax
输出的操作。并设置 dim = 1
在 nnSoftmax (dim = 1)
对某一维度的列进行softmax
运算。
def forward(self, x):
用 nn.Module
创建的 PyTorch
网络必须定义了一个forward
方法,它接受一个张量 x
,并将其传递给在 __init__
方法中定义的操作。
x = self.hidden(x)
x = self.sigmoid(x)
x = self.output(x)
x = self.softmax(x)
这里输入张量 x 通过每个操作重新赋值给 x
。我们可以看到,输入张量通过隐藏层,然后是 Sigmod
函数,然后是输出层,最后是Softmax
函数。您在这里将变量命名为什么并不重要,只要操作的输入和输出符合您想要构建的网络体系结构即可。在__init__
方法中定义事物的顺序并不重要,但是您需要在 forward
方法中正确排列操作的顺序。
# Create the network and look at it's text representation
model = Network()
model
利用神经网络建立神经网络
PyTorch
提供了一种构建类似于张量按顺序通过操作的方便方法——nn.Sequential
。我们也可以使用这个来建立等价的网络:
# Hyperparameters for our network
input_size = 784
hidden_sizes = [128, 64]
output_size = 10
# Build a feed-forward network
model = nn.Sequential(nn.Linear(input_size, hidden_sizes[0]),
nn.ReLU(),
nn.Linear(hidden_sizes[0], hidden_sizes[1]),
nn.ReLU(),
nn.Linear(hidden_sizes[1], output_size),
nn.Softmax(dim=1))
print(model)
这里我们的模型是一样的,784个输入单元,一个有128个单元的隐藏层,ReLU
激活函数,64个单元的隐藏层,另一个 ReLU
函数,然后带有10个单元的输出层,Softmax
层。
您还可以传入 OrderedDict
来命名各个层和操作,而不是使用增量整数。注意,字典键必须是唯一的,因此每个操作必须有不同的名称。
from collections import OrderedDict
model = nn.Sequential(OrderedDict([
('fc1', nn.Linear(input_size, hidden_sizes[0])),
('relu1', nn.ReLU()),
('fc2', nn.Linear(hidden_sizes[0], hidden_sizes[1])),
('relu2', nn.ReLU()),
('output', nn.Linear(hidden_sizes[1], output_size)),
('softmax', nn.Softmax(dim=1))]))
model
现在,您可以通过整数或名称访问层,如下所示:
print(model[0])
print(model.fc1)
以上就是小编今天为大家带来的内容,小编本身就是一名python开发工程师,我自己花了三天时间整理了一套python学习教程,从最基础的python脚本到web开发,爬虫,数据分析,数据可视化,机器学习,等,这些资料有想要的小伙伴 " 点击 " 即可领取