深度学习简介
目前机器学习和深度学习应用共同的核心思想,逆向思考,用数据编程
机器学习是一门讨论各式各样的适用于不同问题的函数形式,以及如何使用数据来有效的获取函数参数具体值的学科。
深度学习是指机器学习中的一类函数,它们的形式通常为多层神经网络。
绝大多数神经网络都包含以下的核心原则:
1.交替使用线性处理单元和非线性处理单元,它们经常被称为层
2.使用链式法则(即反向传播来更新网络的参数)
随着发展,计算力的增长大于数据量的增长大于存储容量的增长,这种趋势使得我们需要提升存储的利用效率,例如使用非线性处理单元。这也响应导致了机器学习和统计学的最优选择从广义线性模型及核方法变化为深度多层神经网络。
深度学习能够长久发展的部分原因
1.优秀的容量控制方法,如丢弃法,使大型网络的训练不再受制于过拟合。这是靠在整个网络中注入噪声而达到的,如训练时随机将权重替换为随机的数字
2.如何在不增加参数的情况下扩展一个系统的记忆容量和复杂度。注意力机制使用了一个科学系指针结构来构建出一个精妙的解决办法。与其在像机器翻译这样的任务中记忆整个句子,不如记忆指向翻译的中间状态的指针。由于生成译文前不需要储存整句原文的信息,这样的结构使准确翻译长句变得可能。
3.记忆网络和神经编码器-解释器这样的多阶设计使得针对推理过程的迭代建模方法变得可能。
4.生成对抗网络可使用人以算法来生成输出的这一特性为许多技巧打开了新的大门。
5.构建分布式并行训练算法的能力已经有了极大的提升。可以满足在大型数据集上进行训练的需要
数据操作
在pytorch中,torch.Tensor是存储和变换数据的主要工具,Tensor和Numpy的多维数据非常相似。然而,Tensor提供GPU计算和自动求梯度等更多嫩共,Tensor更适合深度学习
“tensor”这个单词一般可译作“张量”,张量可以看作是一个多维数组。标量可以看做是0维向量,向量可以看作一维向量,矩阵可以看作二维向量。
创建Tensor
首先导入Pytorch:
import torch
然后创建一个5×3的未初始化的Tensor
x = torch.empty(5.3)
print(x)
输出
tensor([[2.0963e-38, 8.1976e-43, 2.0963e-38],
[8.1976e-43, 2.0964e-38, 8.1976e-43],
[2.0964e-38, 8.1976e-43, 2.0963e-38],
[8.1976e-43, 2.0963e-38, 8.1976e-43],
[2.0963e-38, 8.1976e-43, 2.0963e-38]])
创建一个5×3的随机初始化的Tensor:
x = torch.rand(5,3)
print(x)
输出
tensor([[0.7999, 0.9090, 0.0496],
[0.1335, 0.5244, 0.1695],
[0.8128, 0.8961, 0.8869],
[0.5880, 0.8155, 0.9505],
[0.8333, 0.4594, 0.0965]])
创建一个5×3的long型全0的Tensor:
x = torch.zeros(5,3,dtype = torch.long)
print(x)
输出
tensor([[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
还可以根据数据直接创建
x = torch.tensor([5.5,3])
print(x)
输出
tensor([5.5000, 3.0000])
还可以通过现有的Tensor来创建,此方法会默认重用输入Tensor的一些属性,例如数据类型,除非自定义数据类型。
x = x.new_ones(5,3,dtype = torch.float64)
#返回的tensor默认具有相同的torch.dtype torch.device
#torch.device代表将torch.Tensor分配到的设备的对象
print(x)
x = torch.randn_like(x,dtype = torch.float)
#指定新的数据类型
print(x)
输出
tensor([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]], dtype=torch.float64)
tensor([[-1.4106, -0.4798, -0.8518],
[-1.0560, 0.3848, 0.3631],
[ 1.5372, -0.8653, -1.9772],
[-1.7165, -0.2785, 2.0197],
[ 0.2080, -0.3303, 1.0794]])
可以通过shape或者size()来获取Tensor的形状
print(x.size())
print(x.shape)
输出
torch.Size([5, 3])
torch.Size([5, 3])
重点:返回的torch.Size其实就是一个tuple,支持所有tuple的操作。
其余常用创建Tensor的函数
函数 | 功能 |
---|---|
Tensor(*sizes) | 基础构造函数 |
tensor(data,) | 类似np.array的构造函数 |
ones(*sizes) | 全1Tensor |
zeros(*sizes) | 全0Tensor |
eye(*sizes) | 对角线为1,其他为0 |
arrange(s,e,step) | 从s到e,步长为step |
linspace(s,e,steps) | 从s到e,均匀切分成steps份 |
rand/randn(*sizes) | 均匀/标准分布 |
normal(mean,std)/uniform(from,to) | 正态分布/均匀分布 |
randperm(m) | 随机排列 |