从原理到实践 | Pytorch tensor 张量花式操作

文章目录

  • 1.张量形状与维度
    • 1.1标量(0维张量):
    • 1.2 向量(1维张量):
    • 1.3矩阵(2维张量):
    • 1.4高维张量:
  • 2. 张量其他创建方式
    • 2.1 创建全零或全一张量:
    • 2.2 创建随机张量:
    • 2.3 创建单位矩阵:
    • 2.4 创建序列张量:
  • 3. 张量元素
    • 3.1 查看元素类型
    • 3.2 张量元素类型转换
  • 4. 张量运算
    • 4.1 张量的基本运算
    • p.2 张量间乘法点积运算
    • 4.3 张量元素运算函数
      • 4.3.1逐元素运算函数:
      • 4.3.2 统计汇总运算函数
  • 5.张量的拼接 切片 扩展 重塑 改变形状等操作
    • 5.1 张量拼接(Concatenation):
    • 5.2 张量切片(Slicing):
    • 5.3 张量转置(Transpose):
    • 5.4 张量形状重塑:
  • 6.广播机制
    • 6.1 张量+标量
    • 6.2 张量+张量

Tensor(张量)是一种多维数组(通常是数字)数据类型,是深度学习和机器学习中最基本的数据结构之一。

PyTorch提供了一种直观的方式来创建和操作张量,而且它还支持GPU加速,这对于深度学习任务非常重要。我们可以使用PyTorch来定义神经网络模型、进行前向传播和反向传播,以及许多其他深度学习任务,因而了解张量是了解这些任务的基础。

1.张量形状与维度

维度(Rank):张量的维度也称为秩(rank),表示张量中轴(或维度)的数量。标量是0维张量,向量是1维张量,矩阵是2维张量,以此类推。

我们使用**.shape** 查看形状,.ndim属性查看维度

当使用PyTorch库时,我们可以轻松地创建和操作张量。下面是使用PyTorch创建不同秩的张量的示例代码:

1.1标量(0维张量):

import torchscalar = torch.tensor(5)  # 创建一个标量
print("Scalar:", scalar)
print("Scalar的秩(Rank):", scalar.ndim)  # 输出0,表示秩为0
print("Scalar的形状", scalar.shape) #输出torch.Size([])  #输出torch.Size([])此时形状向量输出为空

1.2 向量(1维张量):

import torchvector = torch.tensor([1, 2, 3, 4])  # 创建一个向量
print("Vector:", vector)
print("Vector的秩(Rank):", vector.ndim ) # 输出1,表示秩为1
print("vector的形状", vector.shape) #输出torch.Size([4])

1.3矩阵(2维张量):

import torchmatrix = torch.tensor([[1, 2, 3], [4, 5, 6]])  # 创建一个2x3的矩阵
print("Matrix:")
print(matrix)
print("Matrix的秩(Rank):", matrix.ndim  # 输出2,表示秩为2
print("Matrix的形状:", matrix.shape  # 输出torch.Size([2,3]) 2x3的矩阵

1.4高维张量:

import torch
tensor_3d = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]]])  # 创建一个2x2x2的3维张量
print("3D Tensor:")
print(tensor_3d)
print("3D Tensor的秩(Rank):", tensor_3d.ndim)  # 输出3,表示秩为3
print("3D Tensor的形状:", tensor_3d.shape ) # 输出torch.Size([2,2,2]) 2x2x2的3维张量

2. 张量其他创建方式

以上我们实际上是通过torch.tensor函数把列表转换为tensor张量

除此之外,还有一些其他torch内置函数的创建方式

2.1 创建全零或全一张量:

# 创建特定形状的全零张量
zeros_tensor = torch.zeros(3, 2) #创建形状(3,2)的全零张量# 创建特定形状的全一张量
ones_tensor = torch.ones(2, 3)#创建形状(2,3)的全一张量

2.2 创建随机张量:

# 创建特定形状的随机均匀分布的张量 每个元素都会随机生成,取值范围是大于等于0且小于1的浮点数。
uniform_random = torch.rand(2, 2) #形状(2,2)# 创建随机正态分布的张量
normal_random = torch.randn(3, 3)  #形状(3,3)

