一、环境安装:
Anaconda+pytorch+cuda+pycharm
CUDA 各个版本下载地址: https://developer.nvidia.com/cuda-toolkit-archive
Pytorch各个版本命令行安装: Previous PyTorch Versions | PyTorch
踩坑:注意换镜像、修改C:\Users\用户名.condarc (删除default,去掉https后面s)
插入----
Anaconda 各个版本下载地址: Index of / (anaconda.com)
电脑vpn:https://github.com/dodois/Doisnet
1.创建一个名称为python34的虚拟环境并指定python版本为3.4(这里conda会自动找3.4中最新的版本下载)
conda create -n python34 python=3.4 或 conda create --name python34 python=3.4
2.切换环境
activate learn
3.查看所有环境
conda env list
# 创建一个名为python34的环境,指定Python版本是3.4(不用管是3.4.x,conda会为我们自动寻找3.4.x中的最新版本)
conda create --name python34 python=3.4
# 安装好后,使用activate激活某个环境
activate python34 # for Windows
source activate python34 # for Linux & Mac
# 激活后,会发现terminal输入的地方多了python34的字样,实际上,此时系统做的事情就是把默认2.7环境从PATH中去除,再把3.4对应的命令加入PATH
# 此时,再次输入
python --version
# 可以得到`Python 3.4.5 :: Anaconda 4.1.1 (64-bit)`,即系统已经切换到了3.4的环境
# 如果想返回默认的python 2.7环境,运行
deactivate python34 # for Windows
source deactivate python34 # for Linux & Mac
# 删除一个已有的环境
conda remove --name python34 --all
4.安装第三方包
输入
conda install requests
或者
pip install requests
来安装requests包.
5.卸载第三方包
输入
conda remove requests
或者
pip uninstall requests
6.查看环境包信息
要查看当前环境中所有安装了的包可以用
conda list
7.命令总结
//导入导出环境
//如果想要导出当前环境的包信息可以用
conda env export > environment.yaml
//将包信息存入yaml文件中.
//当需要重新创建一个相同的虚拟环境时可以用
conda env create -f environment.yaml
//其实命令很简单对不对, 我把一些常用的在下面给出来, 相信自己多打两次就能记住
activate // 切换到base环境
activate learn // 切换到learn环境
conda create -n learn python=3 // 创建一个名为learn的环境并指定python版本为3(的最新版本)
conda env list // 列出conda管理的所有环境
conda list // 列出当前环境的所有包
conda install requests //安装requests包
conda remove requests //卸载requets包
conda remove -n learn --all // 删除learn环境及下属所有包
conda update requests //更新requests包
conda env export > environment.yaml // 导出当前环境的包信息
conda env create -f environment.yaml // 用配置文件创建新的虚拟环境
8.Jupyter Notebook工作空间更换: https://blog.youkuaiyun.com/weixin_45399121/article/details/105754980
单词:
fully connect feedforward network 全连接前馈网络
neuron 神经元
Deep = many hidden layers
matrix 矩阵
softmax函数:归一化指数函数
sigmoid:激活函数
convolutional neural network 卷积神经网络
backpropagation 反向传播
toolkit 工具包
—插入
二、函数详解:
- 凸函数:convex(有专门讲怎么优化的课程,待学)
- 插播一首好听的歌曲: https://www.kugou.com/mvweb/html/mv_5219864.html
(1)Tensor(张量)
1.one_hot编码不能体现语言的相关性。
2.关键词解析:
-
dimension:几维(几行几列)
-
shape/size:具体的数据呈现 a.shape直接shape得到[2,3]
a. size(0)得到2 a. size(1)得到3
a. shape[0]得到2 a. shape[1]得到3
3.标量dimension(维度为0):
pytorch 0.3版本之前没有这个标量,采用维度为1,长度为1的张量表示
Loss用的最多的就是dimension为0 的张量,即标量。
将1.0 2.2 这样的数据带进tensor() 就会生成dimension为0的tensor。
4.dimension(维度为1)的张量:
Bias用的最多的是dimension为1 的张量。
Linear input用的最多的是dimension为1 的张量。
将1.0 2.2 这样的数据带进tensor([]) 就会生成dimension为1的tensor。
5.dimension(维度为2)的张量:
Linear input batch(批处理线性数据)用的最多的是dimension为2的张量。
6.dimension(维度为3)的张量:
RNN(循环神经网络) input batch(批处理文字数据)用的最多的是dimension为3的张量。
7.dimension(维度为4)的张量:
CNN[batch,color,height,width]
CNN(卷积神经网络) input batch(批处理图片数据)用的最多的是dimension为4的张量。
import torch
import numpy as np
# 声明一个两行三列的矩阵
a=torch.randn(2,3)
# 进行合法化检验
print(isinstance(a,torch.FloatTensor))
# cpu上的时候返回false
print(isinstance(a,torch.cuda.FloatTensor))
# 搬运到cuda上面,返回true
a=a.cuda()
print(isinstance(a,torch.cuda.FloatTensor))
# dimension为0的标量
b=torch.tensor(2.2)
print(b.shape)
print(b)
print(len(b.shape))
print(b.dim())
print(b.size())
# dimension为1的张量
print(torch.tensor([1.1]))
print(torch.tensor([1.1,2.2]))
print(torch.FloatTensor(1))
print(torch.FloatTensor(2))
data = np.ones(2) # 用numpy生成,然后转成tensor
print(data)
data = torch.from_numpy(data)
print(data,data.dtype)
# dimension为2的张量
a = torch.randn(2,3)
print(a)
print(a.shape)
print(a.size(0))
print(a.size(1))
print(a.shape[0])
print(a.shape[1])
# dimension为3的张量
a = torch.randn(1,2,3)
print(a)
print(a.shape)
print(a[0])
# dimension为4的张量
a = torch.randn(2,3,28,28)
print(a)
print(a.numel()) # 占的内存大小
print(a.dim()) # 维度大小
print(a.shape) # 全部信息
(2)Tensor创建
import numpy as np
import torch
# 由numpy创建,然后导入Tensor
a = np.array([2,3.3])
print(torch.from_numpy(a))
b = np.ones([2,3])
print(torch.from_numpy(b))
# tensor()接收现有数据 Tensor()和FloatTensor()接收维度信息,也可以接收数据(必须用list表示,尽量少用)
print(torch.tensor([2,3.3]))
print(torch.Tensor(2,3))
print(torch.FloatTensor(2,4))
# 养成一般初始化tensor的好习惯,不然生成的数据有问题,容易出现奇怪的bug,如果直接使用,数据一定要跟着覆盖
a = torch.empty(1)
print(a)
print(torch.Tensor(2,3))
print(torch.IntTensor(2,3))
print(torch.FloatTensor(2,3))
# pytorch默认tensor()是float,可以自行设置改成别的,强化学习中一般都是使用DoubleTensor,计算精确度会高一点
print(torch.tensor([1.2,2]).type())
torch.set_default_tensor_type(torch.DoubleTensor)
print(torch.tensor([1.2,2]).type())
# 随机初始化tensor rand(生成0-1的均匀随机数) rand_like(生成和某一个tensor差不多的) randint(min,max,[d1,d2])
a = torch.rand(3,3)
print(a)
b = torch.rand_like(a)
print(b)
c = torch.randint(1,10,[3,3])
print(c)
# 正态分布randn(均值为0,方差为1)
print(torch.randn(3,3))
# 自定义正态分布normal()生成长度为10,维度为1
# 长度为10,在0附近的值 方差从1到0以0.1的速度减小
print(torch.normal(mean=torch.full([10],0),std=torch.arange(1,0,-0.1)))
# full()函数生成一样值的张量
print(torch.full([2,3],6))
# dimension为0
print(torch.full([],7))
# dimension为1,长度为1
print(torch.full([1],8))
# arrange(min,max,等差值(默认为0))函数生成等差数列的张量
print(torch.arange(1,10,2))
# linspace()生成范围内等分的张量 start起始数 end结束数 steps几等份
print(torch.linspace(start=0,end=10,steps=4))
# logspace()生成10的start次方到10的end次方,steps表示分成多少个数
print(torch.logspace(start=0,end=-1,steps=1000))
# ones()生成全部为1的张量
print(torch.ones(3,3))
# zeros()生成全部为1的张量
print(torch.zeros(3,3))
# eye()生成主对角线全部为1的张量
print(torch.eye(5,5))
# randperm()随机打散数据排序
a = torch.rand(2,3)
b = torch.rand(2,2)
print(a)
print(b)
idx = torch.randperm(2)
print(idx)
print(idx)
print(a[idx])
print(b[idx])
(3)索引与切片(Index and slice)
import torch
# 基本索引用法
a = torch.rand(4,3,28,28)
print(a[0].shape)
print(a[0,0].shape)
print(a[0,0,2,4])
# 初级索引用法 空冒号可以省略,代表读取全部
print(a[:2].shape) # 查询一级从0到2但是不包括2的全部消息
print(a[:2,:1,:,:].shape) # 查询一级从0到2但是不包括2、二级从0到1通道但是不包括1的全部信息
print(a[:2,1:,:,:].shape) # 查询一级从0到2但是不包括2、二级从1通道到结束通道但是包括1的全部信息
print(a[:2,-1:,:,:].shape) # 查询一级从0到2但是不包括2、二级从-1一个通道到结束通道的全部信息
# 中级索引用法 隔行采样 start开始行:end结束行:空多少采样
print(a[:,:,0:28:2,0:28:2].shape)
print(a[:,:,::2,::2].shape)
# 高级索引用法
# 0:代表选第一级(batch) torch.tensor([0,2]):代表选第索引为0和2的两张图片
print(a.index_select(0,torch.tensor([0,2])).shape)
# 1:代表选第二级(color) torch.tensor([1,2]):代表选第索引为1和2的两色域
print(a.index_select(1,torch.tensor([1,2])).shape)
# 2:代表选第三级(height) torch.arange(8):代表选第索引从0到7的8行
print(a.index_select(2,torch.arange(8)).shape)
# 3:代表选第四级(width) torch.arange(9):代表选第索引从0到8的9行
print(a.index_select(3,torch.arange(9)).shape)
# 更高级索引用法(使代码优雅,不熟练可以不用) ...代表任何空着的参数,三个点的使用你要自己能看出来是缺啥,不能你自己都不知道,则不行
print(a[...].shape)
print(a[1,...].shape)
print(a[:,1,...].shape)
print(a[...,:2].shape)
# masked_select()掩码查询数据,会将数据打平,即变成维度为1,长度不定的张量
x = torch.randn(3,4)
print(x)
print(torch.masked_select(x,x.ge(0.5)))
print(torch.masked_select(x,x.ge(0.5)).shape)
# take()利用打平后的索引进行查询
print(torch.take(x,torch.tensor([0,2,5])))
(4)维度变换
import torch
'''
view()保证变换前后的Before_prod(a,size)=After_prod(a,size)
要满足物理意义 适合线性全连接层输入(二维信息)
将重点关注的单独列出来,其他的合并,即根据对数据的理解进行适当view()操作
注意:数据的存储/维度顺序不要弄乱
'''
a = torch.rand(4,1,28,28)
# view()
print(a.view(4,1*28*28).shape)
print(a.view(4*1*28,28).shape)
print(a.view(4*1,28,28).shape)
# unsqueeze(index) 注意索引范围能取的值:[-a.dim()-1,a.dim()+1)
# 索引为正:在索引位置前增加一个组
# 索引为负:在索引位置后增加一个组
print(a.unsqueeze(1).shape)
# 演示增加维度,索引位置不同,加[]位置就不同
b = torch.tensor([1,2,3,4])
print(b