Meta Llama 3 .transpose().contiguous().view

2024-06-08 11:20

本文主要是介绍Meta Llama 3 .transpose().contiguous().view,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Meta Llama 3 .transpose().contiguous().view()

flyfish

参考地址
https://pytorch.org/docs/stable/generated/torch.transpose.html

transpose美[træn'spoʊz] 
英[træns'pəʊz;trɑːns-;-nz-] 
v. 使换位 / 转移 / 转换 / 调换n. <数>转置(矩)阵

矩阵转置(Matrix Transposition)是指将矩阵的行和列互换的位置。具体来说,如果你有一个矩阵 A A A,它的转置矩阵 A T A^T AT 是将矩阵 A A A 的第 i i i 行变为第 i i i 列,第 j j j 列变为第 j j j 行。

例子

假设有一个矩阵 A A A

A = [ 1 2 3 4 5 6 ] A = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]

矩阵 A A A 的转置 A T A^T AT 将如下:

A T = [ 1 4 2 5 3 6 ] A^T = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} AT= 123456

用 PyTorch 实现矩阵转置

我们可以使用 PyTorch 的 torch.transpose 函数来实现上述的矩阵转置操作。

import torch# 创建一个二维张量(矩阵)
A = torch.tensor([[1, 2, 3], [4, 5, 6]])# 进行转置操作
A_T = torch.transpose(A, 0, 1)print("Original Matrix (A):")
print(A)print("\nTransposed Matrix (A^T):")
print(A_T)

运行这段代码的输出如下:

Original Matrix (A):
tensor([[1, 2, 3],[4, 5, 6]])Transposed Matrix (A^T):
tensor([[1, 4],[2, 5],[3, 6]])

在 PyTorch 中,torch.transpose 函数用于交换张量的两个维度(轴)。参数 dim0 和 dim1 指定了需要交换的这两个维度。理解这两个参数需要先了解张量的维度(轴)的概念。

张量维度(轴)

  • 0维张量:一个标量(例如:5)

  • 1维张量:一个向量(例如:[1, 2, 3])

  • 2维张量:一个矩阵(例如:[[1, 2, 3], [4, 5, 6]])

  • 3维张量:一个三维数组(例如:一个形状为(2, 2, 3)的张量)
    在一个张量中,维度(轴)从外到内依次编号:

  • 对于一个形状为 (3, 4) 的二维张量,dim0 是第一个维度(3的那个维度),dim1 是第二个维度(4的那个维度)。

  • 对于一个形状为 (2, 3, 4) 的三维张量,dim0 是第一个维度(2的那个维度),dim1 是第二个维度(3的那个维度),dim2 是第三个维度(4的那个维度)。

示例说明

二维张量

考虑一个二维张量(矩阵):

import torchA = torch.tensor([[1, 2, 3], [4, 5, 6]])

它的形状是 (2, 3),即有 2 行和 3 列。

  • dim0 是 0 轴,对应行数 2。
  • dim1 是 1 轴,对应列数 3。
    调用 torch.transpose(A, 0, 1) 将交换行和列:
A_T = torch.transpose(A, 0, 1)
print(A_T)

输出:

tensor([[1, 4],[2, 5],[3, 6]])
三维张量

考虑一个三维张量:

B = torch.tensor([[[1, 2, 3], [4, 5, 6]],[[7, 8, 9], [10, 11, 12]]])

它的形状是 (2, 2, 3),即有 2 个深度,每个深度包含一个 (2, 3) 的矩阵。

  • dim0 是 0 轴,对应第一个维度 2。
  • dim1 是 1 轴,对应第二个维度 2。
  • dim2 是 2 轴,对应第三个维度 3。
    调用 torch.transpose(B, 1, 2) 将交换第二个和第三个维度:
B_T = torch.transpose(B, 1, 2)
print(B_T)

输出:

tensor([[[ 1,  4],[ 2,  5],[ 3,  6]],[[ 7, 10],[ 8, 11],[ 9, 12]]])

分析三维张量转置

原始三维张量

原始张量 B 是:

tensor([[[ 1,  2,  3],[ 4,  5,  6]],[[ 7,  8,  9],[10, 11, 12]]])

它的形状是 (2, 2, 3),这意味着:

  • 第一个维度有 2 个元素,每个元素是一个二维矩阵。
  • 每个二维矩阵的第二个维度有 2 行。
  • 每行有 3 列(第三个维度)。
转置操作 torch.transpose(B, 1, 2)

torch.transpose(B, 1, 2) 交换了第二个和第三个维度,这意味着我们将行和列互换。具体步骤如下:

  1. 原始张量的形状:(2, 2, 3)
  2. 交换第二和第三个维度:(2, 3, 2)
    操作后,我们的新张量 B_T 是:
tensor([[[ 1,  4],[ 2,  5],[ 3,  6]],[[ 7, 10],[ 8, 11],[ 9, 12]]])
新张量 B_T 解释
  • 第一个维度(深度)仍然是 2,表示有 2 个二维矩阵。
  • 第二个维度现在有 3 行(原来的列数)。
  • 第三个维度现在有 2 列(原来的行数)。

在 PyTorch 中,transpose、contiguous 和 view 这几个操作经常结合使用,是因为 transpose 只是改变了张量的视图,而不是实际内存布局。为了能够顺利进行后续的操作(例如 view),通常需要先调用 contiguous 来保证张量在内存中的布局是连续的。

1. transpose 改变视图但不改变内存布局

