transform
本质上作用是将图片通过transform这个这个工具箱获取想要的结果
tensor就是一个包含神经网络需要的一些理论基础的参数
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
#tensor数据类型
#通过transform.TeTensor去解决两个问题
#1.transform如何使用
#2.为什么需要tensor类型
img_path=r'D:\python practice demo\pythonProject4\hymenoptera_data\train\ants\0013035.jpg'
img=Image.open(img_path)
tesortrans=transforms.ToTensor()
tensorImg=tesortrans(img)#转为tensor
writer=SummaryWriter('logs')
writer.add_image('tensorimg',tensorImg)
writer.close()
tensor 类有许多内部属性和钩子,这些属性和钩子主要用于管理张量的内部状态、梯度计算和其他高级特性。
也就是在控制台可以看到的这些参数
_backward_hooks:
作用: 这个属性是一个钩子列表,用于在执行反向传播时调用。这些钩子可以在张量的梯度计算之前或之后执行自定义的操作。
用途: 常用于调试、修改梯度或者在特定操作发生时记录信息。
_base:
作用: 当一个张量是从另一个张量派生出来的(例如通过切片操作),_base 属性指向源张量。
用途: 帮助跟踪张量之间的依赖关系,特别是在内存管理和梯度计算时。
_cdata:
作用: 这是一个内部的 C 语言指针,指向张量在底层库(通常是 C++ 实现的 PyTorch 核心)中的具体数据结构。
用途: 主要用于高效访问和操作张量数据,在高级别 Python 代码中一般不直接使用。
_grad:
作用: 这个属性保存了张量的梯度。如果一个张量需要计算梯度,_grad 将包含其对应的梯度张量。
用途: 用于反向传播算法中的梯度存储和更新。
_grad_fn:
作用: 这个属性指向创建当前张量的函数。如果张量是通过某些操作生成的,这个属性记录了生成它的操作。
用途: 在反向传播中用于构建计算图,以便正确地计算梯度。
_has_symbolic_sizes_strides:
作用: 这个布尔值属性表示张量是否具有符号化的尺寸和步长。
用途: 通常在动态形状推理或符号计算中使用,以便处理不确定尺寸的张量。
_python_dispatch:
作用: 这个属性用于控制张量操作的 Python 层调度。通过这个属性,可以自定义或重载张量操作。
用途: 在开发自定义张量类型或扩展 PyTorch 功能时很有用。
_version:
作用: 这是一个内部计数器,用于跟踪张量的修改次数。每次张量的内容发生变化时,这个计数器都会递增。
用途: 帮助实现版本控制和缓存机制,以确保在优化过程中能够正确地使用和更新张量数据。
在 PyTorch 中,钩子(hook)是一种非常灵活的机制,允许用户在某些事件发生时插入自定义的操作。钩子主要有以下几种用途:
自定义梯度计算:
可以在张量的梯度计算过程中插入钩子,以便在计算梯度之前或之后执行特定操作。这对于修改梯度、调试或记录中间梯度信息非常有用。
例如,通过 register_hook 方法,可以在张量上注册一个钩子函数,当这个张量的梯度被计算时,钩子函数会被调用:
tensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.register_hook(lambda grad: print(grad))
模块级钩子:
PyTorch 允许在神经网络模块(如 nn.Module)的前向传播和反向传播过程中插入钩子。这对于调试网络、记录中间结果或修改数据流非常有用。
前向钩子(forward hook)在模块的前向传播开始时触发,前向后钩子(forward pre-hook)在前向传播之前触发,反向钩子(backward hook)在反向传播过程中触发。
model = MyModel()
def forward_hook(module, input, output):
print(f"Forward hook: {module}")
handle = model.layer.register_forward_hook(forward_hook)
调试和监控:
通过钩子,可以在模型训练或推理时监控中间层的输出、梯度等。这有助于理解模型的内部工作机制,排查问题或优化性能。
例如,记录每层的输出:
activations = []
def forward_hook(module, input, output):
activations.append(output)
handle = model.layer.register_forward_hook(forward_hook)
实现自定义操作:
使用钩子可以在标准的前向和反向传播之外实现自定义的操作。这对于需要特定功能或操作的研究和开发非常有帮助。
例如,可以在反向传播过程中对梯度进行剪裁或归一化:
def clip_gradient(grad):
return grad.clamp(-1, 1)
tensor = torch.tensor([1.0, 2.0, 3.0], requires_grad=True)
tensor.register_hook(clip_gradient)
总结来说,钩子提供了一种在 PyTorch 模型的执行过程中插入自定义代码的方法,使得用户可以灵活地调试、监控和扩展模型的功能。这对于开发复杂的深度学习模型和实验新的算法非常有帮助。