PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】_哔哩哔哩_bilibili
\
PyTorch 和 TensorFlow 是两个深度学习框架,TensorBoard 是 TensorFlow 提供的可视化工具,Transforms是 PyTorch 中用于数据预处理的工具,而神经网络则是深度学习模型的基础。在深度学习项目中,通常会同时使用这些工具和概念,以构建、训练和评估神经网络模型。
一、TensorBoard 的使用
Add_image()的使用(常用来观察训练结果)
tag (str): Data identifier: 这个参数是一个字符串类型,用于标识数据的身份或者标签。
img_tensor (torch.Tensor, numpy.ndarray, or string/blobname): 这个参数可以接受多种类型的输入,包括 torch.Tensor、numpy.ndarray、字符串或者 blob 名称。通常用于传入图像数据。
global_step (int): Global step value to record: 这个参数是一个整数类型,用于记录全局步骤值,可以用来跟踪训练的进度或者迭代次数。
1.
Image 也未定义。这表明你可能没有正确导入包含 Image 类的模块。通常情况下,Image 类是从 Python 的 PIL 库(Pillow 库的一部分)中导入的。
2.利用Opencv读取图片,获得numpy型图片
import numpy as np 是 Python 中用于导入 numpy 模块并给模块起一个别名的语句。
具体来说,import numpy 表示导入 numpy 模块,numpy 是一个用于科学计算的常用库,提供了许多用于数组操作和数学运算的功能。
而 as np 则是为导入的 numpy 模块指定了一个别名 np,可以使用 np 来代替 numpy 来访问 numpy 模块中的函数和类。
3.
PIL 是一个库,它是 Python Imaging Library 的缩写,用于处理图像数据。在这里我们使用 from PIL import Image 导入了 PIL 库中的 Image 类。
- tag:用于标识图像的标签或名称。
- img_tensor:包含图像数据的张量。通常是一个四维张量,形状为
[batch_size, channels, height, width]
,其中batch_size
表示批量大小,channels
表示通道数,height
表示图像高度,width
表示图像宽度。 - global_step(可选):用于指定图像的全局步数或时间戳,以便与其他数据对齐。例如,在训练神经网络时,可以将当前的训练步数作为
global_step
。 - walltime(可选):用于指定图像的时间戳,通常用于在 TensorBoard 中按时间查看数据。如果未提供,则会使用当前时间。
- dataformats(可选):指定图像数据的格式。常见的格式包括 "CHW"(通道-高度-宽度)和 "HWC"(高度-宽度-通道),默认为 "CHW"。
from PIL import Image
import numpy as np
from Transforms_ import writer
img_PIL = Image.open("val/ants/183260961_64ab754c97.jpg")
img_array = np.array(img_PIL)
writer.add_image("test" , img_array , 1,dataformats='HWC')
writer.close()
第二张图片:
想让第二张图片单独输出,:
-
删除日志中的第一张图片相关信息: 在写入第二张图片之前,关闭写入器(writer),然后重新创建一个新的写入器,并且不要添加第一张图片的信息。这样第二张图片就会成为新日志中的唯一图片。
from PIL import Image import numpy as np from Transforms_ import writer # 写入第一张图片的代码 img_PIL = Image.open("val/ants/183260961_64ab754c97.jpg") img_array = np.array(img_PIL) writer.add_image("test" , img_array , 1,dataformats='HWC') # 关闭写入器 writer.close() # 创建新的写入器,并写入第二张图片的代码 writer = SummaryWriter() # 这里根据你的实际情况创建 SummaryWriter img_PIL = Image.open("val/bees/59798110_2b6a3c8031.jpg") img_array = np.array(img_PIL) writer.add_image("test" , img_array , 2,dataformats='HWC') # 关闭写入器 writer.close()
2.另一种方法是给第一张图片的标签(tag)添加一个唯一的标识,例如,在第一张图片的标签中加上后缀 "_1",而第二张图片的标签中加上后缀 "_2"。这样就可以保留两张图片的信息,但它们会有不同的标签,从而单独输出
from PIL import Image import numpy as np from Transforms_ import writer # 写入第一张图片的代码 img_PIL = Image.open("val/ants/183260961_64ab754c97.jpg") img_array = np.array(img_PIL) writer.add_image("test_1" , img_array , 1,dataformats='HWC') # 写入第二张图片的代码 img_PIL = Image.open("val/bees/59798110_2b6a3c8031.jpg") img_array = np.array(img_PIL) writer.add_image("test_2" , img_array , 2,dataformats='HWC') # 关闭写入器 writer.close()
二、Transforms的使用
使用方法:
1.多查看官网文档
2.关注输入输出参数
3.返回值未知时:
4.打断点,调试
1.ToTensor
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
img_path = "val/ants/8124241_36b290d372.jpg"
#ToTensor
img = Image.open(img_path)
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)
print(tensor_img)
writer = SummaryWriter("logs")
writer.add_image("tensor_img",tensor_img)
writer.close()
2.Normalize
、
#Normalize
#print(tensor_img[0][0][0])
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm(tensor_img)
#print(img_norm[0][0][0])
writer.add_image("Normalize",img_norm)
3.Resize
接受一个参数 size
,它可以是一个序列(sequence)或者一个整数(int)。参数 size
表示期望的输出尺寸。如果 size
是一个类似于 (h, w) 的序列,那么输出的尺寸将会被调整成与这个序列相匹配的大小。如果 size
是一个整数,那么图像的较小边将会被调整到这个数字所代表的大小。举个例子,如果图像的高度大于宽度,那么图像将会被调整成 (size * height / width, size) 的大小。
想要在Transform进行显示,需要修改为to_tensor 类型
#Resize
trans_resize = transforms.Resize((512, 512))
#img PIL ->resize ->img_resize PIL
img_resize = trans_resize(img)
#img_resize PIL -> totensor ->img_resize tensor
img_resize = tensor_trans(img_resize)
print(img_resize)
writer.add_image("Resize",img_resize)
writer.close()
4.Compose
5.RandomCrop
#RandomCrop 随机裁剪
#要注意裁剪尺寸不要超过实际尺寸
trans_random=transforms.RandomCrop((500,300))
trans_compose_2=transforms.Compose([trans_random,tensor_trans])
for i in range(10):
img_crop=trans_compose_2(img)
writer.add_image("RandomCropHW",img_crop,i)
writer.close()
三、使用 torchivision 的标准数据集
torchvision — Torchvision 0.17 documentation (pytorch.org)
、
from torch.utils.tensorboard import SummaryWriter
from PIL import Image
#导入torchvision模块
import torchvision
#导入torchvision中的transforms子模块
from torchvision import transforms
#定义转换器
transform_ = transforms.Compose([
transforms.ToTensor(),
])
train_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset", train=True, download=True)
# print(test_set[0])
# print(test_set.classes)
# 第一个样本的图像和标签
img, target = test_set[0]
print(img)
print(target)
print(test_set.classes[target])
img.show()
注意img.show需要的参数类型为PIL
和transforms一起使用,注意参数的修改,并将PIL类型改成Tensor类型
训练数据集,train
参数设置为True
,加载测试数据集,就将其设置为False
。
from torch.utils.tensorboard import SummaryWriter
#导入torchvision模块
import torchvision
#导入torchvision中的transforms子模块
from torchvision import transforms
#定义转换器
transform_ = transforms.Compose([
transforms.ToTensor(),
])
train_set = torchvision.datasets.CIFAR10(root="./dataset", transform=transform_, train=True, download=True)
test_set = torchvision.datasets.CIFAR10(root="./dataset", transform=transform_, train=False, download=True)
# print(test_set[0])
# print(test_set.classes)
#
# img, target = test_set[0]
# print(img)
# print(target)
# print(test_set.classes[target])
# img.show()
# print(test_set[0])
writer = SummaryWriter("P14")
for i in range(10):
img, target = test_set[i]
writer.add_image("test_set" , img , i)
writer.close()
四、Dataloader的使用
取出数据集dataset的数据
官网查看相关信息:torch.utils.data — PyTorch 1.8.1 documentation
随即抓取:
import torchvision
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
# 准备的测试数据集
test_data=torchvision.datasets.CIFAR10("./dataset", train=False, transform=torchvision.transforms.ToTensor())
test_loader=DataLoader(dataset=test_data, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
# 测试数据集中的第一张图片及target
writer = SummaryWriter("dataloader")
# 初始化步数
step = 0
# 遍历测试数据集
for data in test_loader:
imgs, targets = data
# 将图像添加到TensorBoard
writer.add_images("test_data", imgs, step)
step += 1
# 关闭TensorBoard写入器
writer.close()
最后一张👇
shuffle修改为True时 👉