环境配置
作为学习,还是用anaconda新建一个虚拟环境比较好.在terminal中conda create -n pytorch python=3.8 -y
新建一个环境,使用python3.8版本。然后切换到pytorch环境,pip list
看一下有什么包,发现没有pytorch,于是需要自己安装一下。来到pyorch官网 ,根据自己电脑型号选择对应版本,他会自动生成一条安装命令,在当前虚拟环境运行即可。
安装好了以后,再配置一下pycharm和Jupyter,以后两个应该都会用。
pycharm中新建一个项目,File->New Project->Pure Python->Python Interpreter->Previously Configured Interpreter->Add Interpreter->Add Local Interpreter->Conda Environment->Use existing environment
选择自己刚刚创建的虚拟环境。这里我的pycharm是2022的,不同版本可能略有差异。
然后配置Jupyter,新建的虚拟环境也是没有Jupyter的,需要安装相关依赖。在相应的虚拟环境中运行conda install nb_conda
安装nb_conda,这是一个用于在Jupyter Notebook中管理Conda环境的扩展,运行以后就可以在Jupyter中使用创建的环境。安装好以后在环境中运行Jupyter notebook
就可以启动了,启动后notebook页面的new下面会出现自己创建的环境。
至此,相关环境就已经配置好了。
python几个帮助调试的函数
dir()
help()
print(type())//打印返回值类型
dir()函数可以查看目标中包含什么模块。
如
当展示的信息是__xx__的形式,表明这个模块已经是一个可以使用的函数了,里面没有其他东西。像下面这样:
然后就可以用help()来看它的使用方法:
Dataset
加载数据主要用到两个类:Dataset和Dataloader.
Dataset会提供一种方式来获取目标数据机器label,并且说明总共有多少个数据;Dataloader会将获取到的数据组合为不同的形式以供后边的网络使用。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 from torch.utils.data import Datasetfrom PIL import Image import osclass MyData (Dataset ): def __init__ (self,root_dir,label_dir ): self.root_dir = root_dir self.lable_dir = label_dir self.path = os.path.join(self.root_dir,self.lable_dir) self.img_path = os.listdir(self.path) def __getitem__ (self, idx ): img_name = self.img_path[idx] img_item_path = os.path.join(self.root_dir,self.lable_dir,img_name) img = Image.open (img_item_path) label = self.lable_dir return img,label; def __len__ (self ): return len (self.img_path) root_dir = "dataset/train" ant_label_dir = "ants" bee_label_dir = "bees" ants_dataset = MyData(root_dir,ant_label_dir) bees_dataset = MyData(root_dir,bee_label_dir) train_dataset = ants_dataset + bees_dataset img1,label1 = train_dataset[120 ] img2,label2 = train_dataset[150 ] print (img1) img1.show() img2.show()
Tendorboard
tensorboard可以将数据可视化。他之前属于tensorflow,后来可以单独安装使用了。但是我在单独使用它过程中,出现了无法显示图像的问题,报错failed to fetch run.尝试了很多方法都没用,想什么改绝对路径这些。后来索性把tensorflow也安装了,然后就好用了。
add_scalar()
1 2 3 4 5 6 7 8 9 10 11 12 13 from torch.utils.tensorboard import SummaryWriterwriter = SummaryWriter("logs" ) for i in range (100 ): writer.add_scalar("y=x" ,i,i) writer.close()
1 2 tensorboard --logdir=logs
上述代码用tensorboard简单画了一个y=x的图像。
add_image()
前三个常用的参数
tag (str): Data identifier
img_tensor (torch.Tensor, numpy.ndarray, or string/blobname): Image data
global_step (int): Global step value to record
dataformats (str): Image data format specification of the form
CHW, HWC, HW, WH, etc.
其中numpy.ndarray有不同shape,对应了不用的dataformats.默认是3HW.
img_tensor的类型只能接收括号中的,而使用PIL的Image,获得的img不是这几个类型:
1 2 3 4 from PIL import Imageimg = Image.open (image_path) print (type (img))<class 'PIL.JpegImagePlugin.JpegImageFile' >
可以使用numpy,这样将PIL的图片转换成的img是满足要求的类型:
1 2 3 4 5 6 7 8 import numpy as npimg_array = np.array(img) print (type (img_array))<class 'numpy.ndarray' > print (img_array.shape)(512 , 768 , 3 ) writer.add_image("test" ,img_array,1 ,dataformats="HWC" )
Transforms
简单的使用
transform可以将对象转换为tensor类型,该类型中记录了深度学习中需要的一系列属性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 from PIL import Imagefrom torch.utils.tensorboard import SummaryWriterfrom torchvision import transformsimg_path = "data/train/ants_image/0013035.jpg" img = Image.open (img_path) tensor_trains = transforms.ToTensor() tensor_img = tensor_trains(img) writer = SummaryWriter("logs" ) writer.add_image("image" ,tensor_img) print (tensor_img[0 ][0 ][0 ]) trans_norm = transforms.Normalize([2 ,0.7 ,2 ],[0.4 ,0.8 ,2 ]) img_norm = trans_norm(tensor_img) print (img_norm[0 ][0 ][0 ]) writer.add_image("normalize" ,img_norm,3 ) print (img.size)trans_resize = transforms.Resize((512 , 512 )) img_resize = trans_resize(img) img_resize = tensor_trans(img_resize) writer.add_image("Resize" , img_resize, 0 ) print (img_resize)trans_resize_2 = transforms.Resize(512 ) trans_compose = transforms.Compose([trans_resize_2, tensor_trans]) img_resize_2 = trans_compose(img) writer.add_image("Resize" , img_resize_2, 1 ) trans_random = transforms.RandomCrop((500 , 600 )) trans_compose_2 = transforms.Compose([trans_random, tensor_trans]) for i in range (10 ): img_crop = trans_compose_2(img) writer.add_image("RandomCropHW" , img_crop, i) writer.close()
_call_
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 class Person : def __call__ (self, name ): print ("__call__" + name) def hello (self, name ): print ("hello" + name) person = Person() person("zhangsan" ) person.hello("lisi" ) __call__zhangsan hellolisi
可以看出该方法使得一个类实例变得像函数一样可以被调用,并且能够接受参数。
Dataloader
dataset是对数据集进行预处理,Dataloader就是怎么将数据集应用到神经网络中。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 import torchvision.datasetsfrom torch.utils.data import DataLoaderfrom torch.utils.tensorboard import SummaryWritertest_set = torchvision.datasets.CIFAR10("./dataset1" , train=False , transform=torchvision.transforms.ToTensor()) test_loader = DataLoader(dataset=test_set, batch_size=64 , shuffle=True , num_workers=0 , drop_last=False ) writer = SummaryWriter("dataloader" ) for epoch in range (2 ): step = 0 for data in test_loader: imgs, target = data writer.add_images("Epoch: {}" .format (epoch), imgs, step) step = step + 1 writer.close()