深度学习笔记(b站小土堆)

Pytorch学习笔记

  • 一、必备的数据集操作技巧
    • 1.数据集操作
    • 2.利用txt文件保存label
  • 二、Pytorch中tensorboard的使用
    • 1.add_scalar函数的用法
    • 2.add_image函数的用法
  • 三、transform的用法
    • 1.基础知识
    • 2.常见的transforms

一、必备的数据集操作技巧

1.数据集操作

下列代码对原始数据集进行了处理,方便了对数据集的访问

import torch
from torch.utils.data import Dataset
from PIL import Image
import os


class MyData(Dataset):

    def __init__(self, root_dir, label_dir):  # self 的作用是指定一个类里的全局变量
        self.root_dir = root_dir
        self.label_dir = label_dir
        self.path = os.path.join(self.root_dir, self.label_dir)  # join函数,连接路径
        self.img_path = os.listdir(self.path)

    def __getitem__(self, idex):
        img_name = self.img_path[idex]
        img_item_path = os.path.join(self.root_dir, self.label_dir, img_name)
        img = Image.open(img_item_path)
        label = self.label_dir
        return img, label

    def __len__(self):
        return len(self.img_path)  # 返回列表的长度

root_dir = "dataset/train"
positive_label_dir = "positive"
negative_label_dir = "negative"
positive_dataset = MyData(root_dir, positive_label_dir)
negative_dataset = MyData(root_dir, negative_label_dir)
train_dataset = positive_dataset + negative_dataset  ##数据集的拼接操作

2.利用txt文件保存label

上述情况,label是体现在文件夹的名称内,而使用最多的情况通常是这样的
深度学习笔记(b站小土堆)_第1张图片
positive_label文件夹内包含了与图片同名的txt文件,打开txt文件就是该图片的label,实现给图片创建对应txt的代码如下:

import os

root_dir = "dataset/train"
target_dir = "positive"
img_path = os.listdir(os.path.join(root_dir,target_dir))
label = target_dir
out_dir = "positive_label"
for i in img_path:
    file_name = i.split(".png")[0]
    with open(os.path.join(root_dir,out_dir,"{}.txt".format(file_name)),"w") as f:
        f.write(label)

二、Pytorch中tensorboard的使用

tensorboard我理解为一个看板,对结果进行可视化展示

1.add_scalar函数的用法

from torch.utils.tensorboard import SummaryWriter

writer = SummaryWriter("logs") #创建类的一个实例 将事件文件(图像等)存到logs文件夹下
# writer.add_image()
for i in range(100):
    writer.add_scalar("y=0.5x",i,2*i) #第一个i是y轴,第二个i是x轴,改变第一个参数可以避免几个图杂揉在一起的情况



writer.close()

#打开事件文件
#在Terminal窗口,输入命令:tensorboard --logdir=logs
#修改主机接口:tensorboard --logdir=logs --port=6007

2.add_image函数的用法

from torch.utils.tensorboard import SummaryWriter
import numpy as np
from PIL import Image

writer = SummaryWriter("logs") #创建类的一个实例 将事件文件(图像等)存到logs文件夹下
image_path = "dataset/train/positive/1 (6).png"
img_PIL = Image.open(image_path)
img_array = np.array(img_PIL) #将PIL的文件格式转换为array格式,这样才能被add_image读取
#print(img_array.shape)  array转化的图像通常是(H,W,C)格式的,因此要在add_image函数中说明
writer.add_image("test", img_array, 2, dataformats='HWC') #1是指global_step,这里是指第一步
#step可以展现出每一步的变化,非常炫酷

#for i in range(100):
    #writer.add_scalar("y=0.5x",i,2*i) #第一个i是y轴,第二个i是x轴,改变第一个参数可以避免几个图杂揉在一起的情况

writer.close()

#打开事件文件
#在Terminal窗口,输入命令:tensorboard --logdir=logs
#修改主机接口:tensorboard --logdir=logs --port=6007

三、transform的用法

transform可以理解为一个工具箱,里面有很多工具(class类)

1.基础知识

from PIL import Image
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
import cv2
#transforms相当于一个工具箱,里面有很多工具
#pycharm的左侧有个”structure“,可以方便的看到源代码的结构,相当于工具箱的说明书,前面几个类是最常用的

####python中的用法
###通过transform.ToTensor 去解决两个问题
###1.transform如何使用
###2.tensor的数据类型相较于其他数据类型有啥区别

img_path = "dataset/train/positive/1 (1).png"
img = Image.open(img_path) #这是PIL格式转化为tensor格式的方法
# print(img) 
tensor_trans = transforms.ToTensor() #创建实例:tensor_trans
tensor_img = tensor_trans(img) #将PIL格式的图片转化为tensor数据类型的图片
###2.tensor数据类型内多了很多卷积神经网络需要的参数,这是其他数据类型不具备的特点

cv_img = cv2.imread(img_path)  #数据类型是numpy array

writer = SummaryWriter("logs")

writer.add_image("Tensor_img", tensor_img, 1)

writer.close()

下面介绍python中类的概念,关于__call__函数的用法

class Person:
    def __call__(self, name):
        print("__call__"+"hello"+" "+name)
    def hello(self, name):
        print("hello"+" "+name)

person = Person()
person("zyj")  #这种调用方法是直接传入一个参数,默认就会传递给__call__函数
person.hello("zy")  #这种调用方法需要用点后接需指定的函数

2.常见的transforms

下面介绍了transforms中常见的类的用法

from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
writer = SummaryWriter("logs")
img = Image.open("dataset/train/positive/1 (14).jpg")

#ToTensor的使用
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("To_Tensor", img_tensor)


#Normalize的使用(归一化)
trans_norm = transforms.Normalize([6,5,0.5],[5,0.5,5]) ###第一个列表表示平均值
#,第二个列表表示标准差
##归一化的过程:
#计算公式:input(channel) = (input[channel] - mean[channel])/std[channel]
#其中,mean和std是transforms.Normalize中需要传入的参数(用户自定义)
#此处img_tensor的范围在[0,1],经过上述归一化后,范围变为了[-1,1]
img_norm = trans_norm(img_tensor)
writer.add_image("Normalize", img_norm, 1)



##Resize的使用 给定图片的尺寸。如果给两个数字,就会用长宽去匹配
#但是如果只给一个数字,就会用图片最小的边去匹配这个数字
print(img.size)
trans_resize = transforms.Resize((512, 512))
img_resize = trans_resize(img_tensor)
#print(img_resize)
writer.add_image("Resize", img_resize)

##Randomcrop的用法 随机裁剪
trans_random = transforms.RandomCrop(512)
trans_compose2 = transforms.Compose([trans_random, trans_totensor])
for i in range(10):
    img_crop = trans_compose2(img)
    writer.add_image("Randcrop", img_crop, i)


writer.close()

深度学习笔记(b站小土堆)_第2张图片

未完待续…

你可能感兴趣的:(深度学习,pytorch,python)