Tensor Operation in Python

Tensor Contracted

我们都知道诸如MPS、TTN、PEPS这些常见张量网络,那么相信你对张量缩并一定不陌生。刘紫豪同学的博客里详细的介绍了张量之间的各种运算和应用。那么体现到代码里是什么样子的呢?其实,张量的缩并操作在python语言中有各种各样的表达方式,在numpy、tensorflow以及Pytorch中都提供了einsum,matmul,tensordot这三种方式用于计算张量的缩并。

举一个例子来说,假设A是一个3阶张量(三个指标维度为i,j,k),而B是一个4阶张量(j,k,m,n)。假如我们现在要将A张量的j,k两个指标和B张量的j,k两个指标进行缩并,得到一个i*m*n的三阶张量C,来看看代码里是怎么样的

C = np.einsum('ijk,jkmn->imn', A, B)
C = np.matmul(tf.expand_dims(A,1), B)
C = np.tensordot(A, B, [[1,2],[0,1]])

在性能方面三个函数没有很大的差异,当然对于较小的矩阵np.matmul可能更加有效,因为它将生成一个更简单的张量流图,操作更少,因此每个操作的调用成本更低。在循环或含条件参数的地方,可以通过tensordot进行动态缩并。当然也有一些developer为了方便,开发了专门的张量运算库例如**tncontractTensorNetwork(Google开发),Pytorch里也封装了各种各样的张量运算,在这里不仅能张量缩并,还能几句话实现非常复杂的张量参数反向迭代更新**,降低了张量的操作难度。

总之,各界大佬早已经定义好了各种张量网络运算的工具,适当了解对开发是非常有帮助的。当然,选择一种自己顺手的工具要方便的多,对其他的方法也得了解。

PS:SVD分解中,U是左奇异矩阵,可以用于行数的压缩,V是右奇异矩阵,可以用于列数的降维

Learning of Pytorch

论文HTN代码基于pytorch深度学习框架,而这个框架下有很多的方法和理论基础,于是在Coursera上在线学习Deep Neural Networks with PyTorch课程。这个课程非常详细的从基本数据结构Tensor开始讲起,每节视频3-10分钟,配套有视频代码,都可以在线运行、查看输出和讲解,每节视频都有配套的代码练习(这一点是至关重要的),而且不会很难,就是简单需要改几处,然后慢慢的增加难度。非常推荐对pytorch感兴趣的人去学习。

一边学着pytorch,一边我又多次去尝试读代码,思路慢慢理清楚了,程序的设计思路和方式,每一步的输出格式、内容也通过一次次调试弄明白了。中间遇到的那个问题,即代码中没有包含计算Accuracy部分已经补充完整,在output1计算出之后,通过以下代码计算每个batch_size的准确率

pred_y = torch.max(output1, 1)[1]
sum = int(torch.sum(pred_y == b_y))
accuracy = sum / BATCH_SIZE

还有一个坑就是,程序在开始运行的时候准确率只有10%,训练了好几个batch_size也没有明显的提升,于是就一步步追根溯源去查看backward更新函数,各种调试,最后发现人家写的还是对的。

那么问题出在哪里了呢,我在调试过程中发现,在反向传播BP更新参数那部分很复杂,每一层都有相当多的参数(尤其是张量网络层),例如最上一层是16*16*3*3*3*3*3,然后是8*8*3*3*3*3*3就是按照TTN的结构以此类推。参数这么多我估计得训练很多轮,于是就只能先跑几轮看看效果,不看不知道,一看吓一跳

1601029097250

仅仅经过两轮就整体上看到了test acc的增长,尽管每次的幅度很小(这意味着学习率很低)。上述仅仅2个epoch就耗费了大约两个小时的时间,因此我将更高的epoch次数(50+)放到了服务器上,以便于能昼夜不停地尽快得到最好的结果,目前fashion-mnist最高准确率达到90%,跟论文中的描述一致,40-50epoch基本没有变化,可能参数已经接近收敛了,重新设计网络或许能改善效果。

对于上述方案,可以改进的参数和设计还有很多,例如学习率的大小张量网络层和神经网络层的结构都可以进行调整。代码中神经网络层部分仅仅用了两个线性层作为补充,而诸如CNN、RNN等神经网络结构也可以一定程度上提高准确率。这篇论文代码只给了fashion-MNIST的代码,MNIST的代码已经在跑了,同时我还在尝试修改网络的结构,以达到更好的效果。

经过一晚上的设计,终于研究出了以下(含卷积层)的混合神经网络,下面将在MNIST上训练并查看这种设计的效果。

1601211309856

还有一些tensorboard和torch库的基本知识,内容比较多,就不再一一列举啦,以上就是本周的汇报。

1. How can I run Tensorboard on a remote server?

2. 学习笔记|Pytorch使用教程20(TensorBoard使用(一)

3. einsum初探

4. TORCH.UTILS.TENSORBOARD

5. Pytorch官方文档

6. pytorch在MNIST上采用CNN的例子

  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2024 YuleZhang's Blog
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信