2.3 创建单位矩阵:

# 创建单位矩阵
identity_matrix = torch.eye(4)

输出

tensor([[1., 0., 0., 0.],
[0., 1., 0., 0.],
[0., 0., 1., 0.],
[0., 0., 0., 1.]])

2.4 创建序列张量:

# 创建从0到4的张量
sequence_tensor = torch.arange(5)# 创建从2到10的张量,步长为2
sequence_with_step = torch.arange(2, 11, step=2)

3. 张量元素

张量中的每个值称为元素。根据张量的维度和形状,可以有不同数量的元素。例如,一个形状为(3, 4)的张量将包含12个元素。

每个元素可以有不同的类型

张量可以包含不同的数据类型,如整数、浮点数、布尔值等。常见的数据类型包括int32float32bool

3.1 查看元素类型

使用 .dtype 属性可以查看张量的数据类型。例如:

pythonCopy codeimport torch# 创建一个张量
tensor = torch.tensor([1, 2, 3, 4], dtype=torch.float32)# 查看张量的数据类型
print(tensor.dtype)

输出将显示张量的数据类型,例如 torch.float32

注意,python其他数据类型查看是通过type函数(),注意区分,距离如下

# 定义不同类型的变量
integer_variable = 42
float_variable = 3.14
string_variable = "Hello, World!"
list_variable = [1, 2, 3]
dictionary_variable = {"name": "John", "age": 30}# 使用 type() 函数查看数据类型
print(type(integer_variable))  # <class 'int'>
print(type(float_variable))    # <class 'float'>
print(type(string_variable))   # <class 'str'>
print(type(list_variable))     # <class 'list'>
print(type(dictionary_variable))  # <class 'dict'>

3.2 张量元素类型转换

通过to函数() 或者用type()函数

注意这里的type()函数是tensor张量自己带的,不是上面讲到3.1讲到的python内的type函数

import torch
# 创建一个整数类型的张量
int_tensor = torch.tensor([1, 2, 3, 4],dtype=torch.int32)# 将整数类型的张量转换为浮点数类型  或者 float_tensor = int_tensor.type(torch.float32)
float_tensor = int_tensor.to(torch.float32)# 查看新的张量的数据类型
print(float_tensor.dtype)

输出为 torch.float32

注意 执行to函数之后必须进行赋值操作,否则该操作就丢失了,查看下面的代码

import torch
# 创建一个整数类型的张量
int_tensor = torch.tensor([1, 2, 3, 4],dtype=torch.int32)
# 将整数类型的张量转换为浮点数类型
int_tensor.to(torch.float32)
# 查看新的张量的数据类型
print(int_tensor.dtype)

最开始我觉得会输出torch.float32 实际输出torch.int32

4. 张量运算

4.1 张量的基本运算

  • 加法和减法:可以使用 +- 运算符执行张量的逐元素加法和减法。
  • 乘法和除法:可以使用 */ 运算符执行逐元素的乘法和除法。
  • 幂运算:使用 ** 运算符进行幂运算。
  • 取负值:使用 - 运算符取张量的负值。
import torch# 创建两个示例张量
tensor1 = torch.tensor([1.0, 2.0, 3.0])
tensor2 = torch.tensor([4.0, 5.0, 6.0])# 加法和减法
result_addition = tensor1 + tensor2  # 逐元素加法
result_subtraction = tensor1 - tensor2  # 逐元素减法# 乘法和除法
result_multiplication = tensor1 * tensor2  # 逐元素乘法
result_division = tensor1 / tensor2  # 逐元素除法# 幂运算
exponent = 2
result_power = tensor1 ** exponent  # 每个元素求平方# 取负值
result_negation = -tensor1  # 每个元素取负值print("Addition:", result_addition)
print("Subtraction:", result_subtraction)
print("Multiplication:", result_multiplication)
print("Division:", result_division)
print("Power:", result_power)
print("Negation:", result_negation)

输出

