0
点赞
收藏
分享

微信扫一扫

Pytorch搭建神经网络结构实现数据和图片的分类和回归任务(网络搭建部分)

最近想给自己总结一下下,分享一下自己的学习笔记。

神经网络结构,正如其名,就是像人的大脑神经结构一样,能够对相应的物体有某种识别能力,最简单的神经网络结构用数学表达是: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)

如果觉得对你有帮助,给个赞吧!祝大家学业有成!

举报

相关推荐

0 条评论