一、验证环境是否正确
1.pycharm console验证
import torch
二、Python中的两大函数
1. dir():打开;看见(工具箱及工具箱的分隔区有什么东西)
help():说明书(每个工具如何使用,工具的使用方法)
2.实操代码:
import torch
torch.cuda.is_available
dir(torch)
dir(torch.cuda)
dir(torch.cuda.is_available())
#输出['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__class__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', '__floor__', '__floordiv__', '__format__', '__ge__', '__getattribute'.....]双下划线说明不可修改
help(torch.cuda.is_available())
三、编程方式的对比:
1、代码以块为一个整体运行的话,
①pyhton文件的块:是所有行的代码(优:适用于大型项目;缺:需要从头运行)
②python控制台的块:是以每一行为块,运行的(优:显示变量属性;缺:不利于代码阅读和修改)
③jupyter:以任意行为块运行的(优:利于阅读和修改;缺:环境需要配置)
四、Pytorch加载数据初步认识:
1、①所有数据——>
②Dataset提供一种防暑获取数据及其label(实现怎么获取数据和label&告诉我们一共有多少数据)——>
③Dataloader:为后面网络提供不同的数据形式
2、代码部分(简单版,没有label单独的文件夹):
from torch.utils.data import Dataset
#utils表示常用工具库,使用Dataset要继承这个类
import cv2
from PIL import Image
import os
#读取图片用
class MyData(Dataset):
def __init__(self,root_dir,label_dir):
#为class提供全局变量,由于函数之间变量无法传递,self.可以指定变量给后面函数使用,指定了类里的全局变量
self.root_dir=root_dir#"dataset//train"
self.label_dir=label_dir#"ants"
self.path=os.path.join(self.root_dir,self.label_dir)#join可以自动连接地址
self.img_path=os.listdir(self.path) #因为地址是分散的,需要转换为ants的地址列表
def __getitem__(self, idx):#读取其中的一个
img_name=self.img_path[idx]#"读到了某一个的名称,例如0013035"
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"
ants_label_dir="ants"
bees_label_dir='bees'
ants_dataset = MyData(root_dir,ants_label_dir)
bees_dataset = MyData(root_dir,bees_label_dir)
train_dataset = ants_dataset + bees_dataset#数据集的拼接
img, label = ants_dataset[0]
img, label = bees_dataset[1]
img, label = train_dataset[123]
img.show()
3、代码部分复杂版(有一个label文件夹,储存着与图片名称相同的txt文件,里面写着ants/bees)
from torch.utils.data import Dataset
#utils表示常用工具库,使用Dataset要继承这个类
import cv2
from PIL import Image
import os
#读取图片用
class MyData(Dataset):
def __init__(self,root_dir,label_dir):
#为class提供全局变量,由于函数之间变量无法传递,self.可以指定变量给后面函数使用,指定了类里的全局变量
self.root_dir=root_dir#"dataset//train"
self.label_dir=label_dir#"ants"
self.path=os.path.join(self.root_dir,self.label_dir)#join可以自动连接地址
self.img_path=os.listdir(self.path) #因为地址是分散的,需要转换为ants的地址列表
def __getitem__(self, idx):#读取其中的一个
img_name=self.img_path[idx]#"读到了某一个的名称,例如0013035"
img_item_path=os.path.join(self.root_dir,self.label_dir,img_name)#连接完整地址
img=Image.open(img_item_path)
label_item_path = os.path.join(self.root_dir, self.label_dir, img_name.split('.')[0]+'.txt')
with open(label_item_path,'r') as f:
label = f.read()
return img,label
def __len__(self):
return len(self.img_path)
root_dir = "dataset/train"
ants_label_dir = "ants_label"
ants_image_dir = "ants_image"
bees_label_dir = "bees_label"
bees_image_dir = "bees_image"
ants_dataset = MyData(root_dir, ants_image_dir, ants_label_dir)
bees_dataset = MyData(root_dir, bees_image_dir, bees_label_dir)
train_data = ants_dataset + bees_dataset
img, label = ants_dataset[0]
img.show()
五、TensorBoard的使用
1.函数的使用
①writer.add_scalar()
def add_scalar(self,tag,scalar_value,global_step=None,walltime=None,new_style=False,double_precision=False,):
"""
参数使用:
tag (str): 图表标题
scalar_value (float or string/blobname): 保存的数值===y轴
global_step (int): 训练到多少步===x轴
walltime (float): 不常用
new_style (boolean): Whether to use new style (tensor field) or old
style (simple_value field). New style could lead to faster data loading."""
"""
官方示例:
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()
x = range(100)
for i in x:
writer.add_scalar('y=2x', i * 2, i)
writer.close()"""
2、代码实践
①
from torch.utils.tensorboard import SummaryWriter
writer=SummaryWriter("logs")
# writer.add_image()
#y=x
for i in range(100):
writer.add_scalar("y=x",i,i)
writer.close()
②运行后出现logs文件夹:
③在terminal输入语句打开log文件:
tensorboard --logdir=logs
④一台机器使用的人多,想要切换端口,在terminal输入语句:
tensorboard --logdir=logs --port=6007
⑤最终图像: