[深度学习实战]基于PyTorch的深度学习实战(中)[线性回归、numpy矩阵的保存、模型的保存和导入、卷积层、池化层](一)

简介: 笔记

一、前言


 本想着一篇博文直接写完基于PyTorch的深度学习实战,可写着写着发现字数都上万了。考虑到读者可能花了大力气对这么一篇博文看到失去了对PyTorch神经网络的耐心,同时也为了我个人对文章排版的整理,还是分成了分卷阅读。

 这里贴一下上篇博文:

[深度学习实战]基于PyTorch的深度学习实战(上)[变量、求导、损失函数、优化器]


二、线性回归


 线性回归也叫 regression,它是一个比较简单的模拟线性方程式的模型。线性方程式我们应该都学过吧,就是类似这样:

 Y=wX+b

 其中 w 是系数,b 是位移,它是一条笔直的斜线。

1.png

 那么我们假设给定一条模拟直线的点,每个点偏移这条直线很小的范围,我们要用到随机函数来模拟这个随机的偏移。

 首先可以定义一个随机种子,随机种子基本不影响随机数的值,也可以不定义随机种子。随机数值在 0~1 之间。

 例如:torch.manual_seed(1),设置随机种子为 1。

size=10
0.2*torch.rand(size)

 这里我们不打算使用 pytorch 的随机函数,毕竟 numpy 中已经提供了随机函数,我们的数据是生成 200 个 X 和 Y,模拟参数 w 为 0.5。

 代码:

import numpy as np
from numpy import random
import matplotlib.pyplot as plt
X = np.linspace(-1, 1, 200)
Y = 0.5 * X + 0.2* np.random.normal(0, 0.05, (200, ))
plt.scatter(X,Y)
plt.show()
#将X,Y转成200 batch大小,1维度的数据
X=Variable(torch.Tensor(X.reshape(200,1)))
Y=Variable(torch.Tensor(Y.reshape(200,1)))

2.png

 图形:3.png

 注意:这里要将输入数据转换成 (batch_size,dim) 格式的数据,添加一个批次的维度。

 现在的任务是给定这些散列点 (x,y) 对,模拟出这条直线来。这是一个简单的线性模型,我们先用一个简单的 1→1 的 Linear 层试试看。

 示例代码:


# 神经网络结构
model = torch.nn.Sequential(
torch.nn.Linear(1, 1),
)
optimizer = torch.optim.SGD(model.parameters(), lr=0.5)
loss_function = torch.nn.MSELoss()


2.1 训练代码

for i in range(300):
prediction = model(X)
loss = loss_function(prediction, Y)
optimizer.zero_grad()
loss.backward()
optimizer.step()


2.2 绘图部分代码

