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作图
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,则不再复制元素。