Neural Programmer-Interpreter Implementation in PyTorch. Here is the original paper: Neural Programmer-Interpreters, by Reed and de Freitas.
We modified NPI to implement a differentiable queue and stack to solve the Maze and Reverse Polish Notation problems.
Please enter NPI_Maze folder at first. All files needed are in this folder.
- numpy 1.18.1
- tensorboard 2.1.0
- tensorboardX 2.0
- torch 1.4.0+cpu or 1.0.1
- torchvision 0.5.0+cpu or 0.2.1
See the NPI_Maze/Data/maze_gen.py.
We build 3 different training datasets and 3 different test datasets in NPI_Maze/Data/. You can directly run .py files with prefix 'train'
python train_n1_5_50.py
The example will train the model with network configuration 1 on the train_5_50 dataset.
Here is a demo.
python eval_n1_7_100.py
Please enter reverse_polish folder at first. All files needed are in this folder.
- python 3.7.4
- numpy 1.18.4
- tensorboard 2.1.1
- tensorboardX 2.0
- torch 1.5.0
- torchvision 0.6.0
cd CIS700_Fall_2019_Final/reverse_polish/
python prepare_data.py
C/F+(D*F+H)
E/B/H-(B+A/G)
H+F/C-(B+C/E)
G+D-F
H+D*E/F*H
E*D+B
E*A+D/G
TRACE
Expression: E/B/H-(B+A/G)..
Stack : ...............
-------------------------------
Rev Polish: E..............
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: E..............
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: EB.............
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: EB/............
###############################
Expression: E/B/H-(B+A/G)..
Stack : ...............
-------------------------------
Rev Polish: EB/............
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: EB/............
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: EB/H...........
###############################
Expression: E/B/H-(B+A/G)..
Stack : /..............
-------------------------------
Rev Polish: EB/H/..........
###############################
Expression: E/B/H-(B+A/G)..
Stack : ...............
-------------------------------
Rev Polish: EB/H/..........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -..............
-------------------------------
Rev Polish: EB/H/..........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(.............
-------------------------------
Rev Polish: EB/H/..........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(.............
-------------------------------
Rev Polish: EB/H/B.........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+............
-------------------------------
Rev Polish: EB/H/B.........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+............
-------------------------------
Rev Polish: EB/H/BA........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+/...........
-------------------------------
Rev Polish: EB/H/BA........
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+/...........
-------------------------------
Rev Polish: EB/H/BAG.......
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+/...........
-------------------------------
Rev Polish: EB/H/BAG/......
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+............
-------------------------------
Rev Polish: EB/H/BAG/......
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(+............
-------------------------------
Rev Polish: EB/H/BAG/+.....
###############################
Expression: E/B/H-(B+A/G)..
Stack : -(.............
-------------------------------
Rev Polish: EB/H/BAG/+.....
###############################
Expression: E/B/H-(B+A/G)..
Stack : -..............
-------------------------------
Rev Polish: EB/H/BAG/+.....
###############################
Expression: E/B/H-(B+A/G)..
Stack : -..............
-------------------------------
Rev Polish: EB/H/BAG/+-....
###############################
Expression: E/B/H-(B+A/G)..
Stack : ...............
-------------------------------
Rev Polish: EB/H/BAG/+-....
###############################
__________
[
(('REVPOLI', 2), [], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 5], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 2], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [2, 1], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 8], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [2, 1], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 12], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 9], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 2], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 11], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 1], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('MOV_PTR', 0), [1, 1], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 7], False), (('MOV_PTR', 0), [2, 1], False), (('MOV_PTR', 0), [0, 1], False), (('PRECE', 3), [], False), (('WRITE', 1), [1, 14], False), (('MOV_PTR', 0), [2, 1], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('WRITE', 1), [1, 11], False), (('MOV_PTR', 0), [2, 1], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('MOV_PTR', 0), [0, 1], False), (('WRITE', 1), [1, 12], False), (('MOV_PTR', 0), [2, 1], False), (('WRITE', 1), [1, 0], False), (('MOV_PTR', 0), [1, 0], False), (('MOV_PTR', 0), [1, 0], True)
]
There are several train*.py
files under reverse_polish folder.
cd CIS700_Fall_2019_Final/reverse_polish/
python train_exp_len14_adam.py
There are two example .py
files.
cd CIS700_Fall_2019_Final/reverse_polish/
python test_exp_len8_sgd_1en3_on_exp_len8.py
For more modification, please open test_exp_len8_sgd_1en3_on_exp_len8.py and modify following:
- Line 188: change
exp_dir
to loading specific trained weights. - Line 214: change
TEST_DATA_PATH
to loading different data.test.pik
is the data with maximum-length 14, andtest_8.pik
is the data with maximum-length 8.