-
Notifications
You must be signed in to change notification settings - Fork 0
KunmiaoYang/DNNCodeGenerator
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
Readme by Kunmiao Yang ******************** Structure ******************** The main structure of this project is generated by maven. So you may be familiar with it if you used maven before. I also added my own directory to it. 1. Source code: The source code is under the <Project root>/src/main/java path. All the source code are in the org.ncsu.dnn package, therefore, they are in the org/ncsu/dnn sub-directory under the java path mentioned above. There are 2 sub packages under the org.ncsu.dnn, org.ncsu.dnn.caffe and org.ncsu.dnn.tf package. The Caffe model scanner, parser and model classes are in caffe package. The TensorFlow model, layer classes and convertion code are in tf package. The Simple and Multiplexing code generators are in the org.ncsu.dnn package. The 2 Class SimpleCodeGenerator and MultiCodeGenerator both have a main function to run directly with 2 arguments. 2. Resources files: The root directory of resources files is <Project root>/src/main/resources. All the resources files are under the org/ncsu/dnn/tf/template sub-directory, including 4 python template files to generate the TensorFlow python code. These files will be packaged into the jar file along with the compiled class file. 3. Test code: The test code are all under the <Project root>/src/test/java/org/ncsu/dnn/ path. Including unit tests for scanner and parser and feature tests for TensorFlow model conversion and code generation. 4. Test resources files: The test resources files are all under the path <Project root>/src/test/resources/org/ncsu/dnn/caffe. There are 4 Inception model files in prototxt format. They are used in the feature tests to be converted into TensorFlow python models. 5. Target files: The <Project root>/target directory contains the compiled result and packaged jar file. 6. Output files: The generated TensorFlow model files by automatic feature tests are under the <Project root>/output directory by default. 7. Script files: I made some shell script files under the <Project root> directory. They can be used to execute the generated jar file. To use them you will need to add executable attributes for them. ******************** Install ******************** 1. Java 1.7 or higher: Installation instruction: https://www.java.com/en/download/help/download_options.xml 2. Maven 3.0.5 or higher: Installation instruction: https://maven.apache.org/install.html 3. Enable bash shell scripts (optional on linux): To enable the bash shell scripts on linux, use the following command under the root path of this project: $ chmod +x *.sh ******************** Compile ******************** 1. Compile source code to class files: Under the root path of this project, use the following command to compile: $ mvn compile 2. Generate jar package: To generate jar package, you need to compile the code first, or the package would be empty jar file. Under the root path of this project, use the following command to generate: $ mvn jar:jar The jar file would be generated under the <Project root>/target directory by default ******************** Test ******************** To test the project you need to compile the code first. 1. Execute automatic tests: Under the root path of this project, use the following command to execute automatic tests: $ mvn test 2. Test class files: Test class files locate at <Project root>/src/test/java directory. 3. Input files for tests: The input files for tests are caffe prototxt files, including Inception V1, V2, V3 and V4 and AlexNet. You can find them under <Project root>/src/test/resources/org/ncsu/dnn/caffe directory. ******************** Execute ******************** You can also manually execute the program with your own input files. To execute the program you need to generate the jar package first. Then you need to prepare the prototxt file. 1. Simple: use the following command to run: $ java -cp <DNNCodeGenerator.jar file path> org.ncsu.dnn.SimpleCodeGenerator <input file path> [output file path] or you can use the script under the root path of this project if you are on Linux: $ ./genSimpleCode.sh <input file path> [output file path] 2. Multiplexing: use the following command to run: $ java -cp <DNNCodeGenerator.jar file path> org.ncsu.dnn.MultiCodeGenerator <input file path> [output file path] or you can use the script under the root path of this project if you are on Linux: $ ./genMultiplexingCode.sh <input file path> [output file path] Notations: <DNNCodeGenerator.jar file path>: the jar file path generated. <input file path>: the input prototxt file path [output file path]: (optional) the output python file path. If not provided, the program would use the input file name with an additional suffix (_simple or _multiplexing), and it would be generated at run path. ******************** Output ******************** 1. Output of compile: The output of compile is generated by maven. Upon success, maven would generate success messages like this: [INFO] Compiling 25 source files to /home/kyang12/DNNCodeGenerator/target/classes [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 15.451s [INFO] Finished at: Thu Nov 15 22:05:43 EST 2018 [INFO] Final Memory: 12M/34M [INFO] ------------------------------------------------------------------------ And it would generate compiled targets under <Project root>/target directory. If it failed to compile, it would generate error messages. 2. Output of jar package generation: The output of jar package generation is generated by maven. Upon success, maven would generate success messages like this: [INFO] --- maven-jar-plugin:3.0.0:jar (default-cli) @ DNNCodeGenerator --- [INFO] Building jar: /home/kyang12/DNNCodeGenerator/target/DNNCodeGenerator-1.0.jar [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 5.088s [INFO] Finished at: Thu Nov 15 22:06:48 EST 2018 [INFO] Final Memory: 7M/89M [INFO] ------------------------------------------------------------------------ And it would generate DNNCodeGenerator-1.0.jar under <Project root>/target directory. If generate before compile, it would still generate the jar file, but the file would be empty. 3. Output of automatic tests: The output of automatic tests is generated by maven. Upon success, maven would generate success messages like this: Results : Tests run: 22, Failures: 0, Errors: 0, Skipped: 0 [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 19.573s [INFO] Finished at: Thu Nov 15 22:09:17 EST 2018 [INFO] Final Memory: 13M/33M [INFO] ------------------------------------------------------------------------ If any test case failed, it would generate error messages. 4. Output files from the tests: After execute this automatic tests, the program would generate 8 python files containing simple and multiplexing tensorflow models for each of the input caffe model file. You can find them under <Project root>/output directory. this directory would be generated after these teats are executed. ******************** Limitation ******************** 1. Applicable models: This program is designed to parse and generate Inception models. I tested from V1 to V4. I also tested AlexNet, the generated code would use convolution layer to implement fully connected layer. 2. Caffe layer limitations: Currently it only supports the following caffe layers: Convolution, BatchNorm, Scale, Relu, Pooling, Concat, Dropout, Reshape, Softmax, InnerProduct And it only supports the following tensorflow layers: slim.conv2d, slim.max_pool2d, slim.avg_pool2d, slim.concat, slim.dropout, slim.softmax, tf.squeeze But based on OO design, it would be easy to add new type of layers. 3. Limitation on conversion of InnerProduct layer in caffe: Since it is very popular to convert the last fully connected layer into convolution layer, and in Inception models the fully connected layer often comes last, I converted the InnerProduct layer in caffe into slim.conv2d by default. You can easily change the output in org.ncsu.dnn.tf.InnerProductLayer class. 4. Branch limitation: I found that the caffe models for Inceptions doesn't provide a scope hierarchy for inception layers like the example input file (inception_v1.prototxt). So I tried to construct this branch hierarchy using the a special DFS traverse. But this hierarchy construction can only support Inception models right now. It cannot handle NN blocks with more than one concat layers, because theoretically, this branch organized architecture cannot support graph with any complexity. It need to develop specifically for each different kind of model. 5. Default parameter limitation: The stride parameter for pooling layers would always be generated right now, unlike the example tensorflow code in which some stride parameter would be omitted because it equals the default value. I found in the example file, when the stride parameter equals default value, it would explicitly declare it in some cases, but omit it in others. So I decide to explicitly generate them by default. 6. The select depth injection in multiplexing: I assume that it is used for pruning, so it should not affect the output number of the block. So, I only inject them in convolution layers inside blocks that do not directly connect to the concat layer.
About
No description or website provided.
Topics
Resources
Stars
Watchers
Forks
Releases
No releases published
Packages 0
No packages published