十分钟从 PyTorch 转 MXNet

https://zh.mxnet.io/blog/learn-mxnet-for-pytorch-users

10赞

希望mx.nd.batch_dot能够像torch.matmul一样支持不同size
现在的batch_dot只能是3D:
(batch_size, n, m), (batch_size, m, k) --> (batch_size, n, k)

想要的dbatch_dot:
(batch_size, t, n, m), (batch_size, m, k) --> (batch_size, t, n, k)

1赞

pytorch的F.pad函数比mxnet的好用,mxnet不支持全部维度,当时在实现pyramid_net的时候就感觉到了,numpy的pad函数也是全部支持的,而且还是希望大神们多出一些gluon的论文复现的项目,这样的话用的人会越来越多的 :grinning:

1赞

后续一系列blog是关于这个

1赞

好的好的 期待

在使用gluon的ImageFolderDataset时,遇到了

OpenCV Error: Assertion failed (!buf.empty() && buf.isContinuous()) in imdecode_, file /home/travis/build/dmlc/mxnet-distro/deps/opencv-3.3.0/modules/imgcodecs/src/loadsave.cpp, line 637
terminate called after throwing an instance of 'cv::Exception'
  what():  /home/travis/build/dmlc/mxnet-distro/deps/opencv-3.3.0/modules/imgcodecs/src/loadsave.cpp:637: error: (-215) !buf.empty() && buf.isContinuous() in function imdecode_

的错误,但是我并不清楚是为什么。

但是使用Pytorch的ImageFolder时,我读取跟上面使用Gluon时同样的数据集,也同样的发生错误,但是Pytorch错误信息中,指出了读取"xxx.png"时,出现问题。因此我马上把该图片删除后,就解决了问题。

@piiswrong

可以暂时可以通过reshape + batch_dot实现。比如a的shape是(batch_size, t, n, m), b的shape是(batch_size, m, k),可以用如下方法实现:

import mxnet as mx
from mxnet import ndarray as nd
batch_size = 16
t = 10
n = 8
m = 4
k = 3

A = nd.random.normal(0, 1, shape=(batch_size, t, n, m))
B = nd.random.normal(0, 1, shape=(batch_size, m, k))
C = nd.batch_dot(A.reshape((0, t * n, -1)), B)  # Shape: (batch_size, t*n, k)
C = C.reshape((0, t, n, -1))  # Shape: (batch_size, t, n, k)
print(C)

另外,我提了一个issue去support ndim>3的batch_dot,这个功能加上以后可以解决频繁reshape的问题:https://github.com/apache/incubator-mxnet/issues/10386

1赞

谢谢指出,现在的F.pad确实不够方便 (https://github.com/apache/incubator-mxnet/issues/9966)。我们会解决这个问题。

1赞

mx.nd.linalg.gemm2

mx.nd.linalg.gemm2这个函数是不是差不多集合了mx.nd.dot和mx.nd.batch_dot的功能,差异是:

  1. batch_dot可以broadcast,gemm2要求size完全一样;
  2. batch_dot只支持3维,gemm2可以是更高维;
    感觉应该把这3个整合一下吧?@sxjscience

矩阵乘法(两个矩阵分别为m, n维)就2种需求:

  1. 计算时需要m=n(不需要broadcast),就是现在的mx.nd.dot;
  2. 计算时需要m=n,可以先通过broadcast让矩阵size一样,再mx.nd.batch_dot

嗯可以把这些整合一下,现在打算加到batch_dot里面。

非常期待新的batch_dot
有时候矩阵size需要infer,或者batch_size动态变化的时候,reshape会不方便

希望实现ModuleList,这样写网络配置的时候,不至于太冗长

可以用register_child手动注册

来吧,能把DataParallel借鉴过来,就完美了,灵活!不然我想实现模型并行,到现在我还没想到怎么来实现

train_iter = mx.io.NDArrayIter(hottrain, label[:ntrain], batch_size, shuffle=True,label_name=‘lin_reg_label’)
eval_iter = mx.io.NDArrayIter(hottest, label[ntrain:], batch_size)

model.fit(train_iter, eval_iter, optimizer=‘Adam’,
optimizer_params={‘wd’:1.4,‘learning_rate’:0.0001},
num_epoch=niter,
epoch_end_callback=checkpoint)
这个代码从直观上来说,在model fit的时候使用了训练集和测试集,使用训练集和测试集得出的结果对测试集进行验证,这个思路明显是不正确的,请问mxnet在这个过程中的思路是这样的么?在进行model.fit的时候为什么要加上testdata呢?