新手初学,在此记录,希望能对大家有所帮助

一、安装pytorch(安装前先安装anaconda,或是在其他虚拟环境下比如virtualenv)

下载网址https://ptorch.com/news/30.html

在此网址内选择自己系统以及版本进行下载,避免了官网点不动、commend无法生成的问题。

安装过程中遇到问题:oserror 13 permission deny 

解决方法:1.sudo 参考

2.鉴于1的方法因为我使用hpc服务器不在sudo用户组所以不可用,我的解决方法是(多谢师姐)pip install --user 后正常


二、初步学习使用pytorch

找到一个比较好的简书作者,但是该作者只写了五篇,链接已分别对应着一一附上。

1.参考网址:http://www.jianshu.com/p/5ae644748f21这篇简书内容较为简单,适合0基础初学。

其中有介绍【Tensor的加法(四种)】方法四:>>>b.add_(a) #把运算结果覆盖掉b    方法五: >>>b.add(a) #把结果输出但并不覆盖b   

其中有介绍【tensor(张量)除加法以外的其他操作】(比如转置、切片等):参考网址http://pytorch.org/docs/master/torch.html(英文版)

其中有介绍【张量tensor可与多维数组array互换】公用一块内存,只是不同表达方式。对于ones()函数,torch.ones()与numpy.ones()生成的结果不同,向量&数组。

其中有介绍【CUDA的神助攻】

2.autograd自动微分  http://www.jianshu.com/p/cbce2dd60120

其中有介绍【Variable:是Tensor的一个wrapper,不仅保存了值,而且保存了这个值的creator,需要BP的网络都是Variable参与运算

 其中有介绍【norm()函数 求平方根

 其中有介绍【>>>y.backward()   #backward()函数表示backprop

                     >>>x.grad    #返回y关于x的梯度向量

 其中有介绍【autograd是专门为了BP算法设计的,所以这autograd只对输出值为标量的有用。

 其中有介绍【我们之所以可以实现autograd多亏了Variable和Function这两种数据类型的功劳。要进行autograd必需先将tensor数据包成Variable。


2.99.在三讲开始之前 需要掌握深度卷积神经网络知识

      

其中对偏置参数解释:




3.构造一个小型CNN   http://www.jianshu.com/p/cde4a33fa129

3.0 讲解正式代码前我们需要先了解torch.nn包所具有的基本类型,这个包是用来构建神经网络的。

学习网址:

 

构建一个神经网络需要以下几步:

  • 定义神经网络的

权重

  • ,搭建网络结构
  • 遍历整个数据集进行训练 
  • 将数据输入神经网络
  • 计算loss
  • 计算网络权重的梯度
  • 更新网络权重 
  • weight = weight + learning_rate * gradient

3.1 这个小型cnn 完成了lenet。 其完整代码及注释:https://pan.baidu.com/s/1slnkpxN(来源简书)

(神经网络中的激活函数l: 参考网站:神经网络回顾-Relu激活函数 - 1357 - 博客园  )


#coding=utf-8


import torch


import torch.nn as nn


import torch.nn.functional as F


from torch.autograd import Variable


 


class Net(nn.Module): #需要继承这个类


#定义Net的初始化函数,这个函数定义了该神经网络的基本结构


def __init__( self ):


super (Net, self ).__init__() #复制并使用Net的父类的初始化方法,即先运行nn.Module的初始化函数


self .conv1 = nn.Conv2d( 1 , 6 , 5 ) # 定义conv1函数的是图像卷积函数:输入为图像(1个频道,即灰度图),输出为 6张特征图, 卷积核为5x5正方形


self .conv2 = nn.Conv2d( 6 , 16 , 5 ) # 定义conv2函数的是图像卷积函数:输入为6张特征图,输出为16张特征图, 卷积核为5x5正方形


#以上是两个卷积层,都不包含激活函数的。#以下是三个全连接层。


self .fc1   = nn.Linear( 16 * 5 * 5 , 120 ) # 定义fc1(fullconnect)全连接函数1为线性函数:y = Wx + b,并将16*5*5个节点连接到120个节点上。


self .fc2   = nn.Linear( 120 , 84 ) #定义fc2(fullconnect)全连接函数2为线性函数:y = Wx + b,并将120个节点连接到84个节点上。


self .fc3   = nn.Linear( 84 , 10 ) #定义fc3(fullconnect)全连接函数3为线性函数:y = Wx + b,并将84个节点连接到10个节点上。


 


#定义该神经网络的向前传播函数。该函数必须定义,一旦定义成功,向后传播函数也会自动生成(autograd)


def forward( self , x): #输入x


x = F.max_pool2d(F.relu( self .conv1(x)), ( 2 , 2 )) #输入x经过卷积conv1之后(x->c1),经过激活函数ReLU,使用2x2的窗口进行最大池化Max pooling(c1->s2),然后更新到x。


x = F.max_pool2d(F.relu( self .conv2(x)), 2 ) #输入x经过卷积conv2之后(s2->c3),经过激活函数ReLU,使用2x2的窗口进行最大池化Max pooling,然后更新到x。


x = x.view( - 1 , self .num_flat_features(x)) #view函数将张量x变形成一维的向量形式(c3->s4),总特征数并不改变,为接下来的全连接作准备。


x = F.relu( self .fc1(x)) #输入x经过全连接1,再经过ReLU激活函数,然后更新x (s4->c5)


x = F.relu( self .fc2(x)) #输入x经过全连接2,再经过ReLU激活函数,然后更新x (c5->f6)


x = self .fc3(x) #输入x经过全连接3,然后更新x (f6->output)


return x


 


#使用num_flat_features函数计算张量x的总特征量(把每个数字都看出是一个特征,即特征总量),比如x是4*2*2的张量,那么它的特征总量就是16。


def num_flat_features( self , x):


size = x.size()[ 1 :] # 这里为什么要使用[1:],是因为pytorch只接受批输入,也就是说一次性输入好几张图片,那么输入数据张量的维度自然上升到了4维。【1:】让我们把注意力放在后3维上面


num_features = 1


for s in size:


num_features * = s


return num_features


 


 


net = Net() #对net类实例化一个对象net


net


 


# 以下代码是为了看一下我们需要训练的参数的数量


print net #输出该类的五个变量c1\c3\c5\f6\output 以及定义他的函数及参数


params = list (net.parameters()) c1 S2\c3 S4\c5 s4->c5(即fc1)\c5->f6 f6(即fc2)\f6->output output (即fc3)



k = 0


for i in params: #eg:x->c1 c1


l = 1


print "该层的结构:" + str ( list (i.size())) #c1有6个卷积层 x有1个卷积层 c1在x上的卷积核大小为5*5


for j in i.size():


l * = j


print "参数和:" + str (l) #参数和6*1*5*5


k = k + l #用来累加总参数和


 


print "总参数和:" + str (k)

4.该作者在此整理了可下载图片训练数据集的网址:http://www.jianshu.com/p/8da9b24b2fb6

5.此作者的最后一篇:训练和测试cnn :http://www.jianshu.com/p/e4c7b3eb8f3d


6.关于softmax分类器 的讲解