Python TensorDataset上的Pytork变换

Python TensorDataset上的Pytork变换,python,pytorch,data-augmentation,Python,Pytorch,Data Augmentation,我正在使用从numpy数组创建数据集 # convert numpy arrays to pytorch tensors X_train = torch.stack([torch.from_numpy(np.array(i)) for i in X_train]) y_train = torch.stack([torch.from_numpy(np.array(i)) for i in y_train]) # reshape into [C, H, W] X_train = X_train.r

我正在使用从numpy数组创建数据集

# convert numpy arrays to pytorch tensors
X_train = torch.stack([torch.from_numpy(np.array(i)) for i in X_train])
y_train = torch.stack([torch.from_numpy(np.array(i)) for i in y_train])

# reshape into [C, H, W]
X_train = X_train.reshape((-1, 1, 28, 28)).float()

# create dataset and dataloaders
train_dataset = torch.utils.data.TensorDataset(X_train, y_train)
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64)
如何将数据扩充()应用于
TensorDataset

例如,使用,我可以将转换指定为其参数之一
torchvision.dataset.ImageFolder(root,transform=…)

根据PyTorch的一名团队成员的说法,默认情况下不支持它。有没有其他办法

请随时询问是否需要更多代码来解释问题。

默认情况下,
TensorDataset
不支持转换。但是我们可以创建自定义类来添加该选项。但是,正如我已经提到的,大多数转换都是为
PIL.Image
开发的。但无论如何,这里有一个非常简单的MNIST示例,带有非常虚拟的变换。带有MNIST的csv文件

代码:

将numpy导入为np
进口火炬
从torch.utils.data导入数据集,TensorDataset
进口火炬视觉
导入torchvision.transforms作为变换
将matplotlib.pyplot作为plt导入
#从cvs文件导入mnist数据集并将其转换为torch张量
将open('mnist_train.csv','r')作为f:
mnist_train=f.读线()
#图像
X_列=np.array([[float(j)表示i.strip()中的j.split(',')][1:]表示mnist_列中的i])
X_列=X_列。重塑((-1,1,28,28))
X_列=火炬张量(X_列)
#标签
y_列=np.数组([int(i[0]),用于mnist_列中的i)
y_train=y_train.整形(y_train.shape[0],1)
y_列=火炬张量(y_列)
德尔姆尼斯特火车
类CustomTensorDataset(数据集):
“”“支持转换的TensorDataset。”。
"""
def uuu init uuuu(自、张量、变换=无):
断言所有(张量[0]。大小(0)=张量。大小(0)表示张量中的张量)
自张量=张量
self.transform=transform
定义uu获取项目uu(自身,索引):
x=自张量[0][index]
如果自我转换:
x=自转换(x)
y=自张量[1][index]
返回x,y
定义(自我):
返回self.tensors[0]。大小(0)
def imshow(img,标题=“”):
“”“打印图像批处理。”。
"""
plt.图(figsize=(10,10))
标题(标题)
plt.imshow(np.transpose(img.numpy(),(1,2,0)),cmap='gray')
plt.show()
#数据集不带任何转换
序列数据集\u normal=CustomTensorDataset(张量=(X\u序列,y\u序列),transform=None)
列车装载机=torch.utils.data.DataLoader(列车数据集正常,批量大小=16)
#迭代
对于i,枚举中的数据(列装载机):
x、 y=数据
imshow(torchvision.utils.make_grid(x,4),title='Normal')
我们只需要一批
#让我们添加一些变换
#具有翻转变换的数据集
def vflip(张量):
“”“垂直翻转张量。
"""
张量=张量翻转(1)
返回张量
def hflip(张量):
“”“水平翻转张量。
"""
张量=张量翻转(2)
返回张量
序列数据集\u vf=CustomTensorDataset(张量=(X\u序列,y\u序列),变换=vflip)
火车装载机=torch.utils.data.DataLoader(火车数据集=vf,批量=16)
结果=[]
对于i,枚举中的数据(列装载机):
x、 y=数据
imshow(torchvision.utils.make_grid(x,4),title='Vertical flip')
打破
序列数据集\u hf=自定义张量数据集(张量=(X\u序列,y\u序列),变换=hflip)
火车装载机=torch.utils.data.DataLoader(火车数据集=hf,批量=16)
结果=[]
对于i,枚举中的数据(列装载机):
x、 y=数据
imshow(torchvision.utils.make_grid(x,4),title='Horizontal flip')
打破
输出:


另一个问题是,没有太多的变换可以应用于张量,其中大多数是面向PIL的。谢谢你的回答。它起作用了。一个补充:您不需要定义新的转换函数,例如
vfilp
,torchvision.transforms提供的那些。transforms可以工作,唯一的条件是首先通过转换。