【PyTorch】神经网络基础

本文为 PyTorch 学习总结,讲解神经网络基础。欢迎交流

Numpy与Torch对比

Numpy 是处理矩阵等数据的模块,会使用多核加速运算。而 PyTorch 就是神经网络中的 Numpy,是 Torch(张量)的类型,张量的维度可以大于 2。

下面举例说明 Numpy 和 Torch 的一些区别:

# 首先引入包
import torch
import numpy as np

# 创造一个numpy的数据,reshape成2行3列
np_data = np.arange(6).reshape((2, 3))
# 将numpy转换为torch中tensor的数据
torch_data = torch.from_numpy(np_data)
# 将tensor转换为numpy的数据
tensor2array = torch_data.numpy()

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

如果对运算形式感兴趣,推荐浏览 pytorch 官网文档。这里仅介绍一些基本的运算:

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

# abs,也可以是sin,mean,用法相同
print(
	'\nabs',
    '\nnumpy:', np.abs(data), # [1 2 1 2]
    '\ntorch:', torch.abs(tensor), # [1 2 1 2]
)

进行矩阵相乘的操作:

data = [[1, 2], [3, 4]]
tensor = torch.FloatTensor(data)
# 将data变为numpy的data
data = np.array(data)
print(
	'\nnumpy:', np.matmul(data, data), # 矩阵相乘
    # 或使用:
    # '\nnumpy:', data.dot(data),
    '\ntorch:', torch.mm(tensor, tensor)
    # 而在torch中使用dot给出的答案不一样
    # '\nnumpy:', tensor.dot(tensor), # torch将结果展平:1×1+2×2+3×3+4×4
)

Variable 变量

我们介绍一些 PyTorch 的细节内容(神经网络的细节变化),tensorVariable 的不同之处。

torch 是用 tensor 来计算的,神经网络的参数都是 Variable 变量的形式,将 tensor 数据放到 Variable 变量中,用变量来更新神经网络中的参数。

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1, 2], [3, 4]])
# requires_grad为是否涉及到反向传播过程,True会计算反向传播梯度
variable = Variable(tensor, requires_grad=True)
print(tensor)
print(variable)

# 进行一些计算
t_out = torch.mean(tensor*tensor) # x^2
v_out = torch.mean(variable*variable)
print(t_out)
print(v_out)

只有在反向传播时才会有差别,而 tensor 不能反向传播,而 variable 可以,为搭建图的信息。我们对 v_out 进行反向传递,而 variable 会受影响,因为这是一套体系,结点间相互联系。

v_out.backward() # 误差的反向传递
# v_out = 1/4*sum(var*var)
# d(v_out)/d(var) = 1/4*2*variable = variable/2
print(variable.grad) # 查看反向传播后的梯度更新值
print(variable) # 可以看variable中的信息
print(variable.data) # variable包含哪些data
# 如果要转换成numpy,则需先将variable转换为tensor
print(variable.data.numpy())

激励函数

我们的任务通常是非线性的,因此需要用激励函数将线性的转换为非线性的。激励函数让神经网络可以描述非线性问题的步骤,使神经网络变得更强大。

Torch 中的激励函数有很多, 不过我们平时要用到的就这几个 relu, sigmoid, tanh, softplus,对应图像:

在这里插入图片描述

将神经网络输出的结果代入到激励函数中,输出一个新的结果,是一种非线性化手段。

引入神经网络模块和画图模块:

import torch
import torch.nn.functional as F # nn是神经网络模块
from torch.autograd import Variable
import matplotlib.pyplot as plt # python 的可视化模块

这里如果提示 No module named ‘matplotlib’,则说明未安装 matplot 库。我们在 Anaconda Prompt 中输入下面命令进行安装:

conda install matplotlib 

首先生成数据:

# x data (tensor), shape=(100, 1)
x =torch.linspace(-5, 5, 200) # -5到5的线段中取200个点
x = Variable(x)
# torch的数据格式无法被matplot识别,要转换为numpy
x_np = x.data.numpy()

然后是激励函数。softplus 做概率图,分类概率,不能被线图呈现:

y_relu = F.relu(x).data.numpy()
y_sigmoid = F.sigmoid(x).data.numpy()
y_tanh = F.tanh(x).data.numpy()
y_softplus = F.softplus(x).data.numpy()

最后是画图:

plt.figure(1, figsize=(8, 6))
plt.subplot(221)
plt.plot(x_np, y_relu, c='red', label='relu')
plt.ylim((-1, 5))
plt.legend(loc='best')

plt.subplot(222)
plt.plot(x_np, y_sigmoid, c='red', label='sigmoid')
plt.ylim((-0.2, 1.2))
plt.legend(loc='best')

plt.subplot(223)
plt.plot(x_np, y_tanh, c='red', label='tanh')
plt.ylim((-1.2, 1.2))
plt.legend(loc='best')

plt.subplot(224)
plt.plot(x_np, y_softplus, c='red', label='softplus')
plt.ylim((-0.2, 6))
plt.legend(loc='best')

plt.show()

绘制出 4 种激励函数图像:

在这里插入图片描述

我们后面会用到激励函数搭建神经网络处理回归问题,进行模拟。

猜你喜欢

转载自blog.csdn.net/weixin_44413191/article/details/107849828
今日推荐