p.2 张量间乘法点积运算

  1. 矩阵相乘

    使用 torch.matmul() 函数或 @ 运算符 或**torch.mm()** 可以执行两个张量(矩阵)的矩阵相乘。矩阵相乘要求左边矩阵的列数等于右边矩阵的行数

    import torch# 创建两个示例矩阵
    matrix1 = torch.tensor([[1, 2], [3, 4]])
    matrix2 = torch.tensor([[5, 6], [7, 8]])# 矩阵相乘 matmul
    result_matrix_mul_1 = torch.matmul(matrix1, matrix2)
    # 或者使用 @ 运算符
    result_matrix_mul_2 = matrix1 @ matrix2
    # 矩阵相乘 mm
    result_matrix_mul_3=torch.mm(matrix1, matrix2)print("Matrix Multiplication:")
    print(result_matrix_mul_1)
    print(result_matrix_mul_2)
    print(result_matrix_mul_3)
    

    输出将是两个矩阵相乘的结果

    Matrix Multiplication:
    tensor([[19, 22],
    [43, 50]])
    tensor([[19, 22],
    [43, 50]])
    tensor([[19, 22],
    [43, 50]])

  2. 批量矩阵相乘

    使用 torch.matmul() 函数和**@运算符可以执行两个张量的批量矩阵相乘。这对于同时处理多个矩阵非常有用,但要求最后两个维度必须是矩阵的维度**。而mm只能用于单个矩阵乘法

    import torch# 创建两个批量矩阵(3个2x2矩阵)
    batch_matrix1 = torch.tensor([[[1, 2], [3, 4]], [[5, 6], [7, 8]], [[9, 10], [11, 12]]])
    batch_matrix2 = torch.tensor([[[2, 0], [1, 2]], [[-1, -2], [-3, -4]], [[0, 1], [-1, 0]]])# 执行批量矩阵相乘
    result_batch_matrix_mul_1 = batch_matrix1 @ batch_matrix2
    result_batch_matrix_mul_2 =torch.matmul(batch_matrix1,batch_matrix2)
    # 或者使用 @ 运算符
    # result_batch_matrix_mul = batch_matrix1 @ batch_matrix2print("Batch Matrix Multiplication:")
    print(result_batch_matrix_mul_1)
    print(result_batch_matrix_mul_2)

    输出将是批量矩阵相乘的结果

    输出

    Batch Matrix Multiplication:
    tensor([[[ 4, 4],
    [ 10, 8]],

    ​ [[-23, -34],
    ​ [-31, -46]],

       	 [[-10,   9],[-12,  11]]])
    

    tensor([[[ 4, 4],
    [ 10, 8]],

         [[-23, -34],[-31, -46]],
    

    ​ [[-10, 9],
    ​ [-12, 11]]])

  3. 点积

    点积是两个向量的内积,也可以视为两个矩阵的逐元素乘法后的和。在 PyTorch 中,可以使用 torch.dot() 函数来计算两个一维张量的点积。

    import torch# 创建两个一维示例张量
    vector1 = torch.tensor([1, 2, 3])
    vector2 = torch.tensor([4, 5, 6])# 计算点积
    dot_product = torch.dot(vector1, vector2)print("Dot Product:")
    print(dot_product)
    

    输出将是两个向量的点积结果

Dot Product:
tensor(32)

4.3 张量元素运算函数

tensor张量还会自带很多的运算函数,方便我们的操作

4.3.1逐元素运算函数:

这些运算将分别应用于张量的每个元素,结果将生成一个与原始张量相同形状的新张量。

  • torch.abs(tensor):计算张量中每个元素的绝对值。
  • torch.sqrt(tensor):计算张量中每个元素的平方根。
  • torch.exp(tensor):计算张量中每个元素的指数值。
  • torch.log(tensor):计算张量中每个元素的自然对数。

4.3.2 统计汇总运算函数

这些运算将返回张量的单个标量值,通常用于统计和汇总。

  • torch.sum(tensor):计算张量中所有元素的和。
  • torch.mean(tensor):计算张量中所有元素的平均值。
  • torch.max(tensor)torch.min(tensor):计算张量中的最大值和最小值。
  • torch.argmax(tensor)torch.argmin(tensor):返回张量中最大值和最小值的索引。
  • torch.unique(tensor):返回张量中的唯一元素。
  • torch.histc(tensor, bins=10, min=0, max=1):计算张量的直方图。

5.张量的拼接 切片 扩展 重塑 改变形状等操作

PyTorch 提供了一系列用于处理和操作张量的运算,包括拼接、切片、转置、扩展和重塑等。以下是这些运算的详细介绍:

5.1 张量拼接(Concatenation):

  • torch.cat(tensors, dim=0):将多个张量沿指定维度 dim 进行拼接,生成一个新的张量。这在将多个张量连接在一起时非常有用。

    import torch# 创建两个示例张量
    tensor1 = torch.tensor([[1, 2,3], [4, 5,6]])  #(2×3)
    tensor2 = torch.tensor([[7, 8,9], [10, 11,12]]) #(2×3)# 沿行维度进行拼接
    result_concatenation_row = torch.cat((tensor1, tensor2), dim=0) #行维度对应相加,最后拼接后的形状(4×3)
    result_concatenation_column=torch.cat((tensor1, tensor2), dim=1)#列维度对应相加,最后拼接后的形状(2×6)print("Concatenation:")
    print(result_concatenation_row)
    print(result_concatenation_column)

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

5.2 张量切片(Slicing):

  • 使用索引和切片运算符 [] 对张量进行切片。可以指定要提取的元素的索引或范围。这对于获取部分数据非常有用。

    import torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6], [7, 8, 9]])# 提取特定元素
    element = tensor[0, 1]  # 获取第一行第二列的元素# 提取特定行或列
    row = tensor[1, :]  # 获取第二行的所有元素
    column = tensor[:, 2]  # 获取第三列的所有元素print("Element:", element)
    print("Row:", row)
    print("Column:", column)
    

Element: tensor(2)
Row: tensor([4, 5, 6])
Column: tensor([3, 6, 9])

5.3 张量转置(Transpose):

  • torch.transpose(tensor, dim0, dim1):将张量的指定维度进行转置,生成一个新的张量。这对于调整张量的维度顺序非常有用。

    import torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 转置张量
    transposed_tensor = torch.transpose(tensor, dim0=0, dim1=1)  # 交换行和列print("Transposed Tensor:")
    print(transposed_tensor)
    

输出

Transposed Tensor:
tensor([[1, 4],
[2, 5],
[3, 6]])

5.4 张量形状重塑:

  • tensor.view(new_shape)或者函数tensor.reshape(new_shape)将张量的形状重塑为新的形状,生成一个新的张量。这对于改变张量的形状非常有用,但要确保新形状与原始形状兼容。

    pythonCopy codeimport torch# 创建一个示例张量
    tensor = torch.tensor([[1, 2, 3], [4, 5, 6]])# 重塑张量的形状
    reshaped_tensor = tensor.view(3, 2)  # 将2x3矩阵重塑为3x2矩阵print("Reshaped Tensor:")
    print(reshaped_tensor)
    

这些张量操作非常有用,可用于处理和操作 PyTorch 张量,适应不同的任务和需求。请根据您的具体情况选择适当的操作。

6.广播机制

广播(Broadcasting)是一种在 PyTorch 中执行元素级运算的机制,它允许在不同形状的张量之间进行运算,而无需显式地扩展(重复复制)其中一个张量。广播使得在不同形状的张量上执行操作更加方便,因为它自动调整张量的形状,以使其兼容。

6.1 张量+标量

import torch# 创建示例张量
tensor = torch.tensor([[1, 2], [3, 4]])# 使用广播将标量加到矩阵的每个元素上
scalar = 2
result_broadcasting = tensor + scalarprint("Broadcasting:")
print(result_broadcasting)

输出

Broadcasting:
tensor([[3, 4],
[5, 6]])

6.2 张量+张量

广播规则如下:

不要求两个张量维度数相等,但要求从右向左逐一比较张量的维度(直到维度低的向量比较完毕)满足以下两个条件之一即可

(1)两个张量该维度相等

(2)其中一个张量该维度是1

如果在某一维度的比较上两者都不满足,则会引发广播错误。

tensor_1=torch.ones(2,3,4)  #2*3*4tensor_2=torch.ones(3,1)    #3*1tensor=tensor_2+tensor_1
print(tensor)

如上,从右向左 ,第一维(4和1 )虽然不相等,但tensor_2为1 满足条件(2)

​ 继续从右向左,第二维(3,3 )相等,满足条件(1)

​ 此时低维向量比较完毕,所以上述两者可以广播

tensor_1=torch.ones(2,3,3)#2*3*2tensor_2=torch.ones(2,1)  #2*3tensor=tensor_2+tensor_1
print(tensor)

而这个例子,从右向左 ,第一维(3和1 )虽然不相等,但tensor_2为1 满足条件(2)

​ 继续从右向左,第二维(3,2 )不相等,不满足条件(1),也不满足条件(2),引发广播失败

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/82299.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

幸福里基于 Flink Paimon 的流式数仓实践

摘要&#xff1a;本文整理自字节跳动基础架构工程师李国君&#xff0c;在 Streaming Lakehouse Meetup 的分享。幸福里业务是一种典型的交易、事务类型的业务场景&#xff0c;这种业务场景在实时数仓建模中遇到了诸多挑战。本次分享主要介绍幸福里业务基于 Flink & Paimon …

git仓库推送错误

错误背景 从github克隆仓库后&#xff0c;想推送到gitee&#xff0c;在推送时遇到 error: src refspec master does not match any. error: failed to push some refs to <REMOTE_URL>解决方法 rm -rf .github git init git add -A git commit -m "init for gite…

Linux日志管理-logrotate(crontab定时任务、Ceph日志转储)

文章目录 一、logrotate概述二、logrotate基本用法三、logrotate运行机制logrotate参数 四、logrotate是怎么做到滚动日志时不影响程序正常的日志输出呢&#xff1f;Linux文件操作机制方案一方案二 五、logrotate实战--Ceph日志转储参考 一、logrotate概述 logrotate是一个用于…

数据结构--哈希表,哈希函数(或者散列表、散列函数)

目录 哈希表的定义 处理冲突的方法--拉链法 散列查找 常见的散列函数&#xff08;构造哈希函数&#xff09; 除留余数法 直接定址法 数字分析法 平方取中法 处理冲突的方法--开放定址法 &#xff08;1&#xff09;线性探测法&#xff1a; &#xff08;2&#xff09…

mall商城项目:只启动mall-admin情况下Windows环境的部署

文章目录 前提ideaMysql创建数据库mall,导入项目document/sql文件夹下的mall.sql文件,初始化数据RedisPostMan登录接口测试运行前提 mall项目gitee 如果项目只启动mall-admin,仅需安装MySQL、Redis即可 idea IDEA的安装与使用请参考搜索插件仓库,安装插件Lombok;将项目下…

记录--IR_cut切换模块流程

api接口&#xff1a;/API/ChannelConfig/ImageControl/Set /API/ChannelConfig/ImageControl/range /API/ChannelConfig/ImageControl/Get IR_cut步骤&#xff08;已自动模式为例&#xff09;&#xff1a; 1、一直跑IRCutService线程&#xff0c;检查环境光敏值 2、光敏值达…

laravel框架 - 辅助函数

Laravel 常用辅助函数 辅助函数 Laravel 包含各种全局辅助函数。 laravel 中包含大量辅助函数&#xff0c;您可以使用它们来简化开发工作流程。 array_dot() 辅助函数允许你将多维数组转换为使用点符号的一维数组 $array [user > [username > something],app > [c…

速腾聚创80线激光雷达ros驱动安装

1. 激光雷达硬件连接 1.1 工具准备 1.2 硬件连接 设置PC Ubuntu1804静态IP&#xff0c;速腾聚创16线激光雷达出厂默认发送到192.168.1.102&#xff0c;在连接前可以通过wireshark抓包工具进行检测&#xff1b; sudo wireshark 正常发送UDP数据流才算正常接入&#xff01; 2. 软…

使用C#为进程创建DUMP文件

https://www.likecs.com/show-307694293.html 程序异常崩溃前使用此类为进程创建DUMP文件&#xff0c;之后可以使用WinDbg等工具进行分析。 辅助类代码 using System; using System.Diagnostics; using System.IO; using System.Runtime.InteropServices;namespace Infrastruc…

C语言入门Day_22 初识指针

目录 前言&#xff1a; 1.内存地址 2.指针的定义 3.指针的使用 4.易错点 5.思维导图 前言&#xff1a; 之前我们学过变量可以用来存储数据&#xff0c;就像一个盒子里面可以放不同的球一样。 这是一个方便大家理解专业概念的比喻。 在计算机世界里面&#xff0c;数据实…

怎么防止360安全卫士修改默认浏览器?

默认的浏览器 原先选项是360极速浏览器&#xff08;如果有安装的话&#xff09;&#xff0c;我这里改成了Chrome。 先解锁 才能修改。

docker alpine镜像中遇到 not found

1.问题&#xff1a; docker alpine镜像中遇到 sh: xxx: not found 例如 # monerod //注&#xff1a;此可执行文件已放到/usr/local/bin/ sh: monerod: not found2.原因 由于alpine镜像使用的是musl libc而不是gnu libc&#xff0c;/lib64/ 是不存在的。但他们是兼容的&…

千巡翼X1 让航测无人机更小更轻更高效

利用无人机进行航空摄影测量&#xff0c;已成为测绘外业生产的主要方式&#xff0c;不仅方便快捷&#xff0c;更能全面准确获得成果。近年来&#xff0c;凭借快速高效、机动灵活、安全可靠、低成本等诸多优势&#xff0c;小型多旋翼无人机逐渐成为一些航测项目作业的新利器。 千…

成绩判定(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

GEE学习总结(9)——像元二分法计算月度植被覆盖度(MODIS)

像元二分法计算植被覆盖度 通过MODIS的NDVI数据集MOD13Q1和像元二分法计算植被覆盖度 var multi_NDVI ee.ImageCollection(MODIS/006/MOD13Q1).filterDate(2015-06-01, 2016-09-01).select(NDVI).max().divide(10000).clip(geometry);var ndviVis {min: 0.0,max: 1,palette…

Redis——渐进式遍历和数据库管理命令

介绍 如果使用keys * 这样的操作&#xff0c;将Redis中所有的key都获取到&#xff0c;由于Redis是单线程工作&#xff0c;这个操作本身又要消耗很多时间&#xff0c;那么就会导致Redis服务器阻塞&#xff0c;后续的操作无法正常执行 而渐进式遍历&#xff0c;通过多次执行遍历…

【PowerQuery】PowerBI Pro账户的自动刷新

在数据和模型通过发布或者上传方式上传到PowerBI Pro中,如何来进行数据刷新呢?数据源依然在本地,而数据模型已经发布到PowerBI Pro云端服务中。如果数据源更新,我们的模型如何进行自动刷新呢? PowerBI Pro如果需要基于本地数据源更新进行模型更新需要部署相应的数据网关服…

智能合约漏洞案例,Euler Finance 1.96 亿美元闪电贷漏洞分析

智能合约漏洞案例&#xff0c;Euler Finance 1.96 亿美元闪电贷漏洞分析 2023 年 3 月 13 日上午 08:56:35 UTC&#xff0c;DeFi 借贷协议 Euler Finance 遭遇闪电贷攻击。 Euler Finance 是一种作为无许可借贷协议运行的协议。其主要目标是为用户提供各种加密货币的借贷便利。…

斯里兰卡投资促进部中国招商大使率考察团到访深兰科技

9月13日&#xff0c;来华访问的斯里兰卡投资促进部政府考察团&#xff0c;在斯里兰卡投资促进部中国招商大使吴克向的率领下&#xff0c;到访深兰科技集团&#xff0c;并与深兰科技集团董事副总裁刘园桂等进行了会谈。 考察团随行人员包括Sri Lanka Sithara Limited公司总裁Mr.…

VisualBox QA

出现提示注册表错误&#xff0c;或者之前正常&#xff0c;重启VisualBox后&#xff0c;VM运行失败时&#xff0c;可通过正确卸载VisualBox&#xff0c;然后使用注册表清理软件(CCleaner)清理注册表后&#xff0c;重装VisualBox&#xff0c;即会正常。&#xff08;一般用这个能解…