pytorch学习笔记1

本文是PyTorch学习笔记的第一部分,涵盖了环境安装、Tensor的详细讲解,包括张量创建、索引切片、维度变换等,并介绍了相关数学运算和概念,如梯度、激活函数、感知机、链式法则和多层感知机的反向传播。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、环境安装:

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值