深度学习笔记--卷积神经网络CNN搭建(一)

使用torch构建网络
刚开始接触深度学习,尝试自己按照别人的教程进行搭建网络,如果有错误的地方请大家指正,在最后会附上参考的资料和视频

一、torch与numpy

由于是基于pytorch进行网络搭建,首先来看一下torch与numpy之间的联系与区别。

import torch
import numpy as np

# 分别构造两个下面的数据
np_data = np.arange(6).reshape((2, 3))
torch_data = torch.from_numpy(np_data)      # 将numpy中的数据转换为torch中的张量
tensor2array = torch_data.numpy()           # 数据可以转换

print(
    "\nnumpy", np_data,
    "\ntorch", torch_data,
    "\ntensor2array", tensor2array,
)

输出结果

numpy
 [[0 1 2]
 [3 4 5]] 
torch
 tensor([[0, 1, 2],
        [3, 4, 5]], dtype=torch.int32) 
tensor2array
 [[0 1 2]
 [3 4 5]]

在numpy中的基本数据为array,在torch中的基本数据为tensor,两者之间有区别,也有联系。
两种数据之间是可以相互转换的,而且基本运算功能也是相同的,比如计算绝对值,均值等等:

# abs
data = [-1, -2, 1, 2]
tensor = torch.FloatTensor(data)   # 转换为32bit的浮点数

print(
    '\nabs',
    '\nnumpy', np.abs(data),
    '\ntorch', torch.abs(tensor),
)

输出结果

abs 
numpy [1 2 1 2] 
torch tensor([1., 2., 1., 2.])

矩阵操作之间也有一些不同:

# 矩阵操作
data = [[1, 2], [3, 4]]
data = np.array(data)
tensor = torch.FloatTensor(data)        # 因为torch中的操作都是针对tensor的,所以要进行转换

# 矩阵相乘, numpy还可以用data.dot(data),结果是一样的
# 但是torch中用dot是不一样的,算出来是30。因为torch是将其展平之后再操作的,即1*1+2*2+3*3+4*4=30
print(
    '\nnumpy:\n', np.matmul(data, data),
    '\ntorch:\n', torch.mm(tensor, tensor),
)

输出结果:

numpy:
 [[ 7 10]
 [15 22]] 
torch:
 tensor([[ 7., 10.],
        [15., 22.]])

二、变量(Variable)简介

在torch中有一个数据形式为变量,即Variable;

变量与tensor最大的区别就是,variable中的数据是可以变化的,即可以被更新。tensor中的数值是一个常量。

variable是用来存放神经网络参数的东西,并且神经网络优化一般都是优化类型为variable的节点,所以作为一个神经网络的参数,首先要变成variable的类型,这样才能被BP计算并且更新到

此外Pytorch 为variable提供了一个.grad()函数,用于获取某个向量的梯度

  • 一句话总结:反向传播更新的是variable而不是tensor
import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1, 2], [3, 4]])
variable = Variable(tensor, requires_grad=True)     # 创建一个variable,并且会记录他的梯度

# requires_grad是参不参与误差反向传播,要不要计算梯度
tensor = torch.FloatTensor([[1, 2], [3, 4]])
variable = Variable(tensor, requires_grad=True)     # 创建一个variable,并且会记录他的梯度

t_out =torch.mean(tensor * tensor)  # x^2
v_out = torch.mean(variable * variable)

v_out.backward()    # 对v_out进行反向传播。variable也会受到影响

print(variable)
print(variable.data)            # 这是一个tensor
print(variable.data.numpy())    # 将tensor转化为numpy()

输出结果:

tensor([[1., 2.],
        [3., 4.]], requires_grad=True)
tensor([[1., 2.],
        [3., 4.]])
[[1. 2.]
 [3. 4.]]

三、激活函数activation function

持续更新中

发布了6 篇原创文章 · 获赞 9 · 访问量 542
App 阅读领勋章
微信扫码 下载APP
阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览