一, 张量 (Tensor)
Tensor 是张量的英文, 表示的是一个多维矩阵. 比如: 零维就是一个点, 一维是向量, 二维就是一般矩阵, 多维就相当于一个多维的数组, 这和 numpy 是对应的, 而且 PyTorch 的 Tensor 可以和 numpy 的 ndarray 相互转换, 唯一不同的是 PyTorch 可以在 GPU 上运行, 而 numpy 的 ndarray 只能在 CPU 上运行.
1.Tensor 的基本操作
1.1 定义一个三行两列给定元素的矩阵, 并显示出矩阵的元素和大小
- a=torch.Tensor([[2,3],[4,8],[7,9]])
- print('a is:{}'.format(a))
- print('a size is:{}'.format(a.size()))
注意: torch.Tensor 默认的是 torch.FloatTensor 数据类型
1.2 定义我们想要的数据类型
- b=torch.LongTensor([[2,3],[4,8],[7,9]])
- print('b is:{}'.format(b))
1.3 创建一个全是 0 的空 Tensor 或者取一个正态分布作为随机初始值
- c=torch.zeros((3,2))
- print('zero tensor:{}'.format(c))
- d=torch.randn(3,2)
- print('normal random is :{}'.format(d))
2.Tensor 与 numpy.ndarray 之间的互相转换
2.1 Numpy 转 Tensor
- numpy_e=np.array([[2,3],[4,5]])
- print(type(numpy_e))
- tensor_e=torch.from_numpy(numpy_e)
- print(type(tensor_e))
使用 torch.from_numpy() 可以把 numpy 类型的数据转为 tensor 类型的数据
2.2 Tensor 转 Numpy
- tensor_a=torch.Tensor([[2,3],[4,8],[7,9]])
- print(type(tensor_a))
- numpy_a=tensor_a.numpy()
- print(type(numpy_a))
使用 numpy() 可以把 tensor 类型的数据转为 numpy 类型的数据
3. 如果你的电脑支持 GPU 加速, 还可以将 Tensor 放到 GPU 上
3.1 首先通过 torch.cuda.is_available() 判断一下是否支持 GPU, 如果想把 tensor a 放到 GPU 上, 只需 a.cuda() 就能够将 tensor a 放到 GPU 上了
- a=torch.Tensor([[2,3],[4,8],[7,9]])
- if torch.cuda.is_available():
- a_cuda=a.cuda()
- print(a_cuda)
- else:
- print("false")
二, Variable(变量)
Variable(变量) 是神经网络计算图里特有的一个概念, 提供了自动求导的功能. Variable 和 Tensor 本质上没有区别, 不过 Variable 会被放进一个计算图中, 然后进行前向传播, 反向传播和自动求导
1.Variable 的基本操作
1.1 导入 Variable
from torch.autograd import Variable
1.2 使 Tensor 变成 Variable
- tensor_a=torch.Tensor([[2,3],[4,8],[7,9]])
- variable_a=Variable(tensor_a,requires_grad=True)
requires_grad=True 参数表示是否对这个变量求梯度, 默认为 false
1.3 获取 Variable 的反向传播梯度
- tensor_a=torch.Tensor([[2,3],[4,8],[7,9]])
- variable_a=Variable(tensor_a,requires_grad=True)
- print(variable_a.grad)
1.4 Variable 的自动求导
- # Create Variable
- x=Variable(torch.Tensor([1]),requires_grad=True)
- w=Variable(torch.Tensor([2]),requires_grad=True)
- b=Variable(torch.Tensor([3]),requires_grad=True)
- # Build a conpuational graph
- y=w*x+b #y=2*x+3
- # Compute gradients
- y.backward()
- print(x.grad)
- print(w.grad)
- print(b.grad)
我们注意到一行 y.backward(), 这一行代码就是所谓的自动求导
1.5 Variable 做矩阵的求导
- x=torch.randn(3)
- x=Variable(x,requires_grad=True)
- y=x*2
- print(y)
- y.backward(torch.FloatTensor([1,0.1,0.01]))
- print(x.grad)
注: 这里给出了一个三维向量去做运算, 此时对这个向量的求导不能直接写成 y.backward(), 这样程序会报错. 这个时候要传入参数声明, 比如 y.backward(torch.FloatTensor([1,1,1])), 这样得到的结果就是它们每个分量的梯度, 或者可以传入 y.backward(torch.FloatTensor([1,0.1,0.01])), 这样得到的梯度就是它们原本的梯度分别乘上 1,0.1,0.01
三, Dataset(数据集)
在处理任何机器学习问题之前都需要数据读取, 并进行预处理. PyTorch 提供了很多工具使得数据的读取和预处理变得很容易.
torch.utils.data.Dataset 是代表这一数据的抽象类, 你可以自定义你的数据类继承和重写这个抽象类, 非常简单, 只需要定义 len 和 getitem 这两个函数:
- class myDataset(Dataset):
- def __init__(self,csv_file,txt_file,root_dir,other_file):
- self.csv_data=pd.read_csv(csv_file)
- with open(txt_file,'r') as f:
- data_list=f.readlines()
- self.txt_data=data_list
- self.root_dir=root_dir
- def __len__(self):
- return len(self.csv_data)
- def __getitem__():
- data=(self.csv_data[idx],self.txt_data[idx])
- return data
通过上面的方式, 可以定义我们需要的数据类, 可以通过迭代的方式来取得每一个数据, 但是这样很难实现取 batch, shuffle 或者多线程读取数据, 所以 PyTorch 中提供了一个简单的办法来做这个事情, 通过 torch.utils.data.DataLoader 来定义一个新的迭代器, 如下:
dataiter=DataLoader(myDataset,batch_size=32,shuffle=True,collate_fn=default_collatre)
里面的参数都非常清楚, 只有 collate_fn 是表示如何取样本的, 我们可以定义自己的函数来准确地实现想要的功能, 默认的函数在一般情况下都是可以使用的.
另外在 torchvision 这个包中还有一个更高级的有关于计算机视觉的数据读取类: ImageFolder, 主要功能是处理图片, 且要求图片是下面这种存放形式:
- root/dog/xxx.PNG
- root/dog/xxy.PNG
- root/dog/xxz.PNG
- root/cat/123.PNG
- root/cat/234.PNG
- root/cat/afa.PNG
之后这样来调用这个类
dest=ImageFolder(root='root_path',transform=None,loader=default_loader)
其中的 root 需要时根目录, 在这下面的每一个文件夹都代表是一个类别; transform 和 target_transform 是图片增强; loader 是图片的读取方法
来源: http://www.jianshu.com/p/2663f9850eac