视频地址(B站):适用于初学者的PyTorch神经网络编程教学
课程官方博客地址:DEEPLIZARD
说明:
- 笔记为个人学习笔记,如有错误,欢迎指正!
- 本篇笔记整理的内容为课程的第一部分,对应视频为P1∼P13P_1\sim P_{13}P1∼P13
- DeepLizard课程为全英文授课,B站视频为中文字幕,且每个视频都有配套的博客与课后测试题。
文章目录
- Section 1:PyTorch介绍
-
- P1:PyTorch历史。
- P2:PyTorch常用包以及PyTorch的优势
-
- 关于计算图
- P3:PyTorch的安装
- P4:进一步介绍cuda,为什么使用GPU
-
- GPU
- CUDA
- GPU VS CPU
- GPU计算堆栈
- Section 2:引入张量
-
- P5:张量介绍
-
- 张量的概念
- 访问元素所需的索引
- 张量是泛化
- P6:深入研究张量,并引入张量的三个基本属性(秩、轴、形状)
-
- 张量的秩
- 张量的轴
- 张量的形状
-
- 张量的重塑
- P7:用一个实际的例子来演示张量概念的使用
-
- CNN输入的形状
- 下标含义
- 输出通道和特征图
- P8:探索pytorch张量(神经网络编程)
-
- PyTorch张量介绍
- 创建张量
- P9:将数据转换为PyTorch张量的方法,以及这些方法之间的区别
- Section 3:张量运算
-
- P10:Flatten,Reshape,Squeeze
-
- Reshape
- Squeeze
- Flatten
- 连接张量cat()
- P11:对一个灰度图像张量的张量flatten操作,如何在一个张量中flatten特定的轴
-
- 为一批图像构建张量表示
- 展平张量的批处理轴
- 展平张量的C,H,W轴
- 示例:RGB图像的拼合与展平
- P12:元素的运算
- P13:张量的缩减操作,argmax函数
-
- 张量的缩减操作
- argmax函数
Section 1:PyTorch介绍
对应视频:P1∼P4P_1\sim P_4P1∼P4
P1:PyTorch历史。
略
P2:PyTorch常用包以及PyTorch的优势
- torch:顶层包
- torch.nn:包括类和模块,比如图层、权重和前向函数。P.S.神经网络是建立在torch.nn的基础上的
- torch.autograd:负责处理在核心处优化我们的神经网络权重所需的导数计算
- P.S.所有深度学习框架都有两个特性:一个张量库和一个用于计算导数的包。对PyTorch来说,它们是torch和torch.autograd
- torch.nn.functional:功能接口,有关函数
- torch.optim:优化
- torch.utils:包含数据集和数据加载器这样的实用程序类,使数据预处理更加容易
- torchvision:一个单独的包,能让我们访问流行的数据集、计算机视觉的模型架构等
关于计算图
计算图用于绘制神经网络中张量上发生的函数操作,然后这些图用于计算优化神经网络所需的导数。
在PyTorch中,使用动态计算图,也就是说图是在创建操作时动态生成的。深度学习中的许多前沿研究课题都需要用到动态图。
P3:PyTorch的安装
略。
P4:进一步介绍cuda,为什么使用GPU
GPU
并行计算:通过特定的计算,可被分解为同时执行的独立较小的计算,然后得到结果,之后进行重新组合以形成原始较大计算的结果。
GPU:适用于处理并行计算,可以使用并行编程和GPU加速我们的计算。神经网络中的许多计算,都可以很容易分解为更小的相互独立的计算,这使得GPU在深度学习中非常有用。e.g.卷积计算
CUDA
Nvidia GPU 是支持并行计算的硬件,而cuda是为开发者提供API的软件层。
使用pytorch驱动cuda:
# 方式一:以这种方式创建的张量对象在默认情况下是在CPU上运行
t = torch.tensor([1,2,3])
# 方式二:在一个张量上调用cuda函数会返回同样的张量,但是是在GPU上
t = t.cuda()
cuda0,0代表索引,pytorch支持多个GPU,如果有多个GPU,你可以把这个张量放在一个特定的GPU上,计算就可以被选择性执行。
GPU VS CPU
- GPU对于特定的专门任务来说,速度更快
- 将数据从CPU转移到GPU上代价太高,因此将计算量较小的任务转移到GPU上反而可能使整体性能下降
GPU计算堆栈
- GPU作为底层硬件
- Cuda是GPU顶端的软件架构
- 最后是cuda顶部的cudnn库(cudnn是cuda的深层神经网络组件)
- cuda和cudnn顶部是pytorch,它将会与最终支持应用程序的应用程序一起工作
Section 2:引入张量
对应视频:P5∼P9P_5\sim P_9P5∼P9
P5:张量介绍
张量的概念
张量的概念是对其他更具体概念的数学推广。
张量的一般概念的具体实例:
访问元素所需的索引
张量是泛化
在机器学习中,张量是一个多维数组或简称n维数组。
说张量是泛化的原因是,我们用张量这个词来表示所有的n值,例如标量是零维张量,矢量是一维张量,矩阵是二维张量,n维数组是一个n维向量。张量这个概念允许我们只用一个n来确定我们正在处理的维度的数量。
但是张量的维数与向量空间中向量的维数不同,张量的维数并未告诉我们张量中有多少个分量。例如,在三维欧几里得空间中的一个三维向量,它有三分量(x,y,z);但是一个三维张量可以有多于三个的分量,例如该dd二维张量就有9个分量:
P6:深入研究张量,并引入张量的三个基本属性(秩、轴、形状)
张量的秩
张量的秩:张量中存在的维数。
一个张量的秩告诉我们需要多少个索引来访问或引用张量数据结构中包含的特定数据元素。例如,我们有一个二维张量,我们就需要两个索引来访问张量的单个元素:
张量的轴
张量的轴:是一个张量的一个特定的维度。
比如说有一个二维张量,意思是这个张量有两个轴。
元素被认为是存在或是沿着一个轴运动,这个运动会受到每个轴长度的限制,每个轴的长度告诉我们沿轴有多少个索引。
例如,有一个名为t的张量,它第一个轴的长度为3,第二个轴的长度为4。也就是说,我们可以沿着第一个轴索引3个位置,沿着第二个轴索引4个位置:
例如之前的dd张量,第一个轴上的每个元素都是一个数组,第二个轴上的每个元素都是数字:
需要注意,对于张量,最后一个轴的元素总是数字,每个轴都包含一个n维数组。
张量的形状
张量的形状是由每个轴的长度决定的,也就是说,给定一个张量的形状,我们也就知道了每个轴的长度。
如上图所示,3 * 3的形状告诉我们这个秩为2的张量的每个轴的长度为3,也就是说每个轴上都有3个索引。
张量形状的重要性:
- shape允许我们从想象一个张量,甚至更高阶更抽象的张量
- shape还对所有有关轴、秩、索引的相关信息进行编码
- 在神经网络编程时,常会进行reshape的操作,当我们的张量在网络中流动时,在网络中不同的点会有特定的形状,因此我们要有能力理解其形状,并能够根据需要对其进行重塑
张量的重塑
如上图所示的例子,形状改变了元素的分组,但并没有改变潜在的元素,数据保持不变。
使用pytorch进行重塑:为每个轴指定我们想要的长度:
需要注意的是,在重塑时,分量值的乘积必须等于张量中元素的总数。
P7:用一个实际的例子来演示张量概念的使用
以CNN为例,把图像输入看做是CNN的张量,注意,张量的形状编码了所有关于张量的轴、秩和索引的相关信息。
CNN输入的形状
CNN输入的形状通常为4,这就说明我们有一个秩为4的张量,它有4个轴:
张量形状中的每个索引代表一个特定的轴,每个索引处的值为我们提供了相应轴的长度:
如果沿着最后一个轴运行,我们会看到一个个数字:
如果沿着其他轴运行,我们看到的元素将是多维数组:
下标含义
对于图像,原始数据以像素的形式出现,像素由一个数字表示,并用高度和宽度来表示两个维度。图像的高度和宽度在最后两个轴上表示,下一个轴表示颜色通道:
有了这三个轴,我们访问数据时就需要三个索引,选中一个颜色通道,选中一个高度,再选中一个宽度就能找到特定的像素值:
第一个轴表示一个批量大小,在神经网络中,我们通常使用批量的样本而不是单一样本,这个轴的长度告诉我们在我们的批中有多少个样本:
例如,给定形状为[3, 1, 28, 28]的张量,我们就可以知道有一批三个图像,每个图像有1个颜色通道,图像的高度和宽度均为28:
输出通道和特征图
假设有一个张量,其中包含来自单个灰度图像的数据,张量的形状为[1, 1, 28, 28]。假设这个图像被传递给我们的CNN并通过第一个卷积层,卷积将改变高度和宽度以及通道数,输出通道的数量根据卷积层中使用的滤波器数量而变化。
卷积前
卷积后
使用输出通道,我们不再有颜色通道,而是修改后的通道,我们称之为特征图。这些所谓的特征图是使用输入颜色通道和卷积滤波器发生的卷积的输出。特征图是从卷积创建的输出通道。
P8:探索pytorch张量(神经网络编程)
PyTorch张量介绍
PyTorch 张量是 Python 类的实例,可以使用类构造函数创建对象:
t = torch.Tensor()
张量的属性:
torch.dtype
torch.device
torch.layout
- dtpye指定在张量中包含的数据类型,每种类型的数据都有一个CPU和一个GPU版本,要注意张量之间的运算必须与同数据类型的张量发生,但在1.3版本及以上的可以进行混合运算。
- device指定设备,要么是CPU,要么是GPU,这是数据被分配的位置。使用多个设备时,张量之间的张量操作必须与存在于统一设备上的张量发生。
- layout:strided告诉我们张量数据时如何在内存中布局的,是默认值,也没必要改变。
创建张量
torch.Tensor(data)
torch.tensor(data)
torch.as_tensor(data)
torch.from_numpy(data)
P9:将数据转换为PyTorch张量的方法,以及这些方法之间的区别
- 默认数据类型
可以看到除了torch.Tensor(data)的默认数据类型是float32之外,其他几个都是int32。 - 内存的复制与共享
可以看到,torch.as_tensor()和torch.from_numpy()采用的是内存共享,而torch.tensor()和torch.Tensor()采用的是内存复制。 - 在PyTorch中创建张量的最佳选择
torch.tensor()
torch.as_tensor()
Section 3:张量运算
对应视频:P10∼P13P_{10}\sim P_{13}P10∼P13
P10:Flatten,Reshape,Squeeze
Reshape
假设有以下张量:
t = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3]
], dtype=torch.float32)
- 获取张量的形状:
t.size() # torch.Size([3, 4]) t.shape # torch.Size([3, 4])
- 张量的秩:(张量的秩就等于其形状的长度)
len(t.shape) # 2
- 张量中包含的元素数量
torch.tensor(t.shape).prod() # tensor(12) t.numel() # 12
- 张量重塑:用
reshape()
函数可以进行张量重塑,但要注意所有“行”和“列”的乘积要等于元素的个数。比如高维度的重塑:> t.reshape(2,2,3) tensor( [[[1., 1., 1.],[1., 2., 2.]],[[2., 2., 3.],[3., 3., 3.]] ])
Squeeze
可以通过squeeze和unsqueeze来改变张量的形状。
- 对张量进行squeeze操作会删除长度为1的轴或维度
- 对张量进行unsqueeze操作会添加一个长度为1的维度
> print(t.reshape([1,12]))
> print(t.reshape([1,12]).shape)
tensor([[1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]])
torch.Size([1, 12]) > print(t.reshape([1,12]).squeeze())
> print(t.reshape([1,12]).squeeze().shape)
tensor([1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])
torch.Size([12]) # 删除长度为1的维度> print(t.reshape([1,12]).squeeze().unsqueeze(dim=0))
> print(t.reshape([1,12]).squeeze().unsqueeze(dim=0).shape)
tensor([[1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.]])
torch.Size([1, 12]) # 添加长度为1的维度
Flatten
flatten操作将调整张量的形状,使其形状等于张量中包含的元素数。flatten张量意味着删除除了一个维度之外的所有维度。
def flatten(t):t = t.reshape(1, -1) # -1告诉reshape函数,根据一个张量中包含的其他值和元素个数来求出值应该是多少t = t.squeeze()return t
示例:
> t = torch.ones(4, 3)
> t
tensor([[1., 1., 1.],[1., 1., 1.],[1., 1., 1.],[1., 1., 1.]])> flatten(t)
tensor([1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
连接张量cat()
- 方式一:按axis0进行连接
> torch.cat((t1, t2), dim=0) tensor([[1, 2],[3, 4],[5, 6],[7, 8]])
- 方式二:按axis1进行连接
> torch.cat((t1, t2), dim=1) tensor([[1, 2, 5, 6],[3, 4, 7, 8]])
P11:对一个灰度图像张量的张量flatten操作,如何在一个张量中flatten特定的轴
为一批图像构建张量表示
假设有以下三个张量
t1 = torch.tensor([[1,1,1,1],[1,1,1,1],[1,1,1,1],[1,1,1,1]
])t2 = torch.tensor([[2,2,2,2],[2,2,2,2],[2,2,2,2],[2,2,2,2]
])t3 = torch.tensor([[3,3,3,3],[3,3,3,3],[3,3,3,3],[3,3,3,3]
])
将这三个张量合成一个具有三个轴的更大张量:
> t = torch.stack((t1, t2, t3))
> t.shapetorch.Size([3, 4, 4])
添加一个指定长度为1的轴:
> t = t.reshape(3,1,4,4)
> t
展平张量的批处理轴
> t.reshape(1,-1)[0] # Thank you Mick!
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.reshape(-1) # Thank you Aamir!
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.view(t.numel()) # Thank you Ulm!
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])> t.flatten() # Thank you PyTorch!
tensor([1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2,2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3])
这里,对整个批次进行了展平操作,这将所有图像粉碎为一个轴。
展平张量的C,H,W轴
展平每个图像,同时保持批处理轴。
> t.flatten(start_dim=1).shape
torch.Size([3, 16])> t.flatten(start_dim=1)
tensor(
[[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1],[2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2],[3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3]
]
)
注意:参数start_dim告诉flatten函数应该在哪个轴上启动展平操作,这里start_dim=1,也就是说,我们跳过批处理轴,使其保持不变。
示例:RGB图像的拼合与展平
- 构建一个高度和宽度均为2的RGB图像张量:
import torchr = torch.ones(1,2,2) g = torch.ones(1,2,2) + 1 b = torch.ones(1,2,2) + 2img = torch.cat((r,g,b),dim = 0 ) print(img) # 输出 tensor([[[1., 1.],[1., 1.]],[[2., 2.],[2., 2.]],[[3., 3.],[3., 3.]]])
- 展平图像张量
img.flatten(start_dim=0) # 输出 tensor([1., 1., 1., 1., 2., 2., 2., 2., 3., 3., 3., 3.])img.flatten(start_dim=1) # 输出 tensor([[1., 1., 1., 1.],[2., 2., 2., 2.],[3., 3., 3., 3.]])
P12:元素的运算
元素操作的定义:元素运算是对张量元素的运算,这些张量元素在张量中对应或有相同的索引位置
广播broadcast,描述了在元素操作期间如何处理不同形状的张量,它允许我们将标量添加到更高维的张量中。
秩不同的张量进行元素操作时,小秩向大秩看齐,也就是较低秩的张量通过广播进行转换,以匹配高阶张量的形状。
P13:张量的缩减操作,argmax函数
张量的缩减操作
- 常见的张量缩减操作
t.sum()
t.prod()
t.mean()
t.std()
- 按轴减少张量
t = torch.tensor([[1,1,1,1],[2,2,2,2],[3,3,3,3]
], dtype=torch.float32)# dim = 0
t.sum(dim=0)
# 输出
tensor([6., 6., 6., 6.])# dim = 1
t.sum(dim=1)
# 输出
tensor([ 4., 8., 12.])
argmax函数
argmax函数返回张量内最大值的索引位置。
t = torch.tensor([[1,0,0,2],[0,3,3,0],[4,0,0,5]
], dtype=torch.float32)t.max()
# 输出:tensor(5.)t.argmax()
# 输出:tensor(11)t.flatten()
# 输出:tensor([1., 0., 0., 2., 0., 3., 3., 0., 4., 0., 0., 5.])
使用特定的轴:
t.max(dim=0)
# 输出
(tensor([4., 3., 3., 5.]), tensor([2, 1, 1, 2]))t.argmax(dim=0)
# 输出
tensor([2, 1, 1, 2])t.max(dim=1)
# 输出
(tensor([2., 3., 5.]), tensor([3, 1, 3]))t.argmax(dim=1)
# 输出
tensor([3, 1, 3])
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2073546.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
【ML笔记】DeepLizard:Pytorch神经网络编程教学(第一部分)
视频地址(B站):适用于初学者的PyTorch神经网络编程教学 课程官方博客地址:DEEPLIZARD
说明:
笔记为个人学习笔记,如有错误,欢迎指正!本篇笔记整理的内容为课程的第一部分ÿ……
推荐人工智能领域十大类专业好用的深度学习预训练模型
深度学习领域出现了许多优秀的预训练模型。以下是一些常用的专业深度学习预训练模型:
图像分类模型:
VGG(Visual Geometry Group)系列:VGG16、VGG19等 ResNet(Residual Network)系列:ResNet50、ResNet101等 Inception(Google Inception)系列:InceptionV3、Incepti……
【Linux】【Kernel】功能代码导航
【Linux】【Kernel】功能代码导航flocksetuidflock
linux-kernel/fs/locks.c
obj-$(CONFIG_FILE_LOCKING) locks.osetuid
linux-kernel/kernel/uid16.c
obj-$(CONFIG_UID16) uid16.o…
算法详解-双指针算法的魅力-一种简单而高效的编程思想
文章目录双指针简介快慢指针快慢指针介绍快慢指针例题快慢指针优缺点:对撞指针对撞指针介绍:对撞指针例题对撞指针优缺点:更新中——未完总结更多宝藏双指针简介
😎🥳😎🤠😮&#x……
【mybaits-源码-1】原生jdbc的问题
文章目录一、代码展现二、问题梳理三、问题解决思路(借鉴mybatis的思路)3.1、创建mysql链接为硬编码3.2、执行statement存在硬编码3.3、代码太复杂四、总结在学习mybatis源码的时候,其实需要首先知道mybatis为什么诞生,为了解决哪……
Cinema 4D 2023.1.3安装包下载及安装教程
[软件名称]:Cinema 4D 2023.1.3 [软件大小]: 1.0GB [安装环境]: Win11/Win 10 [软件安装包下载]: https://pan.quark.cn/s/c2324deaa028
CINEMA 4D字面意思是4D电影,不过其本身就是3D的表现软件,由德国Maxon Computer开发,以极高的运算速度和……
为什么0代码自动化测试越来越受欢迎?一文2000字解析
目录
01、什么是零代码自动化测试
02、为什么零代码自动化测试越来越受欢迎
03、有代码和零代码自动化有什么区别
04、零代码自动化测试可以帮助你做什么
05、零代码自动化测试方法:NLP(自然语言处理)
06、为什么我们需要零代码自动化测……
为什么采购和财务必须良好协作?
传统上,企业内的不同部门是围绕着他们自己独特的职能、目标和运作而构建的。采购部门和财务部门往往就是这种情况。虽然在核心上,采购和财务职能不同,但它们的流程在许多不同点上有交集。为了实现最佳的业绩和业务成果,采购和财务……
最小生成树kruskal-修建公路1
题目描述 L 城一共有 N 个小区。 小明是城市建设的规划者,他计划在城市修 M 条路,每修建一条路都要支付工人们相应的工钱(需要支付的工钱 = 路的长度)。 然而小明所拿到的经费并不够支付修建 M 条路的工钱,于是迫于无奈,他只能将计划改变为修建若干条路,使得 N 个小区之……
考pmp有什么好处?
PMP证书报名条件要求高,这是众所周知的事,那你通过了PMP考试,就证明你是有一定能力的,重要的是,你已经有了至少半年的项目管理经验,并且在你申请考试的前六年内,累计项目管理达三年。
PMP有什么……
深度分析Palantir的投资价值,Palantir2023年将实现强劲反弹?
来源:猛兽财经 作者:猛兽财经 在本文中,猛兽财经将通过对Palantir的股票关键指标、商业模式、盈利能力、影响Palantir2023年股价的关键利好因素等方面,对Palantir进行全面、深度的分析。 Palantir股票的关键指标 自从Palantir(PL……
Pandas入门实践2 -数据处理
为了准备数据进行分析,我们需要执行数据处理。在本节中,我们将学习如何清理和重新格式化数据(例如,重命名列和修复数据类型不匹配)、对其进行重构/整形,以及对其进行丰富(例如,离散化……
一、lua基础知识1
一、lua 的数据类型
–类型 a1; –number print(type(a)) –number b"HelloWorld"; print(type(b)) –string 两种数据类型 ctrue; print(type(c)) –boolean true 或者 false d print; d("HelloWorld"); print(type(d)); –function类型 ……
二、lua语言基础2
1.lua的类型有哪些?答:lua的数据类型有:number,string,nil function,table,thread,userdata(用户自定义的类型),boolean(布尔类型) 2.什么是尾调用,尾调用有什么优点尾调用:在一个函数的最后一步开始调用另……
quick-cocos2dx-luaUI控件讲解
–MyApp部分 require("config") require("cocos.init") require("framework.init") local MyApp class("MyApp", cc.mvc.AppBase) function MyApp:ctor() MyApp.super.ctor(self) end function MyApp:run() cc.FileUti……
quick-cocos2dx lua语言讲解 (动作,定时器,触摸事件,工程的类的讲解)
–MainScene部分
— display.newScene 创建一个场景 — 在quick里面我们的控件、精灵 一般是加载到场景上的 local MainScene class("MainScene", function() return display.newScene("MainScene") end) function MainScene:ctor() –创……
使用quick-cocos2dx-lua 实现的小游戏(包含碰撞检测,触屏发子弹)
–主界面local MainScene class("MainScene", function()return display.newScene("MainScene")end)ON true;function MainScene:ctor()local bg cc.Sprite:create("main_background.png");bg:setScale(2);bg:setPosition(display.cx,display……
cocos2d-js 中scrollview详解
/****
开头的一些废话:
1、多思考,善于思考
2、懂得变通
3、多多查询API首先复制一段 API中的源码:(UIScrollView.js)这段代码可以看出 scrollview
中的容器是一个node,并且他的位置是:代码最后……
cocos2d-js中的回调函数中世界坐标系和节点坐标系的相互转换
世界坐标系和节点坐标系都是OPENGL 坐标系 1、世界坐标系原点就是屏幕的左下角; 2、节点坐标系的原点就是一个节点的左下角; 3、两个坐标系可以通过已经写好的cocosAPI进行想换转换; 4、所有的节点需要转为一个节点上或者是统一的世界坐标系……
通过JavaScript实现漂浮
<html>
<head><meta http-equiv"Content-Type" content"text/html"; charset"gb2312" /><title>漂浮广告</title><style type"text/css">div{position:absolute;}</style>
</head>
&……
编程日记2023/4/16 15:01:23