图像去雾毕业论文准备14-深度学习框架(pytorch)——超级详细(基础知识)
torch常见的数据类型
#!/usr/bin/python3.6
# -*- coding: utf-8 -*-
# @Time : 2021/1/5 21:41
# @Author : ptg
# @Email : zhxwhchina@163.com
# @File : pytorch基础知识.py
# @Software: PyCharm
import torch
# 0-1之间的均匀分布
x = torch.rand(2,3)
print(x)
# 正常随机数
x =torch.randn(3,4)
print(x)
# zeros
x = torch.zeros(2,3)
print(x)
x = torch.ones(2,3,4)
print(x)
print(x.size(0))
print(x.size(1))
# tensor类型,加上float32数据类型
x = torch.tensor([6,2],dtype=torch.float32)
print(x)
# 数据类型的转换
print(x.type())
# 数据类型的转换
a = x.type(torch.int64)
print(a)
print(a.type())
"""
tensor与ndarray数据类型的转换
"""
import numpy as np
a = np.random.randn(2,3)
print(a)
# 可以从numpy数组中创建(从numpy转到tensor中)
x1 = torch.from_numpy(a)
print(x1)
# 从tensor转到numpy
print(x1.numpy())
# 广播相加
x4 = x3 + 2
print(x4)
x5 = x4.add(x1)
print(x5)
print("x4",x4)
# 当一个运算符后面加上一个下划线的时候,就地改变这个数
x4 = x4.add_(x1)
print("x41",x4)
print(x4.shape)
# view可以改变数据的输出形式
x4 = x4.view(3,2)
print(x4)
x4.view(2,3)
print(x4)
# 自动计算(第二个维度为1)
x5 = x4.view(-1,1)
print(x5)
# item返回一个标量值,通过item以后返回的就是一个标量而不是一个tensor值
x5 = torch.rand(1)
x6 = x5.item()
print(x6)
具体的就不讲了,看简单的注释吧,继续往后推进!
好啦,下面着重介绍一下
张量的自动微分
tensor里面有数据,grad(计算的梯度),grad_fn(用什么方法计算得到的)
"""
张量的自动微分
将torch.tensor属性.requires_grad设置成True
pytor将开始跟踪对此张量的所有操作
完成计算后,可以调用.backward()并自动计算苏欧欧梯度
该张量的梯度将累加到.grad属性中
"""
# requires_grad=True跟踪所有的运算
x = torch.ones(2,2,requires_grad=True)
print(x)
下面是用过back.ward进行跟踪对象
"""
因为不是通过某种计算得到的,所以梯度和计算方法返回值都是空值
下面使用一个简单的计算进行查看,看看到底有什么变化
"""
# 广播相加(y是通过相加得到的)
y = x + 2
print(y)
print(y.data)
# 可以看到梯度还是没有
print(y.grad)
# 但是计算方法输出了数值,一个内存占用单元》<AddBackward0 object at 0x000002546F3CFDC8>
print(y.grad_fn)
print("-."*20)
# z = y*y + 3
z = y*y + 3
out = z.mean()
print(out)
print(out.backward())
# 以上计算的所梯度都记录在x中
print(x.grad)
"""
结果如下:
tensor([[1.5000, 1.5000],
[1.5000, 1.5000]])
"""
# x的值仍然是1,没有进行改变
print(x.data)
当然,这里需要提到的是requires_grad=True必须是true才可以进行跟踪
如果有的地方不用进行跟踪,那么可以使用包装的形式
with torch.no_grad():
print((x**2).requires_grad)
print((x**2).requires_grad)
# 如果不用计算梯度,可以使用x.detach()进行 等价于with torch.no_grad
y = x.detach()
print(y)
print("--."*20)
# 假如有一个使用的不计算梯度的false
a = y.requires_grad
print(a)
f = torch.tensor([2,3],dtype=torch.float32)
print("f",f)
# 可以看到是false
print(f.requires_grad)
# 可以就地改变tensor的grad属性
c = f.requires_grad_(True)
# 可以看到就地改变后输出的是True
"""
False
f tensor([2., 3.])
False
True
"""
print(c.requires_grad)
好啦,基础的介绍和学习就到这里!
(完!)