pytorch学习笔记-基础篇(卷积)
本篇主要记录一下一些基础的pytorch知识,卷积的一些基本情况
一、feature map
对于灰度图片,用0~255(或者压缩到0~1)表示灰度,即下图第一张图到第二张的转化。如果是彩色图片,则用3张表[R, G, B]分布表示3个通道的颜色信息
二、全连接层
对于如下的简单全连接层,一共需要1.6 MB去存储参数,这对于当时的环境是一个很大的数。
1. weight sharing
为了解决这一问题,科学家提出了一个模仿人眼的“局部相关性”的机制,并不一次看到全部视野,只看部分;简单来说,就是下图第一部分中的:用一个小窗口逐步扫描整张图片
三、卷积
如下是卷积在数字信号处理中的定义
下面是卷积在网络中的运作过程
y(0, 0) = 卷积核不偏移,对应位置相乘求和
y(1, 0) = 卷积核x方向偏移一个单位,对应位置相乘求和
...
1. 卷积的应用
锐化图片
给图片和这样一个卷积核作卷积所得就会让图片变得更加锐利
模糊图片
边缘检测
pytorch学习笔记-高阶篇(小技巧)
本篇主要介绍一些pytorch的一些小技巧,包括动量,学习率衰减,early stopping,drop和随机梯度下降。
一、动量 momentum
第一幅图是没有动量影响的更新过程,第二幅图加了动量,可以看到不考虑历史因素,只考虑当前值会使得更新曲线很尖锐,不平滑,最终也只到达了局部极小值而没有到达最优解的位置
设置动量的写法如下,只需要在优化器中加上动量参数
二、学习率衰减
图中可以看出学习率过大过小都会导致问题,比较好的办法是一开始大,然后逐渐变小,这就是学习率衰减。
方法1
在loss的变化过程中,如果很长时间都不变,要么是已经到达了一个比较好的值,要么是此时的学习率已经不适用了,需要改变
optimizer = torch.optim.SGD(model.parameters(), lr=1e-3, momentum=0.5, weight_decay=0.2)
# 给参数min,表示在下面过程中是要对lr作减小的操作
scheduler = torch.optim.lr_scheduler.ReduceLROnPlateau(optimize ...
pytorch学习笔记-高阶篇(交叉划分)
本篇主要介绍在训练过程中过拟合与欠拟合的判断方法和减轻办法,主要是交叉划分的介绍
一、过拟合
第三张图片很直观地解释了什么是过拟合
二、split
1. split->Train Set,Test Set
把数据集分为Train Set和Test Set
如果在训练数据集上表现得很好,但是在测试数据集上表现地不好,此时就要考虑是不是过拟合了,在对测试数据集作测试的时候,如果loss曲线在本该一直下降的过程中开始上升。一般会设置一个保存最低点的量,标志着那个时候训练出来的是最好的模型
train_db = datasets.MNIST('../data', train=True, download=True,
transform=transforms.Compose([
transforms.ToTensor(),
transforms.Normalize((0.1307,), (0.3081,))
...
pytorch学习笔记-高阶篇(多分类实战)
本篇主要介是一个LR多分类问题的实战
一、网络部分
# 3个线性层
# 在pytorch中[CH_out,CH_in]的格式
w1, b1 = torch.randn(200, 784, requires_grad=True),\
torch.zeros(200, requires_grad=True)
w2, b2 = torch.randn(200, 200, requires_grad=True),\
torch.zeros(200, requires_grad=True)
w3, b3 = torch.randn(10, 200, requires_grad=True),\
torch.zeros(10, requires_grad=True)
torch.nn.init.kaiming_normal_(w1)
torch.nn.init.kaiming_normal_(w2)
torch.nn.init.kaiming_normal_(w3)
def forward(x):
# 这里的 x 输入是[? ...
pytorch学习笔记-高阶篇(逻辑回归与分类与交叉熵)
本篇主要介绍Logistic Regression以及它和classfication的关系,以及交叉熵的引入
一、linear regerssion(线性回归)到Logistic Regression(逻辑回归)
在给线性函数加上sigmoid之后,它的输出值就不再是一个连续的范围,而是通过放缩为0/1,来表示是否。
对于回归问题,优化的方法可以用范数,目标是使得预测值与真实值尽量接近,但是对于分类问题,我们的目标是准确率,但是并不会直接优化准确率,因为会有一个阈值问题,对于0.5来说,从0.4提高到0.45对回归问题是有意义的,但对分类问题,它表现出来都是0.4=>0,0.45=>0,不会对下一次预测作出指导。因为这种阈值存在,会导致微小的权值变化,可能导致梯度一直是0,也可能导致准确率的骤变
二、为什么叫Logistic regression 而不叫classification
首先,过程中会用到sigmoid函数,因此会是logistic
另外其实关于此还是有争议的,可以理解为:
MSE => regression
Cross En ...
pytorch学习笔记-高阶篇(反向传播算法)
本篇主要是一个实战篇,分别讲了反向传播的推导和一个2d函数的优化实例
一、理论推导
我要是能看懂我是那个-_-
二、2D函数优化实例
经典测试函数
1.绘图
def himmelblau(x):
return (x[0] ** 2 + x[1] - 11) ** 2 + (x[0] + x[1] ** 2 - 7) ** 2
x = np.arange(-6, 6, 0.1)
y = np.arange(-6, 6, 0.1)
print('x,y range:', x.shape, y.shape)
X, Y = np.meshgrid(x, y)
print('X,Y maps:', X.shape, Y.shape)
Z = himmelblau([X, Y])
fig = plt.figure('himmelblau')
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z)
ax.view_init(60, -30)
ax.set_xlabel('x')
ax.set_ylabel('y ...
pytorch学习笔记-高阶篇(链式法则)
本篇主要记录一下一些链式法则相关知识,和导数的加减复合的法则类似
一、常见梯度求导法则
二、链式法则
其实很容易理解,和导数的复合是一致的
下图是针对神经网络的一个具体的例子
# 验证链式法则
x = torch.tensor(1.)
w1 = torch.tensor(2., requires_grad=True)
b1 = torch.tensor(1.)
w2 = torch.tensor(2., requires_grad=True)
b2 = torch.tensor(1.)
y1 = x*w1 + b1
y2 = y1*w2 + b2
dy2_dy1 = torch.autograd.grad(y2, [y1], retain_graph=True)[0]
dy1_dw1 = torch.autograd.grad(y1, [w1], retain_graph=True)[0]
dy2_dw1 = torch.autograd.grad(y2, [w1], retain_graph=True)[0]
dy2_dw1*dy1_dw1
# Out[44 ...
pytorch学习笔记-高阶篇(感知机)
本篇主要记录一下一些感知机的相关知识,完整地回顾并实践之前所学的梯度求导相关过程
一、感知机介绍
感知机(perceptron)是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别。下图是单层感知机的示例图
单层感知机梯度推导:
二、单层感知机梯度推导代码
# 单层感知机梯度推导
# 也就是输入x的特征有10个
x = torch.randn(1, 10)
'''
Out[18]:
tensor([[ 0.8005, -0.2278, 0.4467, 1.4833, 0.2212, -0.0604, -1.8940, -0.1799,
-0.4088, 1.7971]])
'''
w = torch.randn(1, 10, requires_grad=True)
'''
Out[20]:
tensor([[-0.4720, -0.2564, 1.5323, -0.2673, 0.4987, 0.0123, -1.1776, 1.0636,
-0.5548, -1.6960]], requires_gr ...
pytorch学习笔记-高阶篇(梯度相关)
本篇主要记录一下一些相对高阶的梯度相关知识
梯度介绍
一.概念
导数 => 偏微分 => 梯度
前两者都是标量
梯度是所有的偏导组成的向量,反映了函数变化的趋势(方向和大小)
二.梯度求loss的问题
局部极小值
saddle point鞍点(x 取得局部极小值的同时y取得几部极大值)
三.影响优化性能的因素
initialization status 初始状态
learning rate 学习率
momentun 动量(逃离局部极小值)
常见函数梯度
激活函数及其梯度
一.激活函数
第一个输出是输入的加权求和的过程,第二个则不是简单的线性过程,而是一个阈值函数,为解决上述的阶梯函数在0处不可导,提出了下面的sigmod函数,作了一个平滑处理
1. sigmod函数
下面是sigmoid函数的求导过程
一般在想要把数据范围压缩到[0, 1]内可以用sigmoid函数。例如prob(概率),RGB(颜色等);sigmoid函数存在的缺点是在两端函数的导数会接近于0,此时loss会出现长时间保持不便的现象
a = torch.l ...
pytorch学习笔记-高阶篇(where和gather)
本篇主要记录一下一些相对高阶的tensor操作,where和gather
API介绍
1.where
详细介绍看官方链接:https://pytorch.org/docs/stable/generated/torch.where.html?highlight=where
与 for i: for j: if cond: op 这种写法的区别是这种写法是完全不并行的,只能用CPU跑,而pytorch提供的where这个API则可以利用GPU来完成,包括cond的生成,既可以用CPU也可以用GPU
# 1.where
cond = torch.rand(2, 2)
'''
Out[10]:
tensor([[0.0532, 0.3245],
[0.5223, 0.5285]])
'''
a = torch.full([2, 2], 0)
b = torch.full([2, 2], 1)
torch.where(cond>0.5, a, b)
'''
Out[16]:
tensor([[1, 1],
[0, 0]])
'''
2. ...