plt.figure(1, figsize=(10, 3))
plt.subplot(131)
plt.title('model')
plt.scatter(X.data.numpy(), Y.data.numpy())
plt.plot(X.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.show()


 最后的显示结果如图所示,红色是模拟出来的回归曲线:

4.png

2.3 numpy 数组的保存和导入代码

np.save("pred.npy",prediction.data.numpy())
pred= numpy.load("pred.npy")


2.4 完整代码

import numpy as np
from numpy import random
import matplotlib.pyplot as plt
import torch
from torch.autograd import Variable
X = np.linspace(-1, 1, 200)
Y = 0.5 * X + 0.2* np.random.normal(0, 0.05, (200, ))
X=Variable(torch.Tensor(X.reshape(200,1)))
Y=Variable(torch.Tensor(Y.reshape(200,1)))
print(X)
model = torch.nn.Sequential(
torch.nn.Linear(1, 1)
)
optimizer = torch.optim.SGD(model.parameters(), lr=0.5)
loss_function = torch.nn.MSELoss()
for i in range(300):
prediction = model(X)
loss = loss_function(prediction, Y)
print("loss:",loss)
optimizer.zero_grad()
loss.backward()
optimizer.step()
print(prediction.data.numpy())
plt.figure(1, figsize=(10, 3))
plt.subplot(131)
plt.title('model')
plt.scatter(X.data.numpy(), Y.data.numpy())
plt.plot(X.data.numpy(), prediction.data.numpy(), 'r-', lw=5)
plt.show()


三、numpy矩阵的保存


import numpy as np
a=np.array(2)
np.save("nm.npy",a)
a = np.load("nm. npy ")


 其中 np 是 import numpy as np 的 np。a 是对应的 numpy 数组,"nm. npy"是文件名称。


四、模型的保存和导入


 每次定义和训练一个模型都要花费很长的时间,我们当然希望有一种方式可以将训练好的模型和参数保存下来,下一次使用的时候直接导入模型和参数,就跟一个已经训练好的神经网络模型一样。幸运的是,pytorch 提供了保存和导入方法。


4.1 保存模型

# 保存整个神经网络的结构和模型参数
torch.save(mymodel, 'mymodel.pkl')
# 只保存神经网络的模型参数
torch.save(mymodel.state_dict(), 'mymodel_params.pkl')


4.2 导入模型

mymodel = torch.load('mymodel.pkl')


五、卷积层


 卷积层是用一个固定大小的矩形区去席卷原始数据,将原始数据分成一个个和卷积核大小相同的小块,然后将这些小块和卷积核相乘输出一个卷积值(注意:这里是一个单独的值,不再是矩阵了)。

 卷积的本质就是用卷积核的参数来提取原始数据的特征,通过矩阵点乘的运算,提取出和卷积核特征一致的值,如果卷积层有多个卷积核,则神经网络会自动学习卷积核的参数值,使得每个卷积核代表一个特征。

 这里我们拿最常用的 conv2d 和 conv1d 举例说明卷积过程的计算。


5.1 Conv2d

 conv2d 是二维度卷积,对数据在宽度和高度两个维度上进行卷积。


5.1.1 函数定义

torch.nn.functional.conv2d(input, weight, bias=None, stride=1, padding=0, dilation


5.1.2 参数说明

 input:输入的Tensor数据,格式为 (batch,channels,H,W),四维数组,第一维度是样本数量,第二维度是通道数或者记录数,三、四维度是高度和宽度。

 weight:卷积核权重,也就是卷积核本身,是一个四维度数组,(out_channels, in_channels/groups, kH, kW)。 Out_channels 是卷积核输出层的神经元个数,也就是这层有多少个卷积核;==in_channels ==是输入通道数,kH 和 kW 是卷积核的高度和宽度。

 bias:位移参数,可选项,一般不用管。

 stride:滑动窗口,默认为 1,指每次卷积对原数据滑动 1 个单元格。

 padding:是否对输入数据填充 0。Padding 可以将输入数据的区域改造成卷积核大小的整数倍,这样对不满足卷积核大小的部分数据就不会忽略了。通过 padding 参数指定填充区域的高度和宽度,默认 0(就是填充区域为0,不填充的意思)。

 dilation:卷积核之间的空格,默认1。

 groups:将输入数据分组,通常不用管这个参数,没有太大意义。


5.1.3 测试代码

import torch
from torch.autograd import Variable
import torch.nn as nn
import torch.nn.functional as F
print("conv2d sample")
a=torch.ones(4,4)
x = Variable(torch.Tensor(a))
x=x.view(1,1,4,4)
print("x variable:", x)
b=torch.ones(2,2)
b[0,0]=0.1
b[0,1]=0.2
b[1,0]=0.3
b[1,1]=0.4
weights = Variable(b)
weights=weights.view(1,1,2,2)
print ("weights:",weights)
y=F.conv2d(x, weights, padding=0)
print ("y:",y)


5.1.4 最终结果

5.png

 我们看看它是怎么计算的:

 (1) 原始数据大小是1 * 1 * 4 * 4,1 * 1我们忽略掉,就是一个样本,每个样本一个通道的意思。4 * 4说明每个通道的数据是4 * 4大小的。而卷积核的大小是2 * 2。最后的卷积结果是3 * 3。

6.png


 A. 第一步,卷积核与原始数据第一个数据做卷积乘法。图中示例部分的算法如下:

 0.1 * 1+0.2 * 1+0.3 * 1+0.4 * 1=1.0。

 B. 中间步骤,按顺序移动卷积核,并和目标区域做矩阵乘法。得到这一步的卷积值,作为结果矩阵的一个元素,图中示例部分的算法如下:

 0.1 * 1+0.2 * 1+0.3 * 1+0.4 * 1=1.0

 C. 最后一步,用卷积核卷积 input[2:4,2:4],最后共 4 个元素。图中示例部分的算法和上面一样,最后的值也是 1。

 因为原始数据都是 1,所有最后卷积出来的结果才是相同的,否则的话是不同的。最终卷积的结果就是:

7.png

相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
海洋生物识别系统。以Python作为主要编程语言,通过TensorFlow搭建ResNet50卷积神经网络算法,通过对22种常见的海洋生物('蛤蜊', '珊瑚', '螃蟹', '海豚', '鳗鱼', '水母', '龙虾', '海蛞蝓', '章鱼', '水獭', '企鹅', '河豚', '魔鬼鱼', '海胆', '海马', '海豹', '鲨鱼', '虾', '鱿鱼', '海星', '海龟', '鲸鱼')数据集进行训练,得到一个识别精度较高的模型文件,然后使用Django开发一个Web网页平台操作界面,实现用户上传一张海洋生物图片识别其名称。
37 7
海洋生物识别系统+图像识别+Python+人工智能课设+深度学习+卷积神经网络算法+TensorFlow
|
2天前
|
机器学习/深度学习 人工智能 算法
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
昆虫识别系统,使用Python作为主要开发语言。通过TensorFlow搭建ResNet50卷积神经网络算法(CNN)模型。通过对10种常见的昆虫图片数据集('蜜蜂', '甲虫', '蝴蝶', '蝉', '蜻蜓', '蚱蜢', '蛾', '蝎子', '蜗牛', '蜘蛛')进行训练,得到一个识别精度较高的H5格式模型文件,然后使用Django搭建Web网页端可视化操作界面,实现用户上传一张昆虫图片识别其名称。
44 7
【昆虫识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+机器学习+TensorFlow+ResNet50
|
3天前
|
机器学习/深度学习 人工智能 算法
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
球类识别系统,本系统使用Python作为主要编程语言,基于TensorFlow搭建ResNet50卷积神经网络算法模型,通过收集 '美式足球', '棒球', '篮球', '台球', '保龄球', '板球', '足球', '高尔夫球', '曲棍球', '冰球', '橄榄球', '羽毛球', '乒乓球', '网球', '排球'等15种常见的球类图像作为数据集,然后进行训练,最终得到一个识别精度较高的模型文件。再使用Django开发Web网页端可视化界面平台,实现用户上传一张球类图片识别其名称。
33 7
【球类识别系统】图像识别Python+卷积神经网络算法+人工智能+深度学习+TensorFlow
|
5天前
|
机器学习/深度学习 自然语言处理 TensorFlow
深入浅出:理解和实现深度学习中的卷积神经网络(CNN)
在当今的数据驱动世界,深度学习已经成为许多领域的关键技术。本文将深入探讨卷积神经网络(CNN)的原理、结构和应用,旨在帮助读者全面理解这项强大的技术,并提供实际的实现技巧。
22 0
|
11天前
|
机器学习/深度学习 算法 PyTorch
《PyTorch深度学习实践》--3梯度下降算法
《PyTorch深度学习实践》--3梯度下降算法
|
11天前
|
机器学习/深度学习 PyTorch 算法框架/工具
《PyTorch深度学习实践》--2线性模型
《PyTorch深度学习实践》--2线性模型
|
11天前
|
机器学习/深度学习 自然语言处理 前端开发
深度学习-[数据集+完整代码]基于卷积神经网络的缺陷检测
深度学习-[数据集+完整代码]基于卷积神经网络的缺陷检测
|
12天前
|
机器学习/深度学习 资源调度 PyTorch
【从零开始学习深度学习】15. Pytorch实战Kaggle比赛:房价预测案例【含数据集与源码】
【从零开始学习深度学习】15. Pytorch实战Kaggle比赛:房价预测案例【含数据集与源码】
|
12天前
|
机器学习/深度学习 算法 PyTorch
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用
【从零开始学习深度学习】50.Pytorch_NLP项目实战:卷积神经网络textCNN在文本情感分类的运用
|
1月前
|
程序员 开发工具 索引
图解Python numpy基本操作
图解Python numpy基本操作