diff --git a/test/pairtest.cu b/test/pairtest.cu new file mode 100644 index 00000000..56b03807 --- /dev/null +++ b/test/pairtest.cu @@ -0,0 +1,105 @@ +#include "mshadow/tensor.h" +#include "old/tensor.h" +#include "assert.h" +#include + +using mshadow::index_t; +template +void Print(T const & ist, int I, int J) { + for (int i = 0; i < I; ++i) { + for (int j = 0; j < J; ++j) { + printf("%.2f ", ist[i][j]); + } + printf("\n"); + } +} + +bool Check(mshadow::TensorContainer &mct, \ + Xmshadow::TensorContainer &xct) { + for (index_t i = 0; i < mct.size(0); ++i) { + for (index_t j = 0; j < mct.size(1); ++j) { + assert(mct[i][j] == xct[i][j]); + } + } + return true; +} + +template +void RunTask() { + const int X = 6; + const int K = 2; + const int O = (X - K) / 2 + 1; + mshadow::TensorContainer srcm(mshadow::Shape4(1,1,X, X)); + Xmshadow::TensorContainer srcx(Xmshadow::Shape4(1,1,X, X)); + for (int i = 0; i < X; ++i) { + for (int j = 0; j < X; ++j) { + srcm[0][0][i][j] = i * 0.1f + j * 0.1f; + srcx[0][0][i][j] = i * 0.1f + j * 0.1f; + } + } + printf("Source:\n"); + Print(srcm[0][0], X, X); + printf("\n"); + mshadow::TensorContainer mct(mshadow::Shape4(1,1,X, X)); + Xmshadow::TensorContainer xct(Xmshadow::Shape4(1,1,X, X)); + mshadow::Copy(mct, srcm); + Xmshadow::Copy(xct, srcx); + + + mshadow::TensorContainer pool_ct(mshadow::Shape4(1,1, O, O)); + Xmshadow::TensorContainer pool_xct(Xmshadow::Shape4(1,1,O,O)); + + pool_ct = mshadow::expr::pool(mct, K, K, K); + pool_xct = Xmshadow::expr::pool(xct, K, K); + + printf("New pool:\n"); + Print(pool_ct[0][0], O, O); + printf("\nOld pool:\n"); + Print(pool_xct[0][0], O, O); + printf("\n"); + mshadow::TensorContainer gpool_src(mshadow::Shape4(1,1, O, O)); + Xmshadow::TensorContainer gpool_xsrc(Xmshadow::Shape4(1,1,O,O)); + for (int i = 0; i < O; ++i) { + for (int j = 0; j < O; ++j) { + gpool_src[0][0][i][j] = 0.1f; + gpool_xsrc[0][0][i][j] = 0.1f; + } + } + mshadow::TensorContainer gpool_ct(mshadow::Shape4(1,1, O, O)); + Xmshadow::TensorContainer gpool_xct(Xmshadow::Shape4(1,1,O,O)); + mshadow::Copy(gpool_ct, gpool_src); + Xmshadow::Copy(gpool_xct, gpool_xsrc); + + mshadow::TensorContainer mout(mshadow::Shape4(1,1,X, X)); + Xmshadow::TensorContainer xout(Xmshadow::Shape4(1,1,X, X)); + + mout = mshadow::expr::unpool(mct, pool_ct, gpool_ct, K, K, K); + xout = Xmshadow::expr::unpool(xct, pool_xct, gpool_xct, K, K); + + mshadow::Copy(srcm, mout); + Xmshadow::Copy(srcx, xout); + + mshadow::TensorContainer l1(mshadow::Shape2(X,X)); + Xmshadow::TensorContainer l2(Xmshadow::Shape2(X, X)); + l1 = mshadow::expr::reshape(srcm, l1.shape_); + l2 = Xmshadow::expr::reshape(srcx, l2.shape); + printf("New unpool\n"); + Print(l1, l1.size(0), l1.size(1)); + printf("\nOld unpool\n"); + Print(l2, X, X); + if (Check(l1, l2)) { + printf("Pass\n"); + } +} + +int main(int argc, char** argv) { + if (argc < 1) { + printf("Usage: dev\n"); + exit(-1); + } + if (!strcmp(argv[1], "cpu")) { + RunTask(); + } else { + RunTask(); + } +} \ No newline at end of file