当我们使用 transpose 时,PyTorch 只是改变了张量的视图,并没有改变张量在内存中的实际存储方式。这样,转置后的张量在内存中不一定是连续的。如果直接对不连续的张量使用 view 会导致错误,因为 view 要求张量在内存中是连续的。

2. contiguous 使张量在内存中连续

使用 contiguous 可以创建一个新的张量,使得数据在内存中按当前视图的顺序连续存储。这样就可以确保在使用 view 时不会出现错误。

3. view 改变形状

view 可以改变张量的形状,但前提是张量在内存中是连续的。如果我们在一个不连续的张量上直接使用 view,会引发错误。因此,在调用 view 之前,通常会先调用 contiguous。

import torch# 假设有一个形状为 (batch_size, seq_len, features) 的张量
batch_size, seq_len, features = 2, 3, 4
x = torch.randn(batch_size, seq_len, features)# 进行转置操作
x_transposed = x.transpose(1, 2)# 打印张量信息
print("Transposed shape:", x_transposed.shape)
print("Is contiguous:", x_transposed.is_contiguous())# 确保内存布局连续
x_contiguous = x_transposed.contiguous()# 打印张量信息
print("Contiguous shape:", x_contiguous.shape)
print("Is contiguous:", x_contiguous.is_contiguous())# 使用 view 改变形状
new_shape = (batch_size, seq_len, -1)
x_viewed = x_contiguous.view(*new_shape)# 打印最终形状
print("Final shape:", x_viewed.shape)# Transposed shape: torch.Size([2, 4, 3])
# Is contiguous: False
# Contiguous shape: torch.Size([2, 4, 3])
# Is contiguous: True
# Final shape: torch.Size([2, 3, 4])

这篇关于Meta Llama 3 .transpose().contiguous().view的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1042039

相关文章

MVC(Model-View-Controller)和MVVM(Model-View-ViewModel)

1、MVC MVC(Model-View-Controller) 是一种常用的架构模式,用于分离应用程序的逻辑、数据和展示。它通过三个核心组件(模型、视图和控制器)将应用程序的业务逻辑与用户界面隔离,促进代码的可维护性、可扩展性和模块化。在 MVC 模式中,各组件可以与多种设计模式结合使用,以增强灵活性和可维护性。以下是 MVC 各组件与常见设计模式的关系和作用: 1. Model(模型)

MFC中App,Doc,MainFrame,View各指针的互相获取

纸上得来终觉浅,为了熟悉获取方法,我建了个SDI。 首先说明这四个类的执行顺序是App->Doc->Main->View 另外添加CDialog类获得各个指针的方法。 多文档的获取有点小区别,有时间也总结一下。 //  App void CSDIApp::OnApp() {      //  App      //  Doc     CDocument *pD

Python安装llama库出错“metadata-generation-failed”

Python安装llama库出错“metadata-generation-failed” 1. 安装llama库时出错2. 定位问题1. 去官网下载llama包 2.修改配置文件2.1 解压文件2.2 修改配置文件 3. 本地安装文件 1. 安装llama库时出错 2. 定位问题 根据查到的资料,发现时llama包中的execfile函数已经被下线了,需要我们手动修改代码后

Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token android.os.B

一个bug日志 FATAL EXCEPTION: main03-25 14:24:07.724: E/AndroidRuntime(4135): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.syyx.jingubang.ky/com.anguotech.android.activity.Init

自定义view中常用到哪些方法作用分别是什么

目录 构造函数onMeasure(int widthMeasureSpec, int heightMeasureSpec)onDraw(Canvas canvas)onLayout(boolean changed, int left, int top, int right, int bottom)onTouchEvent(MotionEvent event)onSizeChanged(int

Llama 3.1大模型的预训练和后训练范式解析

Meta的Llama大型语言模型每次出新版本,都会是一大事件。前段时间他们不仅发布了3.1的一个超大型的405亿参数模型,还对之前的8亿和70亿参数的模型做了升级,让它们在MMLU测试中的表现更好了。 不同模型在MMLU基准测试中的表现 他们还出了一个92页的技术报告《Llama 3 Herd of Models》(https://arxiv.org/abs/2407.21783),里

llama.cpp demo

git clone https://github.com/ggerganov/llama.cppcd llama.cpp 修改Makefile使能mfma参数     MK_CFLAGS   += -mfma -mf16c -mavx     MK_CXXFLAGS += -mfma -mf16c -mavx 安装python3依赖 cat ./requirements/requirem

android 动画 ——视图动画(View Animation)

android动画分为视图动画(View Animation)、属性动画(Property Animation) 想看属性动画(Property Animation):请移步至http://blog.csdn.net/u013424496/article/details/51700312 这里我们来说下视图动画(View Animation)的纯代码写法,还有一种是xml调用, 对于xml调

Android 自定义View控件,实现跟随手指触摸移动的小球

Android UI组件是通过继承View类,然后绘制内容,比如ImageView,TextView等组件都是继承View类。 当Android系统提供的组件功能不能满足需求时,可以通过继承View类重写一个或多个方法,派生自定义的组件,View类常用重写方法: 1.构造器:View子类最基本的重写方法 protected voidonDraw(Canvas canvas) public

Vue3+vite中使用import.meta.glob

前言:         在vue2中支持require导入模块或文件但是在vue3中已经不支持require导入了,为此vite提供了一个全新的方法import.meta.glob方法来支持批量导入文件  import.meta.glob 匹配到的文件默认是懒加载的,通过动态导入实现,并会在构建时分离为独立的 chunk。如果你倾向于直接引入所有的模块(例如依赖于这些模块中的副作用首先被应用