目录
预备知识
1. Python学习中的两大法宝函数:

- dir()函数,能让我们知道工具箱以及工具箱中的分隔区有什么东西

- help()函数,能让我们知道每个工具是如何使用的,工具的使用方法

2. Pycharm及Juputer对比:

PyTorch入门
1. 加载数据 Dataset && Dataloader
数据常见的组织方式:
- 组织方式一:二分类问题,把data分成两个文件夹,文件夹名就是它的lable。比如蚂蚁和蜜蜂的分类,下图中ants就是这个文件夹中这些图片的lable。

- 组织方式二:
![]()
train_lable对应形式如下图

- 组织方式三:直接把lable写在图片的名称上
Dataset:提供一种方式去获取数据及其label
- 如何获取每一个数据及其lable
- 告诉我们总共有多少个数据
Dataloader:为后面的网络提供不同的数据形式

自己的练习:
from torch.utils.data import Dataset
from PIL import Image
import os
class MyData(Dataset):
def __init__(self, root_dir, img_dir, label_dir):
self.root_dir = root_dir
self.img_dir = img_dir
self.label_dir = label_dir
self.i_path = os.path.join(self.root_dir, self.img_dir)
self.l_path = os.path.join(self.root_dir, self.label_dir)
self.img_path = os.listdir(self.i_path)
self.label_path = os.listdir(self.l_path)
def __getitem__(self, idx):
img_name = self.img_path[idx]
label_name = self.label_path[idx]
img_item_path = os.path.join(self.root_dir, self.img_dir, img_name)
label_item_path = os.path.join(self.root_dir, self.label_dir, label_name)
img = Image.open(img_item_path)
f = open(label_item_path)
label = f.read()
return img, label
def __len__(self):
return len(self.img_path)
root_dir = "train"
ants_img_dir = "ants_image"
ants_label_dir = "ants_label"
bees_img_dir = "bees_image"
bees_label_dir = "bees_label"
ants_dataset = MyData(root_dir, ants_img_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_img_dir, bees_label_dir)
train_dataset = ants_dataset + bees_dataset
代码放到Python Console上运行,可以看到数据如下图:

把蚂蚁和蜜蜂的dataset合并后, 前0-123组数据是蚂蚁,124及以后组的数据是蜜蜂。分别输出train_dataset[123]和train_dataset[124],结果如下:


2. Tensorboard的使用
- SummaryWriter类的使用——可以用来显示train_loss的一个Function。
The SummaryWriter class provides a high-level API to create an event file
in a given directory and add summaries and events to it. The class updates the file contents asynchronously. This allows a training program to call methods to add data to the file directly from the training loop, without slowing down training.

运行以上代码后,生成log目录下的一个events文件,在Terminal中使用tensorboard --logdir=logs指令打开这个文件,默认端口号为6006(如果显示tensorboard : 无法将“tensorboard”项识别为 cmdlet、函数、脚本文件或可运行程序的名称,需要把环境变量配置好):


点击链接可以查看生成的图像:

- add_image()的使用——Add image data to summary. Note that this requires the pillow package.


3. torchvision中Transforms的使用
Transform主要是对图片进行一些变换。
-
Transform该如何使用:

from PIL import Image from torchvision import transforms from torch.utils.tensorboard import SummaryWriter img_path = "data/train/ants_image/0013035.jpg" img = Image.open(img_path) # 1.transform该如何使用 tensor_trans = transforms.ToTensor() tensor_img = tensor_trans(img)
-
为什么我们需要Tensor数据类型
运行上面代码得到的tensor数据tensor_img的内容如下,Tensor数据类型可以理解为一个包装了神经网络的一些理论基础所需要的一些参数的数据类型。

-
常见的Transforms
使用Transforms,就是使用Transforms这个python文件当中各种各样的类,不同的类有不同的作用。在使用Transforms时,我们要关注输入、输出、作用这三个点。图片会有不同的格式,所以输入和输出是比较容易错的点。图片不同格式对应的打开方式如下:

Compose() —— Composes several transforms together. This transform does not support torchscript.
Compose()中的参数需要是一个列表。Python中,列表的表示形式为[数据1,数据2,...]。在Compose中,数据需要是 transforms类型,所以得到,Compose([transforms参数1, transforms参数2,...])。

ToTensor() —— Convert a "PIL Image" or "numpy.ndarray" to tensor. This transform does not support torchscript.
from torchvision import transforms
from PIL import Image
img = Image.open("data/train/ants_image/0013035.jpg")
print(img)
# ToTensor实例
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
print(img_tensor)

Normalize() —— Normalize a tensor image with mean and standard deviation.
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]"
from torch.utils.tensorboard import SummaryWriter
from torchvision import transforms
from PIL import Image
writer = SummaryWriter("logs")
img = Image.open("data/train/ants_image/0013035.jpg")
# ToTensor实例
trans_totensor = transforms.ToTensor()
img_tensor = trans_totensor(img)
writer.add_image("Totensor", img_tensor)
# Normalize实例
print(img_tensor[0][0][0])
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)
writer.close()
分别对Normalize前的img_tensor[0][0][0]和Normalize后的img_norm[0][0][0]输出,得到以下不同的数值
![]()
在TensorBoard中输出Normalize前的图片和Normalize后的图片,对比如下:


Resize() —— Resize the input image to the given size.
# Resize实例
trans_resize = transforms.Resize((512, 512))
# img是PIL类型的数据
img_resize = trans_resize(img)
# 把img从PIL类型变成tensor类型的数据
img_resize = trans_totensor(img_resize)
用compose()可以把resize和图片类型变换(PIL→tensor)这两个操作一步做到位,如下图:

RandomCorp() —— Crop the given image at a random location.
512

被折叠的 条评论
为什么被折叠?



