最近想给自己总结一下下,分享一下自己的学习笔记。
神经网络结构,正如其名,就是像人的大脑神经结构一样,能够对相应的物体有某种识别能力,最简单的神经网络结构用数学表达是:f(x)=wx+b,其中w,b,就是网络所要学习的参数,我们可以称为知识。正是学习了这样的知识,网络才能够辨别出相应的物体。举个例子,当网络知道很多狗的种类和样子,那么网络学习到狗的特征之后,会将这些特征当做知识。然后再遇到狗的图片的时候,就会知道这是狗。但是我想大家也知道f(x)=wx+b其实过于简单,当有多个线性层的时候,即f(wx+b)=w(wx+b)+b..........。其实和一个线性层没什么区别,因为它就是一条直线。所以就会引出了激活函数,让这样的直线变成曲线,从而能够拟合更复杂的特征分布情况。下面我们就来搭建最简单的神经网络,各参数都会进行注释。
其中神经网络包含的东西有:输入层,隐藏层,输出层。其中最为重要的是隐藏层,里面会包含激活函数,批归一化,dropout等等。
import torch
import torch.nn as nn
class Net(nn.Module):#继承的是nn.Module的父类
def __init__(self,in_feature,hidden_layer=8,number_class=10):#进行示例化的函数
"""
:param in_feature: 输入层的特征数量,
:param hidden_layer: 这块层数可以自己任意定,但是最后定位2的次方的数
:param number_class: 表示分类的类别数,如果是二分类就是2,十分类就是10等
"""
super(Net, self).__init__()#表示继承Net
#定义相关的层
self.layer_1=nn.Linear(in_features=in_feature,out_features=hidden_layer,bias=True) #bias表示是否进行偏置,默认为True
self.layer_2 = nn.Linear(in_features=hidden_layer, out_features=number_class, bias=True)#此时输入的应该是上一层的隐藏层数
self.relu=nn.ReLU(True)#这代表的是激活函数,激活函数有很多种,这是其中的一种。Ture表示能够在线性层上面进行激活作用,默认为Ture
self.dropout=nn.Dropout(0.2)#表示将神经元进行0.2概率的失活,就像机器学习的剪枝一样
self.softmax = nn.Softmax(dim=1)#让输出的结果是概率形式,这样更好地判断哪个类别的概率大,并且是在第二个维度上进行,dim=0表示第一个维度,这个需要牢记
def forward(self,x):#self表示Net,意思就是二者相等 forward便是进行前项传播开始
#我们直接简单点,输入的维度直接为[m,n],m表示多少条数据,n表示一条数据有多少特征
out=self.layer_1(x)
out=self.relu(out)
out=self.dropout(out)
out = self.layer_2(out)
out = self.softmax(out)
return out
if __name__ == '__main__':
a=torch.randn((16,8))#随机生成16条数据,每个数据有8个特征
model=Net(in_feature=8)#传入输入维度,也就是输入特征
out=model(a)
print(out.shape)
兴许有的小伙伴是对图片进行分类或者回归任务的,那该怎么弄呢,图片是三维的,我们可以先将图片的宽高进行展平,就行了。如下面代码:
import torch
import torch.nn as nn
class Net(nn.Module):#继承的是nn.Module的父类
def __init__(self,in_feature,hidden_layer=8,number_class=10):#进行示例化的函数
"""
:param in_feature: 输入层的特征数量,
:param hidden_layer: 这块层数可以自己任意定,但是最后定位2的次方的数
:param number_class: 表示分类的类别数,如果是二分类就是2,十分类就是10等
"""
super(Net, self).__init__()#表示继承Net
#定义相关的层
self.layer_1=nn.Linear(in_features=in_feature,out_features=hidden_layer,bias=True) #bias表示是否进行偏置,默认为True
self.layer_2 = nn.Linear(in_features=hidden_layer, out_features=number_class, bias=True)#此时输入的应该是上一层的隐藏层数
self.relu=nn.ReLU(True)#这代表的是激活函数,激活函数有很多种,这是其中的一种。Ture表示能够在线性层上面进行激活作用,默认为Ture
self.dropout=nn.Dropout(0.2)#表示将神经元进行0.2概率的失活,就像机器学习的剪枝一样
self.softmax = nn.Softmax(dim=1)#让输出的结果是概率形式,这样更好地判断哪个类别的概率大
def forward(self,x):#self表示Net,意思就是二者相等 forward便是进行前项传播开始
#我们直接简单点,输入的维度直接为[m,n],m表示多少条数据,n表示一条数据有多少特征
#我们直接复杂点,输入的维度直接为[m,p,n],m表示多少条数据,p,n分别为长和宽 可以想象成正方体就好理解了
#对于[m,p,n]我们需要变成2维的,所以就只能将p,n相乘,为什么不乘m呢?因为m表示的是多少个数据,所以不能乘
m, p, n=x.shape
x=x.view(m,-1)#相信大家知道view的作用,-1表示让计算机自己将剩下的数进行相乘 此处也能用flatten来实现,
out=self.layer_1(x)
out=self.relu(out)
out=self.dropout(out)
out = self.layer_2(out)
out = self.softmax(out)
return out
if __name__ == '__main__':
a=torch.randn(2,2,4)#随机生成16条数据,每个数据有8个特征
model=Net(in_feature=8)#传入输入维度,也就是输入特征
out=model(a)
print(out.shape)
如果觉得对你有帮助,给个赞吧!祝大家学业有成!