pytorch实操笔记之基本数据操作

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()

广播机制

形状不同可能通过广播机制来执行相关操作

内存问题

  1. 执行原地操作
    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

参考链接:动手学深度学习
参考链接:pytorch教程

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值