[2023.07.24]pytorch basics :tensors and dataloader

文章介绍了PyTorch中的张量(tensors)操作,包括初始化、属性、操作如CUDA支持、切片、拼接和乘法。此外,还讨论了自定义数据集(CustomImageDataset)和数据加载器(dataloader)的使用,以及numpy数组和PandasDataFrame的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. tensors

内容来自:Tensors — PyTorch Tutorials 2.0.1+cu117 documentation

1)初始化tensors可以从data、numpy、另一个tensor。

data=[1,2,3]

x_data=torch.tensor(data)

np_array=np.array(data)

x_data=torch.from_numpy(np_array)//反向的是x_data.numpy(),但是修改numpy矩阵和修改tensor都会影响另一个的值。

x_data=torch.zeros_like(tensor_b)

shape=(1,2,)

x_data=zeros(shape)

2)tensor 属性 device,datatype,shape

3)tensor的操作

(1)首先检查系统是否支持cuda,在将tensor显式的移动到GPU.注意将tensor在设备间复制的时间和空间内存开销很大:

if torch.cuda.is_avialable():

        tensor=tensor.to("cuda")

(2)类似numpy的slicing,indexing

(3)拼接

torch.stack([tensor1,tensor2],dim,out=tensor)

   (4) 乘法

tensor@ tensor.T;tensor*tensor.T

y3=tensor.matmul(tensor.T);y3=tensor.mul(tensor.T)

torch.matmul(tensor,tensor.T,out=y3);torch.mul(tensor,tensor.T,out=y3)

   (5)将单元素的tensor转化为python数值型值

agg=tensor.sum()

agg_num=agg.item()

(6)in_place操作:直接修改tensor,而不需要复制,减少内存开销.

tensor.add_(5)

2. dataset& dataloaders

dataloader能在每次抽取minibatches前(每个epoch)打乱样本。

(1)自定义CustomImageDataset class,重写三个函数

import os
import pandas as pd
from torchvision.io import read_image

class CustomImageDataset(Dataset):# CustomImageDataset is a subclass of Dataset which is having __getitem__() and __len__()
    def __init__(slef,Annotations_file,img_dir,transform=None,target_transform=None):
        self.img_dir=img_dir
        self.img_labels=pd.read_csv(Annotaions_file)
        self.transform=transform
        self.target_transform=taget_transform

     def __len__(self):
        return(len(self.img_lables))

     def __getitem__(self,idx):
        img_path=io.path.join(self.img_dir,self.img_labels.iloc[idx,0])
        img=read_image(img_path)
        label=self.img_labels.iloc[idx,1]
        if self.transform:
            img=self.transform(img)
        if self.target_transform:
            label=self.target_transform(label)
        return img,label

(2)使用dataloader作图

Ankle Boot, Shirt, Bag, Ankle Boot, Trouser, Sandal, Coat, Sandal, Pullover

cols,rows

figure=plt.figure(figsize=(8,8))#显式的创建图片

for i in range(1, cols*rows+1):

    sample=tensor.randint(len(training_data),size(1,)).item();

    img,label=traing_data[sample]

    figure.add_subplot(cols,rows,i)

    plt.title(label)

    plt.axis("off")

    plt.imshow(img.squeeze(),cmap="gray")#draw things on the figure

plt.show()

(3)在dataloader中用next(),iter()迭代

from torch.utlis.data import DataLoader
training_data=CustomImageDataset(Annotations_file='data/faces/face_landmarks.csv',img_dir='data/faces')
train_dataloader=DataLoader(training_data,batch_size=64,shuffle=True)
#img, label = training_data[sample_idx]
test_dataloader=DataLoader(test_data,batch_size=64,shuffle=True)
train_features,train_labels=next(iter(train_dataloader))#返回尺寸为batch_size的tensor

---------------------

1. numpy array vs pandas dataframe

dataframe: tabular data preferred(可以添加列名、直接打印效果直观), more memory, better performance when rows less than 500k 

numpy array: numerical data preferred, memory efficient,better performance when rows less than 50k

2. pandas iloc function

按行分割,行列同时分割。整数,slice object, list of integer,boleen mask,lambda;

3. python iter(object)

iter函数能将所有支持iterable protocol的对象都转化为iterator object. dataloader也可以,因此可以使用iter(train_dataloader)

使用next(iterable object)迭代

4. torch squeeze(input, dim)

remover first dimension of a tensor. dim: integer or tuple of integer, optional

5.numpy reshape(-1,2)

只有一个维度可以为-1,值根据array的总长度和其他维度推断出来

6. numpy asarray vs array

如果asarray的第一个参数已经是ndarray,则不再复制元素。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值