pytorch初学(1)(安装及入门)

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

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

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

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

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

解决方法:1.sudo 参考http://blog.csdn.net/jiangjieqazwsx/article/details/47029477

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.在三讲开始之前 需要掌握深度卷积神经网络知识

http://www.cnblogs.com/Rambler1995/p/5467074.html       

http://blog.csdn.net/xuanyuansen/article/details/41800721

其中对偏置参数解释:

http://blog.csdn.net/xwd18280820053/article/details/70681750

http://blog.csdn.net/kaido0/article/details/53161684


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

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

学习网址:

http://blog.csdn.net/xmdxcsj/article/details/49314297

http://blog.csdn.net/u012436149/article/details/54627597 

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

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

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

(神经网络中的激活函数l: 参考网站:神经网络回顾-Relu激活函数 - 1357 - 博客园  http://www.cnblogs.com/qw12/p/6294430.html)

#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()) #将NET的参数共10个 变成列表形式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分类器 的讲解

http://blog.csdn.net/hlx371240/article/details/40015395

http://blog.csdn.net/hlx371240/article/details/40201499

http://blog.csdn.net/pi9nc/article/details/19336629

http://blog.csdn.net/hlx371240/article/details/40201499




你可能感兴趣的:(自然语言处理)