&2_PyTorch神经网络基础

神经网络基础

  • Torch 或 Numpy
    • torch和numpy互相转换
  • 变量
    • 梯度
    • 获取Variable数据

Torch 或 Numpy

Torch 自称为神经网络界的 Numpy, 因为他能将 torch 产生的 tensor 放在 GPU 中加速运算 (前提是你有合适的 GPU), 就像 Numpy 会把 array 放在 CPU 中加速运算。

torch和numpy互相转换

import torch
import numpy as np

np_data = np.arange(6).reshape((2, 3))
# numpy转换为torch
torch_data = torch.from_numpy(np_data)

# torch转换为numpy
tensor2array = torch_data.numpy()
print(
    '\nnumpy', np_data,
    '\ntorch', torch_data,
    '\ntensor2array', tensor2array,
)

# 运算符号
# abs
data = [-1, -2, 1, 2]
tensor = torch.FloatTensor(data)  # 32bit
print(
    '\nabs',
    '\nnumpy:', np.abs(data),
    '\ntorch:', torch.abs(tensor),
)

# sin
print(
    '\nsin',
    '\nnumpy:', np.sin(data),
    '\ntorch:', torch.sin(tensor),
)

# mean平均值
print(
    '\nmean',
    '\nnumpy:', np.mean(data),
    '\ntorch:', torch.mean(tensor),
)


# 矩阵运算
data_t = [[1, 2], [3, 4]]
tensor_t = torch.FloatTensor(data_t)

print(
    '\n矩阵相乘',
    '\nnumpy:', np.matmul(data_t, data_t),
    '\ntorch:', torch.mm(tensor_t, tensor_t),
)

变量

在 Torch 中的 Variable 就是一个存放会变化的值的地理位置. 里面的值会不停的变化;如果用一个 Variable 进行计算, 那返回的也是一个同类型的 Variable

import torch
from torch.autograd import Variable

tensor = torch.FloatTensor([[1, 2], [3, 4]])
# requires_grad是参不参与误差反向传播, 要不要计算梯度
variable = Variable(tensor, requires_grad=True)

print(tensor)
print(variable)

梯度

Variable 计算时, 它在背景幕布后面一步步默默地搭建着一个庞大的系统, 叫做计算图, computational graph。
将所有的计算步骤 (节点) 都连接起来, 最后进行误差反向传递的时候, 一次性将所有 variable 里面的修改幅度 (梯度) 都计算出来, 而 tensor 则不行。

v_out = torch.mean(variable*variable) 就是在计算图中添加的一个计算步骤
eg.

v_out.backward()    # 模拟 v_out 的误差反向传递

# 下面两步看不懂没关系, 只要知道 Variable 是计算图的一部分, 可以用来传递误差就好.
# v_out = 1/4 * sum(variable*variable) 这是计算图中的 v_out 计算步骤
# 针对于 v_out 的梯度就是, d(v_out)/d(variable) = 1/4*2*variable = variable/2

print(variable.grad)    # 初始 Variable 的梯度
'''
 0.5000  1.0000
 1.5000  2.0000
'''

获取Variable数据

在运用时需要转换为tensor或numpy形式

print(variable)     #  Variable 形式
"""
Variable containing:
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data)    # tensor 形式
"""
 1  2
 3  4
[torch.FloatTensor of size 2x2]
"""

print(variable.data.numpy())    # numpy 形式
"""
[[ 1.  2.]
 [ 3.  4.]]
"""

你可能感兴趣的:(深度学习,pytorch,神经网络,python)