1:TensorBoard的使用
简单的二维函数:
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
writer = SummaryWriter("logs")
for i in range(100):
writer.add_scalar("y=2x",i,i)
writer.close()
# tensorboard --logdir=logs --port=6006
在Pycharm中调用这段代码,然后再pytorch命令窗口中调用:
tensorboard --logdir=logs --port=6006
用TensorBoard读取数据集中的图片
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
writer = SummaryWriter("logs")
image_path = "dataset/train/ants_image/6743948_2b8c096dda.jpg"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)
#writer.add_image("test",img_array,3,dataformats="HWC")
writer.add_image("蚂蚁",img_array,1,dataformats="HWC")
for i in range(100):
writer.add_scalar("y=2x",i,i)
writer.close()
2:Transfroms的使用
主要就是把数据类型转换成:Tensor
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
img_path = "dataset/train/ants_image/5650366_e22b7e1065.jpg"
img = Image.open(img_path)
#print(img)
writer = SummaryWriter("logs")#存放的文件夹名称
tensor_trans = transforms.ToTensor()
tensor_img = tensor_trans(img)#ctrl + P 显示需要的数据类型
#print(tensor_img)
writer .add_image("Tensor_img",tensor_img)
writer.close()
# opencv-python
图片来自:【PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】】https://www.bilibili.com/video/BV1hE411t7RN?p=10&vd_source=92951cb9fd91df41cdbe0f6b20b500bf
3:内置CALL函数的实例和tensor的认识
内置CALL函数
"""
每个类都有一个内置call函数 , 可直接传参,不用写函数名字
"""
class Person:
def __call__(self, name): #内置call函数 , 可直接传参,不用写函数名字
print("__call__"+"HELLO"+name)
def hello(self , name):
print("HELLO"+name)
person = Person()
person("hyq")
person.hello("s1mple")
tensor的认识
import torchvision
from torch.utils.tensorboard import SummaryWriter
dataset_transform = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()
])
train_set = torchvision.datasets.CIFAR10(root = "./dataset",train = True ,transform= dataset_transform,download = True)
test_set = torchvision.datasets.CIFAR10(root = "./dataset",train = False ,transform= dataset_transform,download = True)
print(test_set[0])
img ,target = test_set[0]
print(img)
print(target)
print(test_set.classes[target])
img.show();
print(test_set[0])
writer = SummaryWriter("p10")#日志存放的地方
for i in range(10):
img, target = test_set[i]
writer.add_image("test_set",img , i)#tag 是在网页中的小标题
writer.close()
4:常见的Transform
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
writer = SummaryWriter("logs")#存放的文件夹名称
img = Image.open("dataset/val/ants/8398478_50ef10c47a.jpg")
print(img)
#ToTensor()
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("ToTensor",img_tensor)
# tensorboard --logdir=logs --port=6006
#Normalize()该函数归一化输入数组使它的范数或者数值范围在一定的范围内。
"""
输入(channel,height,width)形式的tensor,并输入每个channel对应的均值和标准差作为参数
函数会利用这两个参数分别将每层标准化(使数据均值为0,方差为1)后输出。即:
Normalize a tensor image with mean and standard deviation.
This transform does not support PIL Image.
Given mean: ``(mean[1],...,mean[n])`` and std: ``(std[1],..,std[n])`` for ``n``
channels, this transform will normalize each channel of the input
``torch.*Tensor`` i.e.,
``output[channel] = (input[channel] - mean[channel]) / std[channel]``
trans_norm = transforms.Normalize()
"""
trans_norm = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
img_norm = trans_norm (img_tensor)
print(img_norm[0][0][0])
writer.add_image("Normalize",img_norm)
#Resize(torch.nn.Module):
print(img.size)
trans_resize = transforms.Resize((512,512))
# 类型转换 img PIL -> resize ->img_resize PIL
img.resize= trans_resize(img)
print(type(img.resize))
"""
<class 'PIL.Image.Image'>
<class 'torch.Tensor'>
"""
# 类型转换 img_resize PIL -> totensor ->img_resize tensor
img.resize = trans_totensor(img.resize)
print(type(img.resize))
writer.add_image("Resize",img.resize,0)
print(img.resize)
"""
<PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=500x333 at 0x13D84D2DE48>
tensor(0.9843)
(500, 333)
<PIL.Image.Image image mode=RGB size=512x512 at 0x13DFC7E1CF8>
"""
# Compose_resize_2
trans_resize_2 = transforms.Resize([512])
#PIL -> PIL -> tensor
trans_compose = transforms.Compose([trans_totensor,trans_resize_2])
# trans_compose = transforms.Compose([trans_totensor,trans_resize_2])
#和教学视频的不一样,变量的类型先后顺序改变了
img_resize_2 = trans_compose(img)
writer.add_image("Resize",img_resize_2,1)
#RandomCrop
#trans_random = transforms.RandomCrop(250) trans_random = transforms.RandomCrop((250,100))
trans_random = transforms.RandomCrop((250,100))#固定宽为 250 长度为 100
trans_compose_2 = transforms.Compose([trans_random,trans_totensor])
#trans_compose_2 = transforms.Compose([trans_totensor,trans_random])
for i in range(10):
img_crop=trans_compose_2(img)
writer.add_image("RandomCropHW",img_crop,i)
writer.close()
5:Dataloader的使用:
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())
# train = False 是否为训练集 ,训练集数据更大
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=True,num_workers=0,drop_last=True)
#因为CIFAR10数据集有一个返回img和target的 def __getitem__函数
img ,target = test_data[0]
print(img.shape)
print(target)
step = 0
writer = SummaryWriter("dataloader")#日志存放的地方
for data in test_loader:
imgs,targets = data
# print(imgs.shape)
# print(targets)
writer.add_images("test_data",imgs,step )
step = step + 1
# tensorboard --logdir="dataloader"
"""
def __getitem__(self, index: int) -> Tuple[Any, Any]:
Args:
index (int): Index
Returns:
tuple: (image, target) where target is index of the target class.
img, target = self.data[index], self.targets[index]
# doing this so that it is consistent with all other datasets
# to return a PIL Image
img = Image.fromarray(img)
if self.transform is not None:
img = self.transform(img)
if self.target_transform is not None:
target = self.target_transform(target)
return img, target
"""
"""
batch_size(int, optional):
每个batch有多少个样本
shuffle(bool, optional):
在每个epoch开始的时候,对数据进行重新打乱
sampler(Sampler, optional):
自定义从数据集中取样本的策略,如果指定这个参数,那么shuffle必须为False
batch_sampler(Sampler, optional):
与sampler类似,但是一次只返回一个batch的indices(索引),需要注意的是,一旦指定了这个参数,那么batch_size,shuffle,sampler,drop_last就不能再制定了(互斥——Mutually exclusive)
num_workers (int, optional):
这个参数决定了有几个进程来处理data loading。0意味着所有的数据都会被load进主进程。(默认为0)
collate_fn (callable, optional):
将一个list的sample组成一个mini-batch的函数
pin_memory (bool, optional):
如果设置为True,那么data loader将会在返回它们之前,将tensors拷贝到CUDA中的固定内存(CUDA pinned memory)中.
drop_last (bool, optional):
如果设置为True:这个是对最后的未完成的batch来说的,比如你的batch_size设置为64,而一个epoch只有100个样本,那么训练的时候后面的36个就被扔掉了…
如果为False(默认),那么会继续正常执行,只是最后的batch_size会小一点。
"""