开始学习pytorch, 记录学习历程
本博客为关于以下函数的实例
np.ones
torch.tensor
torch.from_numpy
torch.zeros
torch.zeros_like
torch.full
torch.arange
torch.linspace
torch.logspace
torch.eye
torch.randperm
torch.randint
torch.normal
以及
对于broadcast机制的理解见代码中注释部分
import torch
import numpy as np
torch.manual_seed(1)
flag = False
# 直接创建数据
if flag:
arr = np.ones((3, 3))
print("ndarray的数据类型: ", arr.dtype)
r = torch.tensor(arr)
t = torch.tensor(arr, device='cuda')
print(t)
print(r)
############################################### example 2
# 验证tensor与array共享内存
# 将一个Torch张量转换为一个NumPy数组是轻而易举的事情,反之亦然。
# Torch张量和NumPy数组将共享它们的底层内存位置,因此当一个改变时,另外也会改变。
flag = False
if flag:
arr = np.array([[1, 2, 3], [4, 5, 6]])
t = torch.from_numpy(arr)
print("numpy array: ", arr)
print("tensor : ", t)
# arr[0, 0] = 0
# print("n\修改arr后 :", arr)
# print("numpy :", arr)
# print("tensor :", t)
print("\n 修改tensor")
t[0, 0] = -10
print("numpy array: ", arr)
print("tensor : ", t)
################################################ example 3
# 依size创建全零张量
flag = False
if flag:
out_t = torch.tensor([1])
t = torch.zeros((3, 3), out=out_t)
print(t,'\n', out_t)
# 这里id表示返回对象的唯一标识符,其为整数
print(id(t), id(out_t), id(t) == id(out_t))
################################################ example 4
# 依input创建全零张量
flag = False
if flag:
input = torch.zeros((5, 5))
t = torch.zeros_like(input)
print(t)
################################################## example 5
# 创建指定值指定大小的张量
flag = False
if flag:
t = torch.full((5, 5), 8, dtype=torch.float16)
print(t)
################################################# example 6
# 创建等差一维张量
flag = False
if flag:
# t = torch.arange(start=1, end= 10, step= 0.9)
t = torch.arange(2, 30, 0.5)
print(t)
################################################### examle 7
# 创建均分一维张量
flag = False
if flag:
t1 = torch.linspace(1, 20, 10)
t2 = torch.linspace(1, 20, 5)
print("创建均分一维张量 (1) : ", t1)
print("创建均分一维张量(2): ", t2)
################################################### example 8
# 创建对数均分张量
flag = False
if flag:
t1 = torch.logspace(1, 20)
t2 = torch.logspace(1, 10, 5)
print("创建对数均分张量t1 = : ", t1)
print("创建对数均分张量t2 = : ", t2)
#################################################### examle 9
# 创建二维单位对角矩阵,生成一定范围内的随机排列,生成区间范围内的整数均匀分布
flag = False
if flag:
t1 = torch.eye(5, 5)
t2 = torch.randperm(10)
t3 = torch.randint(1, 10, (3, 3))
print("创建单位对角矩阵(二维) : ", t1)
print("生成一定范围内的随机排列 : ", t2)
print("生成区间范围内的整数均匀分布 : ", t3)
##################################################### example 10
# 生成指定均值和方差的正态分布
# broadcast机制,
# 广播用以描述numpy中对两个形状不同的阵列进行数学计算的处理机制。
# 较小的阵列“广播”到较大阵列相同的形状尺度上,使它们对等以可以进行数学计算。
# 广播提供了一种向量化阵列的操作方式,因此Python不需要像C一样循环。
# 广播操作不需要数据复制,通常执行效率非常高。然而,有时广播是个坏主意,
# 可能会导致内存浪费以致计算减慢。
# 对两个阵进行操作时,NumPy逐元素地比较他们的形状,从后面的维度向前执行。当以下情形出现时,两个维度是兼容的:
# 1,它们相等
# 2,其中一个是1
# 如果这些条件都没有达到,
# 将会抛出错误:frames are not aligned exception,
# 表示两个阵列形状不兼容。结果阵列的尺寸与输入阵列的各维度最大尺寸相同。
# 阵列不需要有相同的维度。
# 当任何一个维度是1,那么另一个不为1的维度将被用作最终结果的维度。
# 也就是说,尺寸为1的维度将延展或“复制”到与另一个维度匹配。
# 一定要注意,执行 broadcast 的前提在于,
# 两个 ndarray 执行的是 element-wise(按位加,按位减) 的运算,
# 而不是矩阵乘法的运算,矩阵乘法运算时需要维度之间严格匹配。
# (且矩阵乘法,np.dot(A, B) 如果维度不匹配,提示的错误不会是 broadcast,而是 aligned)
# 此处均值和方差分别为标量或者张量时,就用到了broadcast机制,
# 注意,当均值和方差均为标量时需要设定size
flag = False
if flag:
# mean: 张量 std: 张量
mean_z = torch.arange(1, 10, dtype=torch.float)
std_z = torch.arange(1, 10, dtype=torch.float)
t_z_z = torch.normal(mean_z, std_z)
print("均值和方差均为张量生成正态分布 : ", t_z_z)
# mean: 张量 std: 标量
mean_z = mean_z
std_b = 2
t_z_b = torch.normal(mean_z, std_b)
print("均值为张量,方差为标量,生成正态分布 : ", t_z_b)
# mean: 标量 std: 张量
mean_b = 5
std_z = std_z
t_b_z = torch.normal(mean_b, std_z)
print("均值为标量,方差为张量,生成正态分布 : ", t_b_z)
# mean:标量 std: 标量
t_b_b = torch.normal(mean_b, std_b, (3, 3))
print("均值为标量,方差为标量,生成正态分布 : ", t_b_b)
# 标准正态分布
t = torch.randn(2)
print("生成标准正态分布 : ", t)