Einconv is a powerful CNN module in which the structure is described in the language of tensor network. Einconv is basically an extension of Numpy's einsum --- we can uniformly compute higher-order convolution and multiplication in a single fashion. In short, Einconv has the following appealing features.
- Einconv can mimic a lot of CNN modules shown in the above picture.
- You can design your own CNN module by modifying a graph structure.
- Applicable to 3D or more higher-order convolution.
The code is based on Chainer. The basic concept is transferable to other libraries such as PyTorch.
Kohei Hayashi, Taiki Yamaguchi, Yohei Sugawara, Shin-ichi Maeda. Exploring Unexplored Tensor Decompositions for Convolutional Neural Networks. arXiv:1908.04471 (2019).
@misc{1908.04471,
Author = {Kohei Hayashi and Taiki Yamaguchi and Yohei Sugawara and Shin-ichi Maeda},
Title = {Einconv: Exploring Unexplored Tensor Decompositions for Convolutional Neural Networks},
Year = {2019},
Eprint = {arXiv:1908.04471},
}
- Python 3.6
- Numpy 1.13.3
- Chainer 5.1.0
You can try
python -u train_fmnist.py --graph 1_2_1_1_1_1_1
to learn with Fashion MNIST data set, where the option --graph 1_2_1_1_1_1_1 specifies a tensor network that is transformed into a CNN module.
The graph option follows the sequence of digits delimited by the underscore, for example 2_3_1_0_1_1_1_1_0_0_1_1_1_1_1_1. The first digit (2) indicates the number of layers involving the convolution module. The second digit (3) indicates the spatial dimension of a data set, e.g., 3 for 3D convolution. The remaining digits show an adjacency matrix that describes the tensor network in row-major order. The adjacency matrix of the example is as follow.
i o c c c e r
-------------
1 0 1 1 1 1 0
0 1 1 1 1 1 1
In the adjacency matrix, the first two columns denoted by i and o respectively represent the in-channel and out-channel. The next n columns c represent the nd convolution. The next m columns e represent extra channels (inner indices). The last column r indicates whether ReLU is on (1) or off (0). The number of columns is therefore 2 + n + m + 1.
- Standard:
1_2_1_1_1_1_0 - Flattend:
3_2_1_1_0_0_0_0_1_0_1_0_0_1_1_0_0 - Depthwise separable:
2_2_1_0_1_1_1_1_1_0_0_1 - Bottleneck:
3_2_1_0_0_0_3_0_1_0_0_1_1_3_3_1_0_1_0_0_0_3_1 - Factoring:
2_2_1_0_1_1_1_1_1_1_1_1 - CP:
4_2_1_0_0_0_3_0_0_0_0_1_3_0_0_0_1_0_3_0_0_1_0_0_3_0
- Standard:
1_3_1_1_1_1_1_0 - Depthwise separable:
2_3_1_0_1_1_1_0_1_1_0_0_0_0 - (2+1)D convolution:
2_3_1_0_1_1_0_1_0_0_1_0_0_1_1_0 - CP:
5_3_1_0_0_0_0_1_0_0_0_0_0_1_1_0_0_0_0_1_0_1_0_0_0_1_0_0_1_0_0_1_0_0_0_1_0 - Tensor Train:
5_3_1_0_0_0_0_0_0_0_1_0_0_0_0_0_1_0_0_1_1_0_0_0_0_1_0_0_1_1_0_0_0_0_1_0_0_1_1_0_0_0_0_1_0_0_0_1_0_0_0_0 - Hierarchical Tucker:
7_3_1_0_0_0_0_0_0_0_1_0_0_0_0_0_1_0_0_0_0_0_0_1_0_0_0_0_0_0_0_0_0_0_1_1_1_0_0_0_0_0_1_1_0_0_0_0_0_0_0_0_0_1_0_0_1_0_0_0_0_0_0_0_0_0_0_1_1_1_0_0_0_0_0_1_0_0_0_0_0_1_0_0_1_0
python enumerate_graph.py n m
We can enumerate the possible set of graphs by enumerate_graph.py. It takes 2 arguments:
n-- The dimension of convolution.m-- The number of extra channels.