当前位置: 首页 > news >正文

河北 石家庄 网站建设网络营销的一般流程

河北 石家庄 网站建设,网络营销的一般流程,wordpress后台颜色,提供微网站制作网络公司目录 一、前言二、线性回归2.1 训练代码2.2 绘图部分代码2.3 numpy 数组的保存和导入代码2.4 完整代码 三、numpy矩阵的保存四、模型的保存和导入4.1 保存模型4.2 导入模型 五、卷积层5.1 Conv2d5.1.1 函数定义5.1.2 参数说明5.1.3 测试代码5.1.4 最终结果 5.2 Conv1d5.2.1 函数… 目录 一、前言二、线性回归2.1 训练代码2.2 绘图部分代码2.3 numpy 数组的保存和导入代码2.4 完整代码 三、numpy矩阵的保存四、模型的保存和导入4.1 保存模型4.2 导入模型 五、卷积层5.1 Conv2d5.1.1 函数定义5.1.2 参数说明5.1.3 测试代码5.1.4 最终结果 5.2 Conv1d5.2.1 函数定义5.2.2 参数说明5.2.3 测试代码5.2.4 最终结果5.2.5 核心代码 六、池化层6.1 max_pool2d6.2 avg_pool2d6.3 max_pool1d 七、后记 PyTorch——开源的Python机器学习库 一、前言 本想着一篇博文直接写完基于PyTorch的深度学习实战可写着写着发现字数都上万了。考虑到读者可能花了大力气对这么一篇博文看到失去了对PyTorch神经网络的耐心同时也为了我个人对文章排版的整理还是分成了分卷阅读。   这里贴一下上篇博文 [深度学习实战]基于PyTorch的深度学习实战(上)[变量、求导、损失函数、优化器]   还有贴上博文的社区帖子 [有红包][深度学习实战]基于PyTorch的深度学习实战(上)[变量、求导、损失函数、优化器] 二、线性回归 线性回归也叫 regression它是一个比较简单的模拟线性方程式的模型。线性方程式我们应该都学过吧就是类似这样   YwXb   其中 w 是系数b 是位移它是一条笔直的斜线。   那么我们假设给定一条模拟直线的点每个点偏移这条直线很小的范围我们要用到随机函数来模拟这个随机的偏移。   首先可以定义一个随机种子随机种子基本不影响随机数的值也可以不定义随机种子。随机数值在 01 之间。   例如torch.manual_seed(1)设置随机种子为 1。 size10 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() #将XY转成200 batch大小1维度的数据 XVariable(torch.Tensor(X.reshape(200,1))) YVariable(torch.Tensor(Y.reshape(200,1)))图形   注意这里要将输入数据转换成 (batch_size,dim) 格式的数据添加一个批次的维度。   现在的任务是给定这些散列点 (x,y) 对模拟出这条直线来。这是一个简单的线性模型我们先用一个简单的 1→1 的 Linear 层试试看。   示例代码 # 神经网络结构 model torch.nn.Sequential( torch.nn.Linear(1, 1), ) optimizer torch.optim.SGD(model.parameters(), lr0.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-, lw5) plt.show()最后的显示结果如图所示红色是模拟出来的回归曲线 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, )) XVariable(torch.Tensor(X.reshape(200,1))) YVariable(torch.Tensor(Y.reshape(200,1))) print(X) model torch.nn.Sequential( torch.nn.Linear(1, 1) ) optimizer torch.optim.SGD(model.parameters(), lr0.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-, lw5) plt.show()三、numpy矩阵的保存 import numpy as np anp.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, biasNone, stride1, padding0, dilation5.1.2 参数说明 input输入的Tensor数据格式为 (batch,channels,HW)四维数组第一维度是样本数量第二维度是通道数或者记录数三、四维度是高度和宽度。   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) atorch.ones(4,4) x Variable(torch.Tensor(a)) xx.view(1,1,4,4) print(x variable:, x) btorch.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) weightsweights.view(1,1,2,2) print (weights:,weights) yF.conv2d(x, weights, padding0) print (y:,y)5.1.4 最终结果 我们看看它是怎么计算的   1 原始数据大小是1 * 1 * 4 * 41 * 1我们忽略掉就是一个样本每个样本一个通道的意思。4 * 4说明每个通道的数据是4 * 4大小的。而卷积核的大小是2 * 2。最后的卷积结果是3 * 3。   A. 第一步卷积核与原始数据第一个数据做卷积乘法。图中示例部分的算法如下   0.1 * 10.2 * 10.3 * 10.4 * 11.0。   B. 中间步骤按顺序移动卷积核并和目标区域做矩阵乘法。得到这一步的卷积值作为结果矩阵的一个元素图中示例部分的算法如下   0.1 * 10.2 * 10.3 * 10.4 * 11.0   C. 最后一步用卷积核卷积 input[2:4,2:4]最后共 4 个元素。图中示例部分的算法和上面一样最后的值也是 1。   因为原始数据都是 1所有最后卷积出来的结果才是相同的否则的话是不同的。最终卷积的结果就是 5.2 Conv1d conv1d 是一维卷积它和 conv2d 的区别在于只对宽度进行卷积对高度不卷积。 5.2.1 函数定义 torch.nn.functional.conv1d(input, weight, biasNone, stride1, padding0, dilation5.2.2 参数说明 input输入的Tensor数据格式为 (batch,channels,W)三维数组第一维度是样本数量第二维度是通道数或者记录数三维度是宽度。   weight卷积核权重也就是卷积核本身。是一个三维数组(out_channels, in_channels/groups, kW)。 out_channels 是卷积核输出层的神经元个数也就是这层有多少个卷积核in_channels 是输入通道数kW 是卷积核的宽度。   bias位移参数可选项一般也不用管。   stride滑动窗口默认为 1指每次卷积对原数据滑动 1 个单元格。   padding是否对输入数据填充 0。Padding 可以将输入数据的区域改造成是卷积核大小的整数倍这样对不满足卷积核大小的部分数据就不会忽略了。通过 padding 参数指定填充区域的高度和宽度默认 0就是填充区域为0不填充的意思。   ilation卷积核之间的空格默认 1。   groups将输入数据分组通常不用管这个参数没有太大意义。 5.2.3 测试代码 import torch from torch.autograd import Variable import torch.nn as nn import torch.nn.functional as F print(conv1d sample) arange(16) x Variable(torch.Tensor(a)) xx.view(1,1,16) print(x variable:, x) btorch.ones(3) b[0]0.1 b[1]0.2 b[2]0.3 weights Variable(b) weightsweights.view(1,1,3) print (weights:,weights) yF.conv1d(x, weights, padding0) print (y:,y)5.2.4 最终结果 我们看看它是怎么计算的   1原始数据大小是 0-15 的一共 16 个数字卷积核宽度是 3向量是 [0.1,0.2,0.3]。   我们看第一个卷积是对 x[0:3] 共 3 个值 [0,1,2] 进行卷积公式如下 0 * 0.11 * 0.22 * 0.30.8   2对第二个目标卷积是 x[1:4] 共 3 个值 [1,2,3] 进行卷积公式如下 1 * 0.12 * 0.23 * 0.31.4   看到和计算结果完全一致   该图就是conv1d的示意图和conv2d的区别就是只对宽度卷积不对高度卷积。最后结果的宽度是原始数据的宽度减去卷积核的宽度再加上 1这里就是 14。   所以最终卷积之后的结果一共是 14 个数值显示如下   我们再看看输入数据有多个通道的情况 5.2.5 核心代码 print(conv1d sample) arange(16) x Variable(torch.Tensor(a)) xx.view(1,2,8) print(x variable:, x) btorch.ones(6) b[0]0.1 b[1]0.2 b[2]0.3 weights Variable(b) weightsweights.view(1,2,3) print (weights:,weights) yF.conv1d(x, weights, padding0) print (y:,y)我们看看返回结果第一个元素 27.8 是怎么计算出来的这时候卷积核有 2 个通道 [0.1,0.2,0.3] 和 [1,1,1]   第 1 个卷积对象也有 2 个通道[0,1,2] 和 [8,9,10]   结果是 2 个卷积核分别对应 2 个输入通道进行卷积然后求和。   卷积核对第 1 个卷积对象的卷积值(0.1 * 00.2 * 10.3 * 2)(1 * 81 * 91 * 10)27.8   第2个卷积对象也有 2 个通道[1,2,3] 和 [9,10,11]   卷积核对第 2 个卷积对象的卷积值(0.1 * 10.2 * 20.3 * 3)(1 * 91 * 101 * 11)31.4和 pytorch 计算结果相同。 六、池化层 池化层比较容易理解就是将多个元素用一个统计值来表示。   那为什么要池化呢   比如对于一个图像来说单个的像素其实不代表什么含义。统计值可以取最大值也可以取平均值用不同的池化函数来表示。 6.1 max_pool2d 对于二维最大值池化来说用 torch.nn.functional. F.max_pool2d 方法来操作。   比如 import torch.nn.functional as F from torch.autograd import Variable print(conv2d sample) arange(20) x Variable(torch.Tensor(a)) xx.view(1,1,4,5) print(x variable:, x) yF.max_pool2d(x, kernel_size2,stride2) print (y:,y)最后显示结果如下图   x 是 4*5 的矩阵表示高度 4宽度 5一个样本每个样本一个通道。   xx.view(1,1,4,5) 意思是将 x 矩阵转换成 (1,1,4,5) 的四维矩阵第一个 1 是样本数第二个 1 是通道数第三个 4 和第四个 5 是高度和宽度。   bF.max_pool2d(x, kernel_size2,stride2) 中的参数 2 表示池化的核大小是 2也就是 (2,2)表示核是一个行 2 列 2 的矩阵每两行两列池化成一个数据。比如   [[1,2],   [3,4]]   会被池化成最大的数就是 4。   stride2 表示滑动窗口为 2第一个池化对象之后相隔 2 个元素距离如果剩下的不够池化核的尺寸则忽略掉不作池化处理。   第 1 个池化目标是 [[0,1],[5,6]]因此最大池化结果是 6第 2 个池化目标是 [[2,3],[7,8]]因此最大池化结果是 8。   max_pool2d 方法的说明如下 torch.nn.functional.max_pool2d(input, kernel_size, strideNone, padding0, dilation1那么具体的各个参数的含义说明如下   input输入的 Tensor 数据格式为 (channels,HW)三维数组第一维度是通道数或者记录数二、三维度是高度和宽度。   kernel_size池化区的大小指定宽度和高度 (kh x kw)如果只有一个值则表示宽度和高度相同。   stride滑动窗口默认和 kernel_size 相同值这样在池化的时候就不会重叠。如果设置的比 kernel_size 小则池化时会重叠。它也是高度和宽度两个值。   padding是否对输入在左前端填充 0。池化时如果剩余的区域不够池化区大小则会丢弃掉。 Padding 可以将输入数据的区域改造成是池化核的整数倍这样就不会丢弃掉原始数据了。Padding 也是指定填充区域的高度和宽度默认 0就是填充区域为 0不填充的意思。   ceil_mode在计算输出 shape 大小时按照 ceil 还有 floor 计算是数序函数如ceil(4.5)5;floor(4.5)4。   count_include_pad为 True 时在求平均时会包含 0 填充区域的大小。这个参数只有在 avg_pool2d 并且 padding 参数不为 0 时才有意义。 6.2 avg_pool2d 那么同样的avg_pool2d 和 max_pool2d 的计算原理是一样的只不过avg_pool2d 取的是平均值而不是最大值而已。这里就不重复说明计算过程了。 6.3 max_pool1d max_pool1d 和 max_pool2d 的区别和卷积操作类似也是只对宽度进行池化。   先看看示例代码 print(conv1d sample) arange(16) x Variable(torch.Tensor(a)) xx.view(1,1,16) print(x variable:, x) yF.max_pool1d(x, kernel_size2,stride2) print (y:,y)输出结果   max_pool1d 方法对输入参数的最后一个维度进行最大池化。   第一个池化目标 [0,1]池化输出 1   第二个池化目标 [2,3]池化输出 3   ……   最后结果就是这样计算得来的。   同样我们仿照卷积操作再看看多通道的池化示例。代码 print(conv1d sample) arange(16) x Variable(torch.Tensor(a)) xx.view(1,2,8) print(x variable:, x) yF.max_pool1d(x, kernel_size2,stride2) print (y:,y)输出结果   可以看到通道数保持不变。 七、后记 好的恭喜你看完了本文的全部内容其余的知识点会在基于PyTorch的深度学习实战的下篇和补充篇分享会在下周放出如果有兴趣跟着我学习的话请在这周复习回顾并尽量手敲代码来体验并加深理解。下周见
http://www.pierceye.com/news/196562/

