n维数组示例
- 3维数组(图片)
- 4维数组(n个图片,即一个batchsize)
- 5维数组 (视频,多了个时间维度)
数据操作
首先导入torch包
import torch
改变张量形状
X=x.reshape(3,4)
创建全0,全1
内部填维度,第一个维度为通道数
torch.zeros_like(Y) , 即创建一个与y维度一致的全0张量
torch.zeros((2,3,4))
torch.ones((2,3,4))
z = torch.zeros_like(Y)
多个张量连接在一起
通过cat方法
dim=0,按行合并,两个张量上下堆叠
dim=1,按列合并,两个张量左右堆叠
dim=2,
x = torch.arange(12,dtype=torch.float32).reshape((3,4))
y = torch.tensor([2.0, 1, 4, 3],[1, 2, 3, 4],[4, 3, 2, 1])
torch.cat((x,y),dim=0),torch.cat((x,y),dim=1)
逻辑运算符两元张量
得到只含false和true的张量
x == y
对张量中的所有元素求和会产生只有一个元素的张量
x.sum()
广播机制
形状不同可能通过广播机制来执行相关操作
内存问题
- 执行原地操作
z = torch.zeros_like(y)
z[ : ] = x + y
2.如果后续计算中没有重复使用x,可以使用如下语句减少开销
x[:] = x + y
x += y
转换numpy张量
如下转换后B为torch中的张量
A = x.numpy()
B = torch.tensor(A)
也可以将大小为1的张量转换为python标量
a = torch.tensor([3,5])
a.item(),float(a),int(a)
数据预处理
1. 创建一个人工数据集,存储在csv(逗号分隔值)文件
如果已经有数据集,则不需要自己创建
import os
#创建当前相对路径下用于存储数据集的文件夹,名为data
os.makedirs(os.path.join('..','data'),exist_ok=True)
#获取数据集文件
date_file = os.path.join('..','data','house_tiny.csv')
#打开数据集文件并向其中写入数据
with open(data_file, 'w') as f:
f.write('Numrooms,Alley,price\n') #列名,\n用于换行
f.write('NA,pave,127500\n') #每行表示一个数据样本
#NA代表未知
2.读取csv文件,加载原始数据集
一般读取csv文件,采用pandas库
data = pd.read_csv(data_file)
print(data)
3.处理缺失的数据NA,
典型的方法包括 插值 和 删除
下面考虑插值
#分为输入,输出两部分,输入为data中的所有行和前两列,输出为data中的所有行第二列
inputs,outputs = data.iloc(:,0:2), data.iloc(:,2)
#将输入中所有的NA 插入该列的平均值,对于非数值和离散值则还是NAN
inputs = inputs.fillna(inputs.mean())
对于非数值,即类别值或者离散值,我们将NAN 视为一个类别
#通过这个函数可以将类别变为数值,dummy_na=True 使得NAN也算一类0,
inputs = pd.get_dummies(inputs,dummy_na=True)
print(inputs)
转换为张量
现在inputs 和 outputs 中的缺失值,和字符全都是数值类型,可以转换为
pytorch中的张量
x,y = torch.tensor(inputs.values), torch.tensor(outputs.values)
pirnt(x,y)
数据加载
- Dataset 提供一种方式取获取数据及其label
- 如何获取每一个数据及其label
- 获取总共有多少数据
- Dataloader 为网络提供不同的数据形式
Dataset 实战
1.引入Dataset
from torch.utils.data import Dataset
import cv2 #引入opencv库处理图片
from PIL import Image #也可以用这个处理图片
补充:PIL的使用
#获取图片地址, window中要双反斜杠表示反义
img_path = "D:\\python 11\\新建文件夹\\practise\\深度学习\\数据加载\\hymenoptera_data\\train\\ants\\0013035.jpg"
#获取相应地址的图片
img = Image.open(img_path)
#展示图片
img.show()
2.新建一个数据集的类,类名自定,要继承Dataset类
新建的类要重写 init 方法 和 getitem 方法
下面以蜜蜂蚂蚁数据集为例
补充:利用os中的方法获取所有的数据(图片)
dir_path = "需要读取图片所在路径"
#os中的listdir方法将传入路径下的所有文件名,以列表的方式返回
img_path_list = os.listdir(dir_path)
#还需要通过地址拼接获取文件下所有图片的路径
#获取图片地址需要os库
import os
class Mydata(Dataset):
#init方法主要是提供后续一些其他方法所需要的初始变量
def __init__(self,root_dir,label_dir):
#本处采用的是蜜蜂蚂蚁数据集,需要获取全部图片地址
#需要root_dir(路径的前面公共部分) , label_dir(也就是标签名,标签名作为每类数据的文件夹名),文件名 拼接起来,
#os.path.join() 用于拼接地址
获取前半地址
self.root_dir = root_dir
self.label_dir = label_dir
self.path = os.path.join(self.root_dir,self.label_dir)
#获取文件夹下所有图片名构成列表,用于后续拼接地址
self.img_path = os.listdir(self.path)
def __getitem__(self,idx)
#idx 为编号
#该方法要返回数据和标签
img_name = self.img_path[idx]
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):
#重写__len__方法
return len(self.img_path)
应用上述新建的数据类
创建一个蚂蚁数据集,蜜蜂数据集,并合并为训练集
root_dir = "D:/python 11/新建文件夹/practise/深度学习/数据加载/hymenoptera_data/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