import torch
import numpy as np
# 1.1 根据已有的数据创建张量
def test01():
# 1.1 创建标量
data = torch.tensor(10)
print(data)
# 1.2 使用numpy数组来创建张量
data = np.random.randn(2,3)
data = torch.tensor(data)
print(data)
# 1.3使用list列表创建张量
data = [[10., 20., 30.], [40., 50., 60.]]
print(data)
test01()
# 2. 创建指定形状的张量
def test02():
# 2.1 创建一个2行3列的张量
data = torch.Tensor(2,3)
print(data)
# 2.2 可以创建指定值得张量
# 注意传递列表
data = torch.Tensor([2, 3])
print(data)
data = torch.Tensor([10])
print(data)
test02()
# 3.创建指定类型的张量
def tensor03():
# 前面创建的张量都是使用默认类型或者元素类型
# 创建一个 int32类型的张量
data = torch.IntTensor(2,3)
print(data)
torch.ShortTensor(2,3) # 表示创建的是int16张量
torch.LongTensor(2,3) # 表示创建int32张量
torch.FloatTensor(2,3) # 表示创建Float32张量
# 注意:如果创建指定类型的张量,但是传递的数据不匹配,会发生类型转换
data = torch.IntTensor([2.5, 3.5])
print(data)
tensor03()
## 创建线性和随机张量
1. torch.arange 和 torch.linspace 创建线性张量
2. torch.random int_seed 和 torch.random.manual_seed 随机种子设置
3. torch.randn 创建随机张量
import torch
# 1. 创建线性空间的张量
def test01():
# 1.在指定区间按照步长生成元素[start, end, step]
data = torch.arange(0,10,2)
print(data)
test01()
# 在指定区间按照元素个数生成
torch.linspace(0,11,10)
# 创建随机张量
torch.randn(2,3)
# 随机数种子设置
torch.random.initial_seed()
# 必须在同一段代码前提下,可以这样使用,能够浮现结果
torch.random.manual_seed(100)
torch.randn(2,3)
torch.randn(2,3)
## 创建01张量
torch.ones, torch.ones_like
torch.zeros, torch.zeros_like
torch.full, torch.full_like
a = torch.ones(3,2)
a
torch.zeros_like(a)
ccc = torch.full((2,3),5)
torch.full_like(ccc,10)
## 张量的指定类型转换
tensor.type(torch.DoubleTensor)
torch.double()
data = torch.full([2,3],10)
data
print(data.dtype)
## 类型转换
data = torch.full([2,3], 10)
data.dtype
data
# 转化后需要承接一下
data = data.type(torch.DoubleTensor)
data.dtype
# 使用具体类型的函数进行转换
data = torch.full([2,3],10)
data.dtype
# 这种方式更加便捷
data = data.double()
data.dtype
data.int(), data.short(), data.long(), data.float()
# int 32 int 16 int 64 float 32
### 张量的基本运算 add, sub, mul, div, neg等函数, 以及这些函数的带下划线的版本 add_ 、 sub_ 、 mul_ 、 div_ 、 neg_, 其中带下划线的版本为修改原数据
import numpy as np
data = torch.randint(0,10,[2,3])
data
# 1. 不修改原数据
new_data = data.add(10)
new_data
new_data = data.add(10)
new_data
data.add_(10)
# 其它函数
data.sub(100)
data.mul(100)
data.div(100)
data.neg()
### 阿达玛积运算
阿达玛积是指矩阵对应位置的元素相乘
data1 = torch.tensor([[1,2],[3,4]])
data2 = torch.tensor([[5,6],[7,8]])
data = torch.mul(data1, data2)
data
data = data1 * data2
data
### 点集运算
(m,n) * (n,p) = (m,p)
1.运算符用 @ 用于进行两矩阵的点乘运算
2. torch.mm 2维度 torch.bmm 3维度 torch.matmul 多维度
data1 = torch.tensor([[1,2],[3,4],[5,6]])
data2 = torch.tensor([[5,6],[7,8]])
# 第一种方法
data = data1 @ data2
data
data = torch.mm(data1,data2)
data
# 第三种方式
data = torch.matmul(data1, data2)
data
data1 = torch.randn(3,4,5)
data2 = torch.randn(3,5,8)
# b = batch
data = torch.bmm(data1, data2)
data
data1 = torch.randn(3,4,5)
data2 = torch.randn(3,5,8)
torch.matmul(data1,data2).shape
## 指定运算设备
Pytorch 默认会将张量创建在CPU控制的内存中.
1. 使用cuda方法
2. 直接将张量创建在指定设备上
3. 使用to方法
data = torch.tensor([10,20,30])
data,data.device
data = data.cuda()
data,data.device
data = data.cpu()
data,data.device
data = torch.tensor([10,20,30], device="cuda:0")
data.device
data = data.cpu()
data
## 张量的类型转换
张量和numpy的相互转换
data_tensor = torch.tensor([2,3,4])
data_tensor
data_numpy = data_tensor.numpy()
data_numpy
type(data_tensor), type(data_numpy)
注意此时data_tensor和data_numpy 共享内存, 修改其中一个,另外一个也会跟着改变,可以使用copy函数避免共享
data_numpy[0] = 100
data_numpy,data_tensor
data_tensor = torch.tensor([2,3,4])
data_numpy = data_tensor.numpy().copy()
data_numpy[0] = 222
data_numpy
data_tensor
### numpy 转换成张量
1. 使用 from_numpy 可以将ndarray数组转换为Tensor, 默认共享内存,使用copy函数避免共享
2. 使用torch.tensor可以将ndarray数组转换为Tensor. 默认不共享内存
data_numpy = np.array([2,3,4])
data_numpy
# 浅拷贝
data_tensor = torch.from_numpy(data_numpy)
data_tensor
data_tensor = torch.from_numpy(data_numpy.copy())
data_tensor
data_numpy[0] = 100
data_numpy, data_tensor
# 2. 使用torch.tensor 函数
data_numpy = np.array([2,3,4])
data_tensor = torch.tensor(data_numpy)
data_numpy,data_tensor
data_numpy[0] = 100
data_numpy,data_tensor
### 标量张量和数字的转换
对于只有一个元素的张量,使用item方法将该值从张量中提取出来
# 当张量只包含一个元素时,可以通过使用item函数提取出该值
data = torch.tensor([30.])
print(data.item(),data)
data = torch.tensor(30)
data,data.item()
t1 = torch.tensor(30)
t2 = torch.tensor([30])
t3 = torch.tensor([[30]])
print(t1, t2, t3, t1.shape, t2.shape, t3.shape)
# t1 是标量, t2 是一维张量, t2 是二维
## 注意:张量中只有一个元素,如果有多个元素的化,使用item函数可能就会报错
t4 = torch.tensor([30,40])
t4
t4[0].item()
t4.item()