相关文章:

  • 建设工程人才招聘信息网站响应式网站 cms
  • 设计签名免费网站福州的网站建设
  • 太原这边有做网站的吗wordpress实现pdf浏览
  • 制作微信公众号的网站开发30岁做网站运营
  • 松江手机网站开发正规免费代理
  • 太原市建设路小学网站昆山住房与城乡建设局网站
  • 石家庄的网站的公司计算机应用技术专业网站开发方向
  • 网站优化软件排行榜八年级微机网站怎么做
  • 织梦网站漏洞cms网站开发流程
  • 网站开发规划书怎么写企业cms开源
  • html网站免费下载海珠区建网站
  • 石家庄住房城乡建设厅网站宿迁网站建设推广公司
  • 广州模板网站建设费用2024新闻热点摘抄
  • 河北秦皇岛建设局网站做网站简单的软件
  • 上海网站开发外包公司最新新闻热点事件短篇
  • wordpress实现网站勋章功能网站建设需要什么资质
  • 河北沙河市建设局网站威海好的网站建设公司
  • 网站建设怎么放到云空间上海企业网站模板
  • 设计和建设企业网站心得和体会wordpress和新浪微博同步
  • 网站底部横条导航代码制造业erp系统软件有哪些
  • 网站建设公司antnw企业营销型网站制作
  • 接口网站开发wordpress安装网站无法
  • 九九9九九9视频在线观看优化网站结构一般包括
  • 网站缺点国外网站素材
  • 网站域名到期如何续费淘宝客绑定网站备案号
  • 什么是自建站常州 网站制作
  • 网站开发基础培训网站做推广有用吗
  • 音乐网站开发模板网页设计师用什么软件
  • 烟台优化网站重庆酉阳网站设计公司
  • 网站维护工作太原公司网站建设