目录
0、背景
1、分类任务介绍:
2、网络架构
3、手写网络
3.1、读取数据集
3.2、查看数据集
3.3将x和y转换成tensor的格式
3.4、定义model
0、背景
其实分类和回归本质上没有太大区别,只是说最终得到的结果是不同的,以及使用的损失函数是不同的,中间的网络架构相对于来说是比较固定的。
1、分类任务介绍:
分类任务中标签的设计稍微不同,比如上图中的9他预测出来就是123456789中的哪一个,不是这样的,而是我们的标签他也是一个one_hot encoding的编码,这个one_hot encoding的编码我们要得到的最终他预测的一个结果不是一个值而是10个值(0到9这10个数),我们得到的是当前这个输入它属于0到9各自的可能性(比如上图0.12表示属于1的概率是12%,属于9的概率是87%);最终在分类任务当中得到的一个结果是:比如说你做10分类,最终得到的结果是10个概率值,表示他分别属于每一个类的概率值,那么100分类的话就会得到100个概率值,这个就是基于当前输入,得到我最终结果的一个过程。结果是这样的概率值,所以标签我得是跟结果一致的条件才行,如果说在这里我们拿到的标签他不是一个50000x10的,需要再把它做一个one_hot encoding,对标签来说是一样的,如果标签是9的话,那我one_hot encoding就是(0000000001),所以意思就是我们的结果是one_hot encoding编码那么我们的标签也要相应的转化成one_hot encoding编码的形式。
2、网络架构
3、手写网络
3.1、读取数据集
会判断你有没有下载过Mnist数据集,如果没下载过,他会自动帮你下载。
解压文件。
3.2、查看数据集
读进来一张图像,50000是样本数,784=28x28x1=h x w x c(长宽高和颜色通道),Mnist数据集是黑白图,他只有一个颜色通道,可以把784当做特征数。
3.3将x和y转换成tensor的格式
3.4、定义model
介绍functional的方法:
有时间使用nn.Module,有时间使用nn.functional的方法?Module里边有的,functional里边也有,如何选择?
所以一般是模型中有带学习参数的,比如说一些卷积层和一些全连接层,但凡带参数的我们使用nn.Module;一些激活函数或者是一些损失函数,但凡这些不带参数的没有w和b的我们就用nn.functional里边的方法,这样更直接一些。
分类问题一般使用交叉熵损失函数,所以这里直接调用functional里边的cross_entropy(所以这里就是在functional当中有很多不带参数类似于激活函数,损失函数这些都是直接拿functiuonal当中的直接调用)。
指定batch_size=64,将x_batch和y_batch全部取出来,定义偏执参数。然后就是如何得到一个损失值,直接把loss_func拿到手,里边需要传进来的是当前的一个预测值和标签值,定义的model函数就是预测值,yb就是标签值,预测和标签都有了就可以得到他实际的损失值,所以通过function当中调用的一些函数,我们是可以直接拿过来进行计算的。
介绍Module的方法:
这个方法用的比较多,在一些正规的项目或者是比较大型的项目中用的比较多,比如是这样构建自己的网络的:
先把nn导进来,定义一个类构建自己的网络,一定要去继承不只是光定义一个类,继承的就是你导进来的nn,nn.module一定要去继承,不做继承后边写的东西都没用,都白写,因为很多核心功能都是在这个里边写好了,我们直接继承过来就行了,不光要去继承,还得把他的构造函数给拿出来,先定义一个方法def __init__(self),里边继承一下人家的构造函数,super.__init__(),接下来定义自己的模块,隐层和输出层,这里边只是定义有哪些层,我们一会是要用到,。
用到的时候怎么用,就要下边再写一个方法,再定义一个forward方法,forward方法的意思就是在这里你不用去写反向传播了,反向传播是pytorch框架人家自动帮你去做的,只要你把前向传播定义好,整个网络图就有了,有了网络图之后,人家会自动的帮你计算反向传播,所以这里不用麻烦的再写一个反向传播,只用写一个前向传播就可以了,def forward(self,x)前向传播里边有一个输入,这些参数可以随意写,有哪些输入,这里有了输入,先通过哪个层就是我们之前定义的层,第一个是定义的hidden层,x输入进去传进到hidden层,调用F里边的激活函数;将第一个隐层结果传入到第二个隐层,第三步再传到我的输出层得到最终的一个结果,再把结果return回去就可以了。
PS:实际在做神经网络或者模型的时候,最主流的方法就是我自己定义一个类,在这个类里边继承nn.Module模块,写好继承构造函数,然后写好有哪些层,这是初始化方法;初始完之后,写一个前向传播,前向传播里边写一个输入,基于输入一步步的去走,看得到的结果,然后返回回去就完事了,这个就是前向传播,反向传播我们不用自己去写,它会自动的帮我们完成这样一件事;
定义完网络之后,我们可以查看这个网络里边都有什么东西,所以首先把这个类给他实例化出来,net表示我们刚才构造好的这个网络,打印net看一下。
net是定义好的网络,写一个循环展示一下网络当前的名字以及参数,把所有的参数全部进行一个打印:(所以可以看出我们定义好net网络之后,人家已经自动的帮我们初始化了w和b)
---------------------上述就是如何去构建一个网络--------