三、Dataset数据集的使用
加载数据
如何使用Dataset类
打开pycharm
代码实战
四、Tensorboard和Transform的使用
1.Tensorboard的使用(一)
add_scalar()的使用:
add_scalar()函数的用法:
运行
安装tensorboard,两种方法
点击链接,打开tensorboard
如果标题不变,数值改变,运行出现图像过拟合现象,解决办法:把log里的文件删掉,重新运行。
2.Tensorboard的使用(二)
add_image()的使用(常用来观察训练结果)
from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image
# add_image()方法的用法
writer = SummaryWriter("logs")
image_path = "data/train/ants_image/6240329_72c01e663e.jpg"
img_PIL = Image.open(image_path)
# 把图片从PIL类型转为numpy类型
img_array = np.array(img_PIL)
print(type(img_array))
print(img_array.shape)
# 图片形状默认是HWC(高度 宽度 通道)展示,如果是其他,需要写上dataformat=...
writer.add_image("train",img_array,1,dataformats='HWC')
# add_scalar()方法的用法
# y = x
for i in range(100):
writer.add_scalar("y = 2x",3*i,i)
writer.close()
注:
3.Transform的使用(一)
transform是一个python文件,相当于工具箱。里面有很多类class(工具)
(1)先定义自己的工具
(2)放进输入,得到输出
4.Transform的使用(二)
ToTenSor类:把 ``PIL Image`` 格式类型or ``numpy.ndarray`` 类型to tensor类型.
注:numpy类型的图片怎么获得:用OpenCV
安装OpenCV:
具体代码:
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
#python的用法 -》 tensor数据类型
#通过 transform.ToTensor去看两个问题
#绝对路径 D:\others\code\Deep_learning\data\train\ants_image\0013035.jpg
#相对路径 data/train/ants_image/0013035.jpg
img_path = "data/train/ants_image/0013035.jpg"
img = Image.open(img_path)
# 1、transforms该如何使用(python)
tensor_trans = transforms.ToTensor()#创建totensor对象实例
tensor_img = tensor_trans(img)
print(tensor_img)
# 2、tensor :一个数据类型,张量,也就是矩阵。包装了神经网络所需的参数。
# 3、结合tensorboard的使用
writer = SummaryWriter("logs")
writer.add_image("Tensor_img", tensor_img)
writer.close()
运行结果:
5.常见的Transform(一)
__call__()函数:
class Person:
def __call__(self, name):
print(name)
def hello(self,name):
print(name)
person = Person()
person("zhangsan")
#如果定义了内置call函数,就可以用“对象(参数)”的方式调用call,让对象像函数一样使用
person.hello("lisi")
Normalize类:(归一化)
from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
#ToTensor
img = Image.open("images/pytorch.png")
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer = SummaryWriter("logs")
writer.add_image("ToTensor",img_tensor)
#Normalize
# print(img_tensor[0][0][0])#输出一开始图片第0层第0行第0列的像素值
trans_norm = transforms.Normalize([1,3,5],[0.5,0.5,0.5])#[1,3,5]是对每个信道给的均值
img_norm = trans_norm(img_tensor)
# print(img_norm[0][0][0])
writer.add_image("Normalize",img_norm,1)
writer.close()
输入是tensor类型,归一化:
output[channel] = (input[channel] - mean[channel]) / std[channel]
6.常见的Transform(二)
Resize类:输入是image的PIL类型,输出也是PIL
#Resize
print(img.size)
trans_resize = transforms.Resize((512,512))
img_resize = trans_resize(img)
print(img_resize)#输出的图片还是PIL类型
# 转为totensor类型
trans_totensor = transforms.ToTensor()
img_resize = trans_totensor(img_resize)
# 写入tensorboard
writer = SummaryWriter("logs")
writer.add_image("Resize",img_resize,0)
Compose类:compose()中的参数需要时一个列表,python中,列表的表示形式是[数据1,数据2,数据3...],在compose中,数据需要是transform类型,所以得到compose([transform参数1,transform2,...])
Randomcrop类:输入是image的PIL类型,输出也是PIL。随机裁剪。
# RandomCrop
trans_random = transforms.RandomCrop(300,400)
trans_compose_2 = transforms.Compose([trans_random,trans_totensor])
#输入的类型是trans_random的输入类型,trans_random的输出类型是tran_totensor的输入类型
for i in range(10):
img_crop = trans_compose_2(img)
writer.add_image("RandomCropHW",img_crop,i)
总结:
五、torchvision中的数据集使用
在科研中标准的数据集如何下载、使用:
1、torchvision中dataset的使用
import torchvision
#下载数据集
#root:相对路径下会自动创建dataset文件夹,并把数据保存进去
train_set = torchvision.datasets.CIFAR10(root = "./dataset",train=True,download=True)
test_set = torchvision.datasets.CIFAR10(root = "./dataset",train=False,download=True)
print(test_set[0])#第一个数值是图片,第二个数值是target target就是对应的是哪个class(此处是真实的类)
print(test_set.classes)
img,target = test_set[0]
print(img)
print(target)
print(test_set.classes[target])
img.show()
root参数:是指下载后保存到本地的位置。
train参数:True的话就是创建的数据集是一个训练集,False的话就是一个测试集。
transform参数:想对数据集中的所有数据的变化。
target transform参数:对target的transform。
download参数:True的话就会从网上自动下载数据集,False的话就不会下载。
运行python文件,即可下载数据集,若下载慢的话,可用迅雷下载:
和transform、tensboard连用
import torchvision
dataset_transform = torchvision.transforms.Compose([
torchvision.transforms.ToTensor()
])
#加了transform参数
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)
writer = SummaryWriter("logs")
for i in range(10):
img,target = test_set[i]
writer.add_image("test_set",img,i)
writer.close()
六、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())
test_loader = DataLoader(dataset=test_data,batch_size=64,shuffle=False,num_workers=0,drop_last=True)
#测试数据集中第一张图片及target
img,target = test_data[0]
print(img.shape)
print(target)
writer=SummaryWriter("dataloader")
for epoch in range(2):#验证shuffle
step = 0
for data in test_loader:
imgs,targets = data
# print(imgs.shape)
# print(targets)
writer.add_images("Epoch:{}".format(epoch),imgs,step)
step = step+1
writer.close()