import torch
# 显示是否使用GPU
print(torch.cuda.is_available())
# 查看成员以及手册
print(dir(torch))
print(dir(torch.AVG)) # =>abc
print(help(torch.AVG))
# pytorch的加载数据方法:
# 一、 Dataset:提供一种方式及其label
# 二、Dataloader:为网络提供不同的数据形式
from torch.utils.data import Dataset
import cv2
from PIL import Image
import os
# dataset代码实战
class MyData(Dataset):
def __init__(self, root_dir, label_path):
# 初始化操作
self.root_dir = root_dir
self.label_path = label_path
self.img_dir = os.path.join(self.root_dir, self.label_path)
self.img_path_list = os.listdir(self.img_dir)
print(self.img_path_list)
def __getitem__(self, index):
# 获取数据集元素的信息
img_path = self.img_path_list[index]
print("getitem:",img_path)
img = Image.open(os.path.join(self.img_dir ,img_path))
label = self.label_path
return img, label
def __len__(self):
# 返回长度
return len(self.img_path_list)
ant_dataset = MyData(r"E:\\data\\hymenoptera_data\\train","ants") # dataset
bee_dataset = MyData(r"E:\\data\\hymenoptera_data\\train","bees") # dataset
# img, label = ant_dataset[0]
# # 可以把dataset当成数组的新式,每次都会执行__getitem__函数获取对应index的信息:img、label
# print(img, label)
# img.show()
# 数据集拼接操作,两个数据集相加操作:
train_dataset = ant_dataset+bee_dataset
print(len(train_dataset),len(ant_dataset),len(bee_dataset))
from torch.utils.tensor writer = SummaryWriter("logs2") # 自动创建 图片添加:writer.add_image("Tensor_img",transe_img ) 低纬数据:writer.add_scalar("y=x",2*i,i)
# Tensorboard的使用:训练可视化:loss
# 以前只能在tf中使用
# 图像变化,transform的使用
from torch.utils.tensorboard import SummaryWriter # 写入、可视化操作(pip install )
writer = SummaryWriter("logs")
for i in range(100):
writer.add_scalar("y=x",2*i,i) #低纬数据
writer.close()
from torch.utils.tensorboard import SummaryWriter
# 创建实例化对象、并且指定保存文件路径(自动创建文件夹)
writer = SummaryWriter("logs2") # 创建保存文件
transe_img = tensor_trans(img)
print(transe_img)
# 添加
writer.add_image("Tensor_img",transe_img )
# 关闭
writer.close()
from torchvision import transforms
# 一、 ctrl+tal=7: 显示脚本所有的内容
# 查看transforms.py、工具箱:totensor、resize
# 二、 transforms.ToTensor
from PIL import Image
img_path = "E:\\data\\hymenoptera_data\\train\\ants\\69639610_95e0de17aa.jpg"
img = Image.open(img_path)
print(img) #
# img.show()
tensor_trans = transforms.ToTensor()
print(tensor_trans) #ToTensor() 对象
transe_img = tensor_trans(img) # 转换
print(transe_img) # tensor([[[0.9294, 0.933……
print(transforms.ToTensor()(img)) # 等同上面的过程
transform(ctrl+ Alt +7)显示的脚本属性功能
ipython运行后显示的tensor属性:包含grad等梯度下降所需的属性
*补充知识(内置函数__call__():可以利用 对象名() 调用) tansforms实现变化的本质就是调用__call__()方法
class Person:
def __call__(self, name):
print("__call__","hello",name)
def hello(self,name):
print("hello",name)
p = Person()
p("hdl") #可以利用这种形式调用—__call__
p.hello("hdl2")
Compose源码截取:transforms together(操作的集合)
class Compose(object):
"""Composes several transforms together.
Args:
transforms (list of ``Transform`` objects): list of transforms to compose.
Example:
>>> transforms.Compose([
>>> transforms.CenterCrop(10),
>>> transforms.ToTensor(),
>>> ])
"""
归一化操作:Normal
from PIL import Image
from torchvision import transforms
from torch.utils.tensorboard import SummaryWriter
# 提前准备PIL图片、SummaryWriter文件
img_path = "E:\\data\\hymenoptera_data\\train\\ants\\69639610_95e0de17aa.jpg"
img = Image.open(img_path)
writer = SummaryWriter("logs4")
# 定义操作
T1_Totensor = transforms.ToTensor()
T2_Normalize1 = transforms.Normalize([0.5,0.5,0.5],[0.5,0.5,0.5])
T3_Normalize2 = transforms.Normalize([3,4,5],[3,4,5])
T4_Normalize3 = transforms.Normalize([7,4,9],[1,3,6])
# 实现操作、获取图片
tensor_img = T1_Totensor(img)
normal_img1 = T2_Normalize1(tensor_img)
normal_img2 = T3_Normalize2(tensor_img)
normal_img3 = T4_Normalize3(tensor_img)
# 写入文件:add_image(tag, img_tensor, global_step=None)
writer.add_image("tensor_img", tensor_img)
writer.add_image("normal_img", normal_img1,1)
writer.add_image("normal_img", normal_img2,2)
writer.add_image("normal_img", normal_img3,3)
normal_img可以看出图片变化情况
pycharm取消大小写匹配
Transforms.Resize((512,512)) #PIL->PIL
# Resize操作
T5_Resize512 = transforms.Resize((512,512)) # PIL -> PIL
print(img.size)
img512 = T5_Resize512(img)
print(img512.size)
tensor_img512 = T1_Totensor(img512)
Transforms.Compose()
# Compose操作!
T6_Compose = transforms.Compose([T5_Resize512,T1_Totensor])
imgCompose = T6_Compose(img)
print(imgCompose.shape)
# 一步
print(transforms.Compose([T5_Resize512,T1_Totensor])(img).shape) #torch.Size([3, 512, 512])
Transforms.RandomCrop 随机裁剪
# 随机裁剪
T7_RandomCrop = transforms.RandomCrop(50)
T8_RandomCropWH = transforms.RandomCrop((50,100))
T9_ComT7 = transforms.Compose([T7_RandomCrop,T1_Totensor])
T10_ComT8 = transforms.Compose([T8_RandomCropWH,T1_Totensor])
for i in range(10):
img_crop = T9_ComT7(img)
writer.add_image("crop",img_crop,i)
for i in range(10):
img_crop = T10_ComT8(img)
writer.add_image("crop2",img_crop,i)
torchvision模块介绍(包含dataset、transforms)
# torchvision的各种模块
from torchvision import transforms # 图像操作
from torchvision import datasets # 数据集
from torchvision import models # 常见的神经网络,有的预训练好了
from torchvision import ops # 少见的操作
from torchvision import utils # 常见的小工具
1. torchvision.datasets.CIFAR10 数据集的获取
import torchvision
# 获取dataset里面的数据集
train_set = torchvision.datasets.CIFAR10("./dataset",train=True,download=True) # 自动下载数据集
test_set = torchvision.datasets.CIFAR10("./dataset",train=False,download=True)
img, target = train_set[0]
print("shape",len(train_set)) # 50000
print("shape",len(test_set)) # 10000
# 无trainfrom: 6
# 有trainfrom:tensor([[[0.2314,…… 6
# 将数据集写入tensorboard
writer = SummaryWriter("logs4")
for i in range(10):
img, target = train_set[i]
writer.add_image("dataset1",img,i)
dataset.CIFAR10参数:
实现批量抽取:
img, target = train_set[0],
img1, target1 = train_set[1],
img2, target2 = train_set[2],
img3, target3 = train_set[3]
打包返回
imgs = img,img1,img2,img3
targets = target, target1, target2, target3
# dataloader: 从dataset取数据的工具,可迭代对象
from torch.utils.data import DataLoader
test_Loader = DataLoader(dataset=test_set, batch_size=64, shuffle=True, num_workers=0, drop_last=False)
i = 0
for data in test_Loader:
imgs, targets = data # torch.Size([4, 3, 32, 32]) tensor([5, 6, 2, 8])
writer.add_images("loader1", imgs, i) # 添加多张图片:add_images
i+=1
print("第{}次迭代".format(i)) # 157次迭代,157*64=10000
writer.close()
参数介绍:
分两批取数据
for epoch in range(2):
i = 0
for data in test_Loader:
imgs, targets = data # torch.Size([4, 3, 32, 32]) tensor([5, 6, 2, 8])
writer.add_images("loader:Epoch_{}".format(epoch), imgs, i) # 添加多张图片:add_images
i+=1
nn各模块介绍
第一个网络
import torch
from torch import nn
class Net1(nn.Module):
def __init__(self):
super(Net1, self).__init__()
# 通常在这里定义变化的方法
def forward(self,input):
# 可使用 output = 网络对象名(input)
print("forward run")
output = input+1
return output
n1 = Net1()
x = torch.tensor(1.0) # tensor(1.)
o = n1(x) #tensor(2.)
print(o)
卷积操作演示:torch.nn.functional.conv2d(用于2维数据,conv1d,conv3d不常用)
import torch.nn.functional as F
input = torch.tensor([
[1,2,0,3,1],
[0,1,2,3,1],
[1,2,1,0,0],
[5,2,3,1,1],
[2,1,0,1,1]
])
kernel = torch.tensor([
[1,2,1],
[0,1,0],
[2,1,0]
])
print(input.shape)
print(kernel.shape)
input = torch.reshape(input, [1,1,5,5])
kernel = torch.reshape(kernel, (1,1,3,3))
print(input.shape)
print(kernel.shape)
import torch.nn.functional as F
output = F.conv2d(input, kernel, stride=1)
print(output)
'''tensor([[[[10, 12, 12],
[18, 16, 16],
[13, 9, 3]]]])'''
output = F.conv2d(input, kernel, stride=2)
print(output)
'''tensor([[[[10, 12],
[13, 3]]]])'''
output = F.conv2d(input, kernel, stride=1, padding=1)
print(output)
'''tensor([[[[ 1, 3, 4, 10, 8],
[ 5, 10, 12, 12, 6],
[ 7, 18, 16, 16, 8],
[11, 13, 9, 3, 4],
[14, 13, 9, 7, 4]]]])'''
搭建卷积(from torch.nn import Conv2d)网络
import torch
import torchvision
from torch import nn
import torchvision
from torch.nn import Conv2d
from torch.utils.data import DataLoader
from torch.utils.tensorboard import SummaryWriter
dataset = torchvision.datasets.CIFAR10("dataset", train=False, transform=torchvision.transforms.ToTensor(),
download=True)
dataloader = DataLoader(dataset, batch_size=64)
class Net2_conv(nn.Module):
def __init__(self):
super(Net2_conv, self).__init__()
self.conv1 = Conv2d(in_channels=3, out_channels=6, kernel_size=3, stride=1,padding=0)
def forward(self, input):
x = self.conv1(input)
return x
n2 = Net2_conv()
print(n2)
writer = SummaryWriter("logs5")
step = 0
for data in dataloader:
imgs, targets = data
output = n2(imgs) # torch.Size([64, 3, 32, 32]) -> torch.Size([64, 6, 30, 30])
# torch.Size([64, 6, 30, 30]) -》 torch.Size([-1, 3, 30, 30])
output = torch.reshape(output, (-1,3,30,30)) # torch.Size([128, 3, 30, 30])
writer.add_images("input",imgs,step)
writer.add_images("output",output,step) # 卷积后的图像:超过3个通道不知道怎么显示:尺寸变换
step = step+1
注意
可以看出相邻两列的图片来自同一个卷积源
池化层
最大池化(下采样)