深度学习day1
1.Pytorch介绍与张量的创建
张量和数组的区别,Tensor可以在GPU上运行,张量和数组可使用同一片内存空间
Tensor支持自动微分(Pytorch中)
Pytorch中导入是
import torch a=[1,2,3] b=torch.tensor(a) type(b) ##显示的是b的类型 b.dtype ##显示的是b中数据的类型
也可以用numpy数组创建tensor
a=np.random.normal((2,3)) b=torch.tensor(a) c=torch.ones_like(b) ##创建成相同形状和数据类型的张量 c=torch.zeros_like(b) c=torch.rand_like(b)
也可以用另一个张两种
a=torch.rand([2,2,]) a.dtype a.shape a.device张量是在cpu还是GPU上面创建的
if torch.cuda.is_available(): tensor. 返回是否是tensor torch.is_tensor(obj)
这个张量中所有元素的总数目 a=torch.numel(b) 5*5的矩阵 torch.zeros([5,5])
arrnge range(start=0,end,step=1)
torch.cat两个张量的连接
torch.cat(tensors,dim=1) dim为在那个维度链接
torch.cat([a,b],dim=1)
2.张量的创建API
torch.chunk张量的分割
b=torch.rand([3,2]) torch.chunk(b,chunks=2,dim)
3.DataSet和DataLoaders
1.如何构建自己的训练数据集
1.1加载内置数据集
DataSet单个样本
DataLoader多个样本
利用torch内置的数据库导入一些数据集
import torch import torch.utils.data inport Dataset from torchvision import datasets from torchvision.transforms import ToTensor import matplotlib.pyplot as plt training_data = datasets.FashionMNIST( root="data", train=True, download=True, transform=ToTensor() ) test_data=datasets.FanshionMNIST( root='data', train=False, download=True, transform=ToTensor() ) label_map={ 0:"T-Shirt", 1:"Coat", 2:"Pullover" ......... } figure=plt.figure(gigsize=(8,8)) cols,rows=3,3 for i in range(1,cols*rows+1): sample_idx=torch.randint(len(training_data),size=(1,)).item() img,label=training_data[sample_idx]
1.2在Torch中创建自己的数据集
自定义Dataset要实现三个函数(方法),init,len,getitem__
import os import pandas as pd from torchvision.io import read_image class CustomImageDataset(Dataset): def __init__(self,annotation_file,img_dir,transform=None,target_transform=None): self.img_labels=pd.read_csv(annotations_file) ##数据的标签 self.img_dir = img_dir ##数据的路径 self.transform = transform ##数据转换格式 self.target_transform=target_transform def __len__(self): return len(self.img_labels) ##每个laabel对应一个图像 def __getitem__(self,idx): ##完成数据路径格式的转变,保证能访问到数据 img_path=os.path.join(self.img_dir,self.img_labels.iloc[idx,0]) image = read_image(img_path) label = self.img_labels.iloc[idx,1] if self.transform: image=self.transform(image) if self.target_transform(label): label=self.target_transform(label) return image,label
1.3 DataLoader
dataset每一训练一个样本,提高抗噪能力构造多个样本的minibaths
对数据打乱shufflue防止过拟合
multprocessing多进程加载数据,每次处理多个
from torch.utils.data import DataLoader train_dataloader = DataLoader(training_data,batch_size=64, shuffle=True) test_DataLoader = DataLoader(test_data,batch_szie=64,shuffle=True) ##一般测试集不需要打乱
shuffle=True的话,每一轮的batch不一样了
train_features, train_labels=next(iter(train_dataloader)) print(f"Feature batch shape:{train_features.size()}") print(f"Labels batch shape:{train_labels.size()}") img=train_features[0].squeeze() label = train_labels[0] plt.imshow(img,cmap="gray") plt.show() print(f"label:{label}")
map-style datasets
collate_fn
vae
1.3.1 DataLoader源码
从磁盘中读取照片,并从磁盘中读取,把单个样本组成一批次,再输入到神经网络中训练
init
batch_sampler
num_workers 多线程的
collate_fn 对一个batch进行后处理,进行填充
batch_sampler 以什么样的方式,以什么
drop_last 是否丢掉最后一行数据
iter
BatchSampler 每次把一批数据传入列表,直到等于Batch_size
4.Pytorch搭建神经网络
Transforms 对数据集进行处理,使其满足神经网络的输入要求
traget_transform也是 标签值变换啥的
flatten=nn.Flatten()
保留第一维和最后一维
Linear线性层
layer1 = nn.Linear(in_features=28*28, out_features = 20) hidden1 = layer1(flat_image) print(hidden1.size())
nn.Relu
非线性函数,通常是在线性变换后加入的
是一个类,要实例化 class torch.nn.Relu(Inplace=True)
nn.Sequential
容器,将Module作为S实例化的参数
seq_module = nn.Sequential( flatten, layer1, nn.Relu(), nn.Linear(20,10) ##经过线性层后输出的是logits ) input_image = torch.rand(3,28,28) logits = seq_modules(input_image)
nn.Softmax
softmax = nn.Softmax(dim=1) ##对某一维度的归一化 pred_probab = softmax(logits)
指数的归一化,Softmax也是一个类,需要实例化
parameters返回的是一个元组,para有很多具体化的东西
buffers每个变量的均值,方差啥的
print("Model strure:", model, "\n\n") for name, param in model, named_parameters(): print(f"Layer:{name} | Size:{param.size()} | Values:{param[:2]}\n")