搭建一个分类网络

对下图这种平面上的点根据颜色进行分类

导入所需库

分别导入torch库,宏定义神经元类型(自动梯度)Variable,定义激励函数库F,由于希望过程可视化所以导入matplotlib库

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as plt

生成所需数据

生成被拟合数据x0和x1

n_data = torch.ones(100,2)          #生成一个全为1的100行2列的张量,一列横坐标,一列纵坐标
x0 = torch.normal(2*n_data,1)       #x~N(2,1)的正态分布
y0 = torch.zeros(100)               #x0的标签y0全部设为0,一维数组100个0
x1 = torch.normal(-2*n_data,1)      #同样,x1内包含了的横坐标和纵坐标,X1~N(-2,1)的正态分布
y1 = torch.ones(100)                #x1的标签y1全部设为1,一维数组100个1
  • 因为是对一个平面内的点进行分类,所以
    n_data = torch.ones(100,2)
    生成一个全为1的100行2列的张量,一列横坐标,一列纵坐标,n_data类型含有两个同时变量
  • torch.normal(A,B)意为从正态分布X~N(A,B)中生成张量,由于n_data都是1,所以X0~N(2,1)的正态分布
  • y0和y1分别是x0和x1的标签,我们最终目标是分辨哪些点的标签是1,哪些是0

拼接坐标以及标签

x=torch.cat((x0,x1),0).type(torch.FloatTensor)          # 将x0和x1上下拼接变成待处理数据(200行2列),坐标要定义为浮点数,用.type()将结果转换为浮点数
y=torch.cat((y0,y1),).type(torch.LongTensor)            # 将标签定义为整形类型(一维200个数字,前100个是0,后100个是1)
  • cat函数:cat((A,B),0)把A张量和B张量上下拼接,若为1则左右拼接。若 后没有设置,则默认是0,进行上下拼接。

cat()函数例子:

A=torch.ones(2,3)   #2x3的张量(矩阵)
print("A:\n",A,"\nA.shape:\n",A.shape,"\n")B=2*torch.ones(3,3)                         #4x3的张量(矩阵)
print("B:\n",B,"\nB.shape:\n",B.shape,"\n")C=torch.cat((A,B),0)  #按维数0(行,即上下)拼接
print("C:\n",C,"\nC.shape:\n",C.shape,"\n")

输出:

A:tensor([[1., 1., 1.],[1., 1., 1.]])
A.shape:torch.Size([2, 3]) B:tensor([[2., 2., 2.],[2., 2., 2.],[2., 2., 2.]])
B.shape:torch.Size([3, 3]) C:tensor([[1., 1., 1.],[1., 1., 1.],[2., 2., 2.],[2., 2., 2.],[2., 2., 2.]])
C.shape:torch.Size([5, 3])

搭建网络

与前一篇定义基本相同,解读可参照上一篇文章

class Net(torch.nn.Module):             #从torch继承了Module类def __init__(self,n_feature,n_hidden,n_output):                 #初始化时定义的,输入个数,隐藏层神经元个数,输出个数super().__init__()      #继承父类功能(官方步骤)self.hidden = torch.nn.Linear(n_feature,n_hidden)      #隐藏层:输入数据个数,隐藏层神经元个数,self.predict = torch.nn.Linear(n_hidden,n_output)               #预测层:输入是前面的hidden,输出个数#神经元之间传递是线性,非线性是由激励函数实现的def forward(self,x):                    # 前向传递,输入信息是xx=F.relu(self.hidden(x))            #使用一个hidden层加工x,输出n个神经元,进入relu函数激活x=self.predict(x)                   #将x放入预测层,并不希望结果被截断,所以不用外面套一层F.relu()return x

net = Net(2,10,2)
由于输入某个点有横纵坐标,所以输入是2个特征,设置10个神经元,又因为这是二分类问题,输出向量 [0,1]代表输出1,[1,0]代表输出0。

优化网络

optimizer = torch.optim.SGD(net.parameters(),lr=0.01)
调用torch的优化方法,选择常用的SGD优化器。 parameters是net的所有参数 lr是梯度下降速度(也就是学习速度,过快过慢都不行)

loss_function=torch.nn.CrossEntropyLoss() 定义处理误差的方法 分类一般用交叉熵损失处理方法。

交叉熵知识稍后补充。

使用网络进行回归

for t in range(100):                # 训练100次prediction = net(x)             # 预测结果=100个数字经过net正向传播的100个值loss = loss_function(prediction,y)optimizer.zero_grad()           #因为梯度累加,先要梯度降为0loss.backward()                 #反向传递optimizer.step()                #优化梯度,其实就是找正确结果

整体代码及注释

建议复制到编辑器,配合高亮看。

其中matplotlib相关绘图代码我也看不懂,也不是重点

import torch
from torch.autograd import Variable
import torch.nn.functional as F
import matplotlib.pyplot as pltn_data = torch.ones(100,2)          #生成一个全为1的100行2列的张量,一列横坐标,一列纵坐标x0 = torch.normal(2*n_data,1)       #因为n_data是二维张量,所以x0内包含了某点的横坐标和纵坐标,x~N(2,1)的正态分布
#torch.normal(A,B)意为从正态分布N~(A,B)中生成张量
y0 = torch.zeros(100)               #x0的标签y0全部设为0,一维数组100个0
x1 = torch.normal(-2*n_data,1)      #同样,x1内包含了的横坐标和纵坐标,x~N(-2,1)的正态分布
y1 = torch.ones(100)                #x1的标签y1全部设为1,一维数组100个1
#分辨哪一类是0,哪一类是1x=torch.cat((x0,x1),).type(torch.FloatTensor)          # 将x0和x1上下拼接变成待处理数据(200行2列),坐标要定义为浮点数,用.type()将结果转换为浮点数
y=torch.cat((y0,y1),).type(torch.LongTensor)            # 将标签定义为整形类型(一维200个数字,前100个是0,后100个是1)
#cat函数,cat((A,B),0)把A张量和B张量上下拼接,若为1则左右拼接x=Variable(x)
y=Variable(y)'''
# 绘图查看数据(一半红一半绿)
plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=y.data.numpy(), s=100, lw=0, cmap='RdYlGn')
plt.show()
'''class Net(torch.nn.Module):             #从torch继承了Module类def __init__(self,n_feature,n_hidden,n_output):                 #初始化时定义的,输入个数,隐藏层神经元个数,输出个数super().__init__()      #继承父类功能(官方步骤)self.hidden = torch.nn.Linear(n_feature,n_hidden)      #隐藏层:输入数据个数,隐藏层神经元个数,self.predict = torch.nn.Linear(n_hidden,n_output)               #预测层:输入是前面的hidden,输出个数#神经元之间传递是线性,非线性是由激励函数实现的def forward(self,x):                    # 前向传递,输入信息是xx=F.relu(self.hidden(x))            #使用一个hidden层加工x,输出n个神经元,进入relu函数激活x=self.predict(x)                   #将x放入预测层,并不希望结果被截断,所以不用外面套一层F.relu()return xnet = Net(2,10,2)       #输入某个点的横纵坐标2个特征,10个神经元,这是二分类问题输出向量[0,1]代表输出1,[1,0]代表输出0。
# 有点像线代求特征向量,三分类问题就要[0,0,1],四分类就是[0,1,0,0]。ont-hot'''
print(net)                  #查看网络
Net((hidden): Linear(in_features=2, out_features=10, bias=True)(predict): Linear(in_features=10, out_features=2, bias=True)
)
输入某点的横纵坐标,得到对应的向量[0,1] or [1,0]
隐藏层输入2个变量,输出10个神经元
预测层输入10个神经元,输出向量
'''plt.ion()             #实时打印过程
plt.show()# 优化神经网络
optimizer = torch.optim.SGD(net.parameters(),lr=0.01)
# 调用torch的优化方法中,选择常用的SGD优化器。  parameters是net的所有参数   lr是梯度下降速度
loss_function=torch.nn.CrossEntropyLoss()        #定义处理误差的方法 分类一般用交叉熵损失处理方法for t in range(100):                # 训练100次prediction = net(x)             # 预测结果=100个数字经过net正向传播的100个值loss = loss_function(prediction,y)optimizer.zero_grad()           #因为梯度累加,先要梯度清空为0loss.backward()                 #反向传递optimizer.step()                #优化梯度,其实就是找正确结果if t%2==0:              #每2步打印一次plt.cla()# 过了一道 softmax 的激励函数后的最大概率才是预测值prediction = torch.max(F.softmax(prediction), 1)[1]             #用softmax将向量转换为概率,输出索引为1的地方  ↑那个向量一样的东西pred_y = prediction.data.numpy().squeeze()target_y = y.data.numpy()plt.scatter(x.data.numpy()[:, 0], x.data.numpy()[:, 1], c=pred_y, s=100, lw=0, cmap='RdYlGn')accuracy = sum(pred_y == target_y)/200.  # 预测中有多少和真实值一样plt.text(1.5, -4, 'Accuracy=%.2f' % accuracy, fontdict={'size': 20, 'color':  'red'})plt.pause(0.1)

莫烦pytorch学习笔记(三)相关推荐

  1. 莫烦pytorch学习笔记5

    莫烦pytorch学习笔记5 1 自编码器 2代码实现 1 自编码器 自编码,又称自编码器(autoencoder),是神经网络的一种,经过训练后能尝试将输入复制到输出.自编码器(autoencode ...

  2. 莫烦强化学习笔记整理(九)DDPG

    莫烦强化学习笔记整理(九)DDPG 1.DDPG 要点 2.DDPG 算法 actor critic actor与critic结合 类似于DQN的记忆库 回合更新 链接: DDPG代码. 1.DDPG ...

  3. 莫烦---Pytorch学习

    今天翻翻资料,发现有些地方的说明不太到位,修改过来了. Will Yip 2020.7.29 莫烦大神Pytorch -->> 学习视频地址 2020年开年就遇上疫情,还不能上学,有够难受 ...

  4. 莫烦pytorch学习之问题记录与总结

    目录 一.三分类问题 二.创建网络结构部分,还有另一种形式,如下: 三.pytorch中save_model和load_model: 四.batch批量数据读取 五.pytorch测试SGD.Mome ...

  5. 莫烦Pytorch神经网络第三章代码修改

    3.1Regression回归 import torch import torch.nn.functional as F from torch.autograd import Variable imp ...

  6. 【Pytorch学习笔记三】Pytorch神经网络包nn和优化器optm(一个简单的卷积神经网络模型的搭建)

    文章目录 一, 神经网络包nn 1.1定义一个网络 1.2 损失函数 二.优化器 nn构建于 Autograd之上,可用来定义和运行神经网络, PyTorch Autograd 让我们定义计算图和计算 ...

  7. 莫烦python学习笔记之numpy基本运算

    numpy 的一维矩阵的几种基本运算 import numpy as np a=np.array([10,20,30,40]) # array([10, 20, 30, 40]) b=np.arang ...

  8. 莫烦python学习笔记之tuple,list,字典

    tuple 用小括号.或者无括号来表述,是一连串有顺序的数字. a_tuple = (12, 3, 5, 15 , 6) another_tuple = 12, 3, 5, 15 , 6 list 以 ...

  9. TensorFlow 莫烦视频学习笔记例子二(一)

    注释链接 所有代码 # -*- coding: utf-8 -*- """ Created on Wed Apr 19 12:30:49 2017@author: lg同 ...

  10. 莫烦python学习笔记之numpy.array,dtype,empty,zeros,ones,arrange,linspace

    array:创建数组 dtype:指定数据类型 empty:创建数据接近0 zeros:创建数据全为0 ones:创建数据全为1 arrange:按指定范围创建数据 linspace:创建线段 imp ...

最新文章

  1. Net作业调度(一) -Quartz.Net入门
  2. Linux 运维工程师的六类好习惯
  3. BeautifulSoup_第二节
  4. 计算机二级考试字处理表格和文字分栏,Exce表格分栏打印输出的两种巧妙方法...
  5. 手术期间重读《倚天屠龙记》
  6. 启动时指定需要绑定的网卡_为什么小型汽油机在启动时需要拉风门,而汽车却不用?...
  7. 案例 银行取款 java 1615136927
  8. 潭州课堂25班:Ph201805201 django 项目 第二十四课 文章主页 多级评论数据库设计 ,后台代码完成 (课堂笔记)...
  9. 程序开源与不开源区别_什么是开源程序办公室? 为什么需要一个?
  10. android 休眠唤醒驱动流程分析,Android4.0.4休眠唤醒机制分析(基于MSM8260)
  11. 传说中的WCF(4):发送和接收SOAP头
  12. c++重载、覆盖及隐藏规则
  13. iOS 使用SourceTree注意事项
  14. 【电力负荷预测】基于matlab灰狼算法优化LSTM短期电力负荷预测【含Matlab源码 1518期】
  15. Windows字体修改工具:一键更换系统字体 noMeiryoUI 2.41.0 中文绿色版
  16. 最近的计算机网络新技术,计算机网络通信新技术的现状与发展趋势
  17. android 4.4新功能介绍(Kitkat)
  18. GUI图形用户接口编写QQ登录界面
  19. 开发直播APP时,视频图片等上传到七牛云存储的实现流程
  20. git 错误 Reinitialized existing Git repository

热门文章

  1. 国内电影票务系统浅析
  2. A616-HP-ProDesk 480 G2 MT电脑网络同传
  3. # 创业计划书-样例参考五千套(一)
  4. Java项目——Everything 开发思路
  5. Python 学习笔记 (1)输出语句
  6. 罗技g402鼠标宏设置教程
  7. 软件测试 - 用例篇
  8. linux 串口终端源码,LINUX 串口通讯源码
  9. android 文件转base64 base64字符串转文件 语音留言及语音播放
  10. xshell xftp免费版下载