最近想学一下图卷积GCN,教程竟然都是pyTorch的,作为一名重度TensorFlow用户太崩溃了,没办法只能学一波pyTorch了。
首先在pyTorch中,一个张量(tensor)可能会被部署在CPU上,也可能被部署在GPU上。它们的数据类型是不同的。即使是同一个数据,被部署在不同位置,那么它的数据类型也是不一样的。数据类型如下:
import torch
'''
# pyTorch的数据类型
# -------------------------------------- #
#(1)CUP上的数据类型
# torch.FloatTensor (float32)
# torch.DoubleTensor (float64)
# torch.ByteTensor (float16)
# torch.CharTensor (uint8)
# torch.ShortTensor (int8)
# torch.InitTensor (int16)
# torch.LongTensor (int64)
# -------------------------------------- #
#(2)GUP上的数据类型
# torch.cuda.FloatTensor (float32)
# torch.cuda.DoubleTensor (float64)
# torch.cuda.ByteTensor (float16)
# torch.cuda.CharTensor (uint8)
# torch.cuda.ShortTensor (int8)
# torch.cuda.InitTensor (int16)
# torch.cuda.LongTensor (int64)
# -------------------------------------- #
'''
查看张量数据类型: tensor.type()
python方法查看基本数据类型: type( tensor )
查看tensor是否是指定的数据类型: isinstance( tensor, 张量类型 )
将CPU上的张量部署到GPU上: tensor.cuda()
查看张量的内存占用数量: tensor.numel()
# 创建一个二维tensor, 均值=0,方差=1的随机正态分布
data = torch.randn(2,3) # 两行三列
data.type() # 'torch.FloatTensor'
type(data) # torch.Tensor 返回基本数据类型
# 检验是否是给定的tensor类型
isinstance(data, torch.FloatTensor) # True
# 检验是否是GPU上的tensor类型
isinstance(data, torch.cuda.FloatTensor) # False
# 将cpu上的tensor搬运到GPU上
data_GPU = data.cuda()
# 再次检验是否是GPU上的tensor类型
isinstance(data_GPU, torch.cuda.FloatTensor) # True
# 查看占用的内存数量
data.numel() # 2*3=6
查看张量的形状: tensor.shape 和 tensor.size()
查看张量的维度(深度): tensor.dim()
# 创建一个标量tensor
data = torch.tensor(2.2)
# 查看张量的维度
data.shape # torch.Size([]) 表示0维
data.dim() # 0
data.size() # torch.Size([])
# 创建一个一维的向量tensor
data = torch.tensor([1.1, 2.2, 3.3])
# 查看张量的维度
data.shape # torch.Size([3])
data.dim() # 1
data.size() # torch.Size([3])
# 创建一个二维tensor
data = torch.randn(2,3)
# 查看张量的维度
data.shape # torch.Size([2, 3])
data.dim() # 2
data.size() # torch.Size([2, 3])
标量就是一个数值,维度=0,在神经网络中对损失函数值求平均,这个结果值通常就是个标量
# 将标量1.0变成tensor类型
data = 1.0
data = torch.tensor(data)
# 维度=0的标量tensor
print(data) # tensor(1.)
向量的维度=1,有若干个元素,在神经网络中神经元的偏置项,一般都是向量
将numpy类型转为tensor类型: torch.from_numpy( np数组 )
# 创建一个长度为1的向量
data = torch.tensor([1.1])
print(data) # tensor([1.1000])
# 创建一个长度为2的向量
data = torch.tensor([1.1, 2.2])
print(data) # tensor([1.1000, 2.2000])
# 生成维度=1,且size=1的float类型的tensor向量
data = torch.FloatTensor(1) # 数据是随机初始化的
print(data) # tensor([9.2755e-39])
# 生成维度=1,且size=2的float类型的tensor向量
data = torch.FloatTensor(2) # 数据随机初始化
print(data) # tensor([9.3233e+27, 6.4843e+16])
# 通过numpy生成一个长度=2的向量
data = np.ones(2) # [1., 1.]
data = torch.from_numpy(data) # tensor([1., 1.], dtype=torch.float64)
二阶矩阵的维度=2,例如shape=[b, n],在CNN中可理解为,有b张图像,每张图有n个像素值
查看张量的某个维度的大小: tensor.shape[ i ] 和 tensor.size( i )
# 创建一个2行3列的tensor,随机正态分布
data = torch.randn(2,3)
# tensor([[ 1.3635, -0.2479, 1.0086],
# [-1.5084, 0.3019, 0.5033]])
# 查看tensor的形状
data.shape # torch.Size([2, 3])
data.size() # torch.Size([2, 3])
# 查看tensor的shape的第0个元素
data.shape[0] # 2
data.size(0) # 2
高阶矩阵一般指二阶以上的,在CNN中常用的是四维的tensor,如shape=[b,w,h,c],代表b张图片,每张图片的宽高(w,h),每张图片的通道数为c
# 随机0-1均匀分布生成三维tensor
data = torch.rand(1,2,3)
# tensor([[[0.9147, 0.7105, 0.7755],
# [0.7555, 0.6148, 0.2824]]])
# 查看tensor的形状
data.shape # torch.Size([1, 2, 3])
# 取第0个元素的所有值
data[0]
# tensor([[0.7642, 0.4086, 0.9094],
# [0.3662, 0.4620, 0.2555]])
# 将shape返回的数据类型变成list类型
data[0].shape # torch.Size([2, 3])
list(data[0].shape) # [2,3]