pytorch作业(第1周第1节)
1. 张量与矩阵、向量、标量的关系是怎么样的?
答:
tensor是pytorch最基本的操作对象,表示的是一个多维的矩阵。
tensor与numpy相对应,可与numpy的ndarray相互转换。但pytorch可以再GPU上运行,ndarray只能在CPU上运行。
张量(tensor)是就是神经网络里的数组,张量与“列表”和“数组”之间的区别就是在于:
tensor可以轻易地进行卷积,激活,上下采样,微分求导等操作,而numpy数组就不行,普通的数组要先转化为tensor格式才行,列表也是这个道理。所以为了其实功能的简单实现,得先将数组或列表转化为tensor格式。
另外:
相同:
tensor内部的数据类型为ndarray类型。
区别:
tensor可以有加速器内存(如GPU)支持,既可以在CPU上运行也可以在GPU上运行。ndarray只能在CPU上运行。
ndarray在CPU上运行,因此可以改变其数值。tensor的值可以驻留在GPU上加速,GPU不具有改变元素值的能力,因此tensor的值不可以改变。
补充:
张量(tensor):可以表示0阶到n阶的数组:
• 0阶张量(标量):单独的一个数
• 1阶张量(向量):一维数组
• 2阶张量(矩阵):二维数组
• n阶张量(张量):n维数组
•标量是0阶张量,向量是一阶张量。举例:
•标量就是知道棍子的长度,但是你不会知道棍子指向哪儿。
•向量就是不但知道棍子的长度,还知道棍子指向前面还是后面。
•张量就是不但知道棍子的长度,也知道棍子指向前面还是后面,还能知道这棍子又向上/下和左/右偏转了多少。
参考网址:
2. Variable“赋予”张量什么功能?
答:
0.4.0 版本后Variable已并入Tensor
Variable是torch.autograd中的数据类型,主要用于封装Tensor:
data: 被包装的Tensor
grad: data的梯度
grad_fn: 创建Tensor的Function,是自动求导的关键
requires_grad:指示是否需要梯度
is_leaf:指示是否叶子结点
##3. 采用torch.from.numpy创建张量,并打印查看ndarray和张量数据的地址:
答:
import torch
import numpy as np
arr = np.array(((1,2,3),(4,5,6)))
tensorA = torch.from_numpy(arr)
print("arr的值是:{}\n 数据类型是:{}\n 地址是:{}".format(arr, type(arr), id(arr)))
print("****** 我是分割线 ******")
print("tensorA:{}\n 数据类型是:{}\n 地址是:{}".format(tensorA, type(tensorA),id(tensorA)))
显示结果:
arr的值是:[[1 2 3]
[4 5 6]]
数据类型是:<class 'numpy.ndarray'>
地址是:2423848714128
****** 我是分割线 ******
tensorA:tensor([[1, 2, 3],
[4, 5, 6]], dtype=torch.int32)
数据类型是:<class 'torch.Tensor'>
地址是:2423304497408
实现torch.normal()创建张量的四种模式
torch.normal()
功能:生成正态分布
mean为标量,std为标量
mean为标量,std为张量
mean为张量,std为标量
mean为张量,std为张量
(1) 模式1(mean为标量,std为标量):
flag = True
# flag = False
if flag:
import torch
import numpy as np
mean = 0
std = 1
t_normal = torch.normal(mean, std , size=(3,4))
print("t_normal:{}".format(t_normal))
print("mean的数据类型:{}".format(type(mean)))
print("std的数据类型:{}".format(type(std)))
print("t_normal数据类型:{}".format(type(t_normal)))
结果:
t_normal:tensor([[-0.0052, 2.0067, 0.3480, -0.0119],
[-0.0742, -1.7621, 0.0556, -0.2403],
[ 0.4686, 0.2695, -0.1695, 0.3453]])
mean的数据类型:<class 'int'>
std的数据类型:<class 'int'>
t_normal数据类型:<class 'torch.Tensor'>
(2) 模式2(mean为标量,std为张量):
import torch
import numpy as np
mean = 0
std = np.array(((1.,2.,3.),(4.,5.,6.)))
t_std = torch.from_numpy(std)
t_normal = torch.normal(mean, t_std)
print("t_normal:{}".format(t_normal))
print("mean的数据类型:{}".format(type(mean)))
print("std的数据类型:{}".format(type(std)))
print("t_std的数据类型:{}".format(type(t_std)))
print("t_normal数据类型:{}".format(type(t_normal)))
结果:
t_normal:tensor([[ 0.4008, 3.2744, -0.9333],
[-3.5875, 2.4900, -2.7482]], dtype=torch.float64)
mean的数据类型:<class 'int'>
std的数据类型:<class 'numpy.ndarray'>
t_std的数据类型:<class 'torch.Tensor'>
t_normal数据类型:<class 'torch.Tensor'>
(3) 模式3(mean为张量,std为标量):
import torch
import numpy as np
mean =torch.tensor(((1.,2.,3.),(4.,5.,6.)),
dtype=torch.float)
std = 1
t_normal = torch.normal(mean, std)
print("t_normal:{}".format(t_normal))
print("mean的数据类型:{}".format(type(mean)))
print("std的数据类型:{}".format(type(std)))
print("t_normal数据类型:{}".format(type(t_normal)))
结果:
t_normal:tensor([[0.1174, 1.7154, 2.8272],
[3.0788, 6.0400, 3.7259]])
mean的数据类型:<class 'torch.Tensor'>
std的数据类型:<class 'int'>
t_normal数据类型:<class 'torch.Tensor'>
(4) 模式4(mean为张量,std为张量):
import torch
import numpy as np
mean =torch.tensor(((1.,2.,3.),(4.,5.,6.)),
dtype=torch.float)
std = torch.tensor(((2., 3., 4.), (5., 6., 7.)),
dtype=torch.float)
t_normal = torch.normal(mean, std)
print("t_normal:{}".format(t_normal))
print("mean的数据类型:{}".format(type(mean)))
print("std的数据类型:{}".format(type(std)))
print("t_normal数据类型:{}".format(type(t_normal)))
结果:
t_normal:tensor([[2.8304, 0.9465, 1.8128],
[5.0847, 1.7235, 4.8511]])
mean的数据类型:<class 'torch.Tensor'>
std的数据类型:<class 'torch.Tensor'>
t_normal数据类型:<class 'torch.Tensor'>