TensorBoard的使用,Transforms的使用,常见的Transforms,torchvision中数据集的使用,DataLoader的使用

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会小一点。

"""
  • 12
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值