The view-based implementation seems wrong:
In [184]: t = tf.constant(np.arange(32.).reshape(1,4,4,2))

In [185]: t.eval()
Out[185]:
array([[[[  0.,   1.],
         [  2.,   3.],
         [  4.,   5.],
         [  6.,   7.]],

        [[  8.,   9.],
         [ 10.,  11.],
         [ 12.,  13.],
         [ 14.,  15.]],

        [[ 16.,  17.],
         [ 18.,  19.],
         [ 20.,  21.],
         [ 22.,  23.]],

        [[ 24.,  25.],
         [ 26.,  27.],
         [ 28.,  29.],
         [ 30.,  31.]]]])

In [186]: tf.space_to_depth(t,2).eval()
Out[186]:
array([[[[  0.,   1.,   2.,   3.,   8.,   9.,  10.,  11.],
         [  4.,   5.,   6.,   7.,  12.,  13.,  14.,  15.]],

        [[ 16.,  17.,  18.,  19.,  24.,  25.,  26.,  27.],
         [ 20.,  21.,  22.,  23.,  28.,  29.,  30.,  31.]]]])

In [187]: t = torch.Tensor(np.arange(32.).reshape(1,4,4,2))

In [188]: t
Out[188]:

(0 ,0 ,.,.) =
   0   1
   2   3
   4   5
   6   7

(0 ,1 ,.,.) =
   8   9
  10  11
  12  13
  14  15

(0 ,2 ,.,.) =
  16  17
  18  19
  20  21
  22  23

(0 ,3 ,.,.) =
  24  25
  26  27
  28  29
  30  31
[torch.FloatTensor of size 1x4x4x2]

In [189]: t.view(1,2,2,8)
Out[189]:

(0 ,0 ,.,.) =
   0   1   2   3   4   5   6   7
   8   9  10  11  12  13  14  15

(0 ,1 ,.,.) =
  16  17  18  19  20  21  22  23
  24  25  26  27  28  29  30  31
[torch.FloatTensor of size 1x2x2x8]