# 机器学习day05

张量元素类型转换

  1. data.type(torch.DoubleTensor)
 data = torch.full([2, 3], 10)
 print(data.dtype)
 # 将 data 元素类型转换为 float64 类型
data = data.type(torch.DoubleTensor)
 print(data.dtype)
 # 转换为其他类型
# data = data.type(torch.ShortTensor)
 # data = data.type(torch.IntTensor)
 # data = data.type(torch.LongTensor)
 # data = data.type(torch.FloatTensor)
  1. data.double()
data = torch.full([2, 3], 10)
 print(data.dtype)
 # 将 data 元素类型转换为 float64 类型
data = data.double()
 print(data.dtype)
 # 转换为其他类型
# data = data.short()
 # data = data.int()
 # data = data.long()
 # data = data.float()

1.1张量转换为NumPy数组

​ 使用 Tensor.numpy 函数可以将张量转换为 ndarray数组,但是共享内存, 可以使用 copy 函数避免共享。

# 1.将张量转换为 numpy数组
data_tensor= torch.tensor([2, 3, 4])
 # 使用张量对象中的 numpy函数进行转换
data_numpy = data_tensor.numpy()
 print(type(data_tensor))
 print(type(data_numpy))
 # 注意: data_tensor和 data_numpy共享内存
# 修改其中的一个,另外一个也会发生改变
# data_tensor[0] = 100
 data_numpy[0] = 100
 print(data_tensor)
 print(data_numpy)
#2.对象拷贝避免共享内存
data_tensor= torch.tensor([2, 3, 4])
 # 使用张量对象中的 numpy函数进行转换,通过copy方法拷贝对象
data_numpy = data_tensor.numpy().copy()
 print(type(data_tensor))
 print(type(data_numpy))
 # 注意: data_tensor和 data_numpy此时不共享内存
# 修改其中的一个,另外一个不会发生改变
# data_tensor[0] = 100
 data_numpy[0] = 100
 print(data_tensor)
 print(data_numpy)

​ 使用from_numpy()可以将ndarray数组转换为Tensor,共享内存,使用copy()函数避免共享

data_numpy = np.array([2, 3, 4])
 # 将 numpy 数组转换为张量类型
# 1. from_numpy
 # 2. torch.tensor(ndarray)
 data_tensor = torch.from_numpy(data_numpy)
 # nunpy 和 tensor 共享内存
# data_numpy[0] = 100
 data_tensor[0] = 100
 print(data_tensor)
 print(data_numpy)

​ 使用torch.tensor()可以将ndarray数组转换为Tensor,不共享内存。

data_numpy = np.array([2, 3, 4])
 data_tensor = torch.tensor(data_numpy)
 # nunpy 和 tensor 不共享内存
# data_numpy[0] = 100
 data_tensor[0] = 100
 print(data_tensor)
 print(data_numpy)

​ 对于只有一个元素的张量,使用item()函数将该值从张量中提取出来

# 当张量只包含一个元素时, 可以通过 item() 函数提取出该值
data = torch.tensor([30,])
 print(data.item())
 data = torch.tensor(30)
 print(data.item())

总结

  1. 张量转换为 numpy数组
  • data_tensor.numpy()
  • data_tensor.numpy().copy()
  1. numpy 转换为张量
  • torch.from_numpy(data_numpy)
  • torch.tensor(data_numpy)
  1. 标量张量和数字转换
  • data.item()

1.2张量数值计算

加减乘除取负号:(不会修改原数据)

add、sub、mul、div、neg

add_、sub_、mul_、div_、neg_(其中带下划线的版本会修改原数据)

data = torch.randint(0, 10, [2, 3])
 print(data)
 # 1. 不修改原数据
new_data= data.add(10)  # 等价 new_data= data + 10
 print(new_data)
 # 2. 直接修改原数据 注意: 带下划线的函数为修改原数据本身
data.add_(10)  # 等价 data += 10
 print(data)
 # 3. 其他函数
print(data.sub(100))
 print(data.mul(100))
 print(data.div(100))
 print(data.neg())

1.2.1点乘指(Hadamard)的是两个同维矩阵对应位置的元素相乘,使用mul和运算符 * 实现。

6124f2470626839e370f9ed38457e8a

data1 = torch.tensor([[1, 2], [3, 4]])
 data2 = torch.tensor([[5, 6], [7, 8]])
 # 第一种方式
data = torch.mul(data1, data2)
 print(data)
 # 第二种方式
data = data1 * data2
 print(data)

1.2.2矩阵乘法运算

矩阵乘法运算要求第一个矩阵 shape: (n, m),第二个矩阵 shape: (m, p), 两个矩阵点积运算 shape 为: (n, p)。

  1. 运算符 @ 用于进行两个矩阵的乘积运算
  2. torch.matmul 对进行乘积运算的两矩阵形状没有限定.对数输入的 shape 不同的张量, 对应的最后几个维度必须符 合矩阵运算规则
# 点积运算
data1 = torch.tensor([[1, 2], [3, 4], [5, 6]])
 data2 = torch.tensor([[5, 6], [7, 8]])
 # 方式一:
 data3 = data1 @ data2
 print("data3-->", data3)
 # 方式二:
 data4 = torch.matmul(data1, data2)
 print("data4-->", data4)
posted @ 2024-06-21 20:08  叱咤月海鱼鱼猫  阅读(44)  评论(0)    收藏  举报