新手初学,在此记录,希望能对大家有所帮助
一、安装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
构建一个神经网络需要以下几步:
权重
,搭建网络结构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)
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