生成mnist_model_graph.pb
来源:互联网 发布:全国网络诈骗报警中心 编辑:程序博客网 时间:2024/06/14 03:37
简介
应用于tensorflow生成.pb文件供Android调用。新的手写AndroidTensorFlowMNISTExample-master.rar
代码
from __future__ import print_functionimport shutilimport os.pathimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataEXPORT_DIR = './model'if os.path.exists(EXPORT_DIR): shutil.rmtree(EXPORT_DIR)mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)# Parameterslearning_rate = 0.001training_iters = 200000batch_size = 128display_step = 10# Network Parametersn_input = 784 # MNIST data input (img shape: 28*28)n_classes = 10 # MNIST total classes (0-9 digits)dropout = 0.75 # Dropout, probability to keep units# tf Graph inputx = tf.placeholder(tf.float32, [None, n_input])y = tf.placeholder(tf.float32, [None, n_classes])keep_prob = tf.placeholder(tf.float32) # dropout (keep probability)# Create some wrappers for simplicitydef conv2d(x, W, b, strides=1): # Conv2D wrapper, with bias and relu activation x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') x = tf.nn.bias_add(x, b) return tf.nn.relu(x)def maxpool2d(x, k=2): # MaxPool2D wrapper return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME')# Create Modeldef conv_net(x, weights, biases, dropout): # Reshape input picture x = tf.reshape(x, shape=[-1, 28, 28, 1]) # Convolution Layer conv1 = conv2d(x, weights['wc1'], biases['bc1']) # Max Pooling (down-sampling) conv1 = maxpool2d(conv1, k=2) # Convolution Layer conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) # Max Pooling (down-sampling) conv2 = maxpool2d(conv2, k=2) # Fully connected layer # Reshape conv2 output to fit fully connected layer input fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) fc1 = tf.nn.relu(fc1) # Apply Dropout fc1 = tf.nn.dropout(fc1, dropout) # Output, class prediction out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) return out# Store layers weight & biasweights = { # 5x5 conv, 1 input, 32 outputs 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), # 5x5 conv, 32 inputs, 64 outputs 'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), # fully connected, 7*7*64 inputs, 1024 outputs 'wd1': tf.Variable(tf.random_normal([7 * 7 * 64, 1024])), # 1024 inputs, 10 outputs (class prediction) 'out': tf.Variable(tf.random_normal([1024, n_classes]))}biases = { 'bc1': tf.Variable(tf.random_normal([32])), 'bc2': tf.Variable(tf.random_normal([64])), 'bd1': tf.Variable(tf.random_normal([1024])), 'out': tf.Variable(tf.random_normal([n_classes]))}# Construct modelpred = conv_net(x, weights, biases, keep_prob)# Define loss and optimizercost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)# Evaluate modelcorrect_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# Initializing the variablesinit = tf.initialize_all_variables()# Launch the graphwith tf.Session() as sess: sess.run(init) step = 1 # Keep training until reach max iterations while step * batch_size < training_iters: batch_x, batch_y = mnist.train.next_batch(batch_size) # Run optimization op (backprop) sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout}) if step % display_step == 0: # Calculate batch loss and accuracy loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y: batch_y, keep_prob: 1.}) print("Iter " + str(step * batch_size) + ", Minibatch Loss= " + \ "{:.6f}".format(loss) + ", Training Accuracy= " + \ "{:.5f}".format(acc)) step += 1 print("Optimization Finished!") # Calculate accuracy for 256 mnist test images print("Testing Accuracy:", \ sess.run(accuracy, feed_dict={x: mnist.test.images[:256], y: mnist.test.labels[:256], keep_prob: 1.})) WC1 = weights['wc1'].eval(sess) BC1 = biases['bc1'].eval(sess) WC2 = weights['wc2'].eval(sess) BC2 = biases['bc2'].eval(sess) WD1 = weights['wd1'].eval(sess) BD1 = biases['bd1'].eval(sess) W_OUT = weights['out'].eval(sess) B_OUT = biases['out'].eval(sess)# Create new graph for exportingg = tf.Graph()with g.as_default(): x_2 = tf.placeholder("float", shape=[None, 784], name="input") WC1 = tf.constant(WC1, name="WC1") BC1 = tf.constant(BC1, name="BC1") x_image = tf.reshape(x_2, [-1, 28, 28, 1]) CONV1 = conv2d(x_image, WC1, BC1) MAXPOOL1 = maxpool2d(CONV1, k=2) WC2 = tf.constant(WC2, name="WC2") BC2 = tf.constant(BC2, name="BC2") CONV2 = conv2d(MAXPOOL1, WC2, BC2) MAXPOOL2 = maxpool2d(CONV2, k=2) WD1 = tf.constant(WD1, name="WD1") BD1 = tf.constant(BD1, name="BD1") FC1 = tf.reshape(MAXPOOL2, [-1, WD1.get_shape().as_list()[0]]) FC1 = tf.add(tf.matmul(FC1, WD1), BD1) FC1 = tf.nn.relu(FC1) W_OUT = tf.constant(W_OUT, name="W_OUT") B_OUT = tf.constant(B_OUT, name="B_OUT") # skipped dropout for exported graph as there is no need for already calculated weights OUTPUT = tf.nn.softmax(tf.matmul(FC1, W_OUT) + B_OUT, name="output") sess = tf.Session() init = tf.initialize_all_variables() sess.run(init) graph_def = g.as_graph_def() tf.train.write_graph(graph_def, EXPORT_DIR, 'mnist_model_graph.pb', as_text=False) # Test trained model y_train = tf.placeholder("float", [None, 10]) correct_prediction = tf.equal(tf.argmax(OUTPUT, 1), tf.argmax(y_train, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print("check accuracy %g" % accuracy.eval( {x_2: mnist.test.images, y_train: mnist.test.labels}, sess))
代码的改进
增加可变的学习速率,以及边训练边验证:
'''Created on 2017年10月24日@author: XuTing'''import mathimport shutilimport os.pathimport tensorflow as tffrom tensorflow.examples.tutorials.mnist import input_dataEXPORT_DIR = './model'if os.path.exists(EXPORT_DIR): shutil.rmtree(EXPORT_DIR)mnist = input_data.read_data_sets("E:/Program Files/MyEclipseCode/PythonCode/MyPythonCode/MyPythonTry/MNIST_data/", one_hot=True)# Parametersmax_learning_rate = 0.001min_learning_rate = 0.00001decay_speed = 2000.0 lr = tf.placeholder(tf.float32)training_iters = 200batch_size = 128display_step = 10# Network Parametersn_input = 784 # MNIST data input (img shape: 28*28)n_classes = 10 # MNIST total classes (0-9 digits)dropout = 0.75 # Dropout, probability to keep units# tf Graph inputx = tf.placeholder(tf.float32, [None, n_input])y = tf.placeholder(tf.float32, [None, n_classes])keep_prob = tf.placeholder(tf.float32) # dropout (keep probability)# Create some wrappers for simplicitydef conv2d(x, W, b, strides=1): # Conv2D wrapper, with bias and relu activation x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1], padding='SAME') x = tf.nn.bias_add(x, b) return tf.nn.relu(x)def maxpool2d(x, k=2): # MaxPool2D wrapper return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, k, k, 1], padding='SAME')# Create Modeldef conv_net(x, weights, biases, dropout): # Reshape input picture x = tf.reshape(x, shape=[-1, 28, 28, 1]) # Convolution Layer conv1 = conv2d(x, weights['wc1'], biases['bc1']) # Max Pooling (down-sampling) conv1 = maxpool2d(conv1, k=2) # Convolution Layer conv2 = conv2d(conv1, weights['wc2'], biases['bc2']) # Max Pooling (down-sampling) conv2 = maxpool2d(conv2, k=2) # Fully connected layer # Reshape conv2 output to fit fully connected layer input fc1 = tf.reshape(conv2, [-1, weights['wd1'].get_shape().as_list()[0]]) fc1 = tf.add(tf.matmul(fc1, weights['wd1']), biases['bd1']) fc1 = tf.nn.relu(fc1) # Apply Dropout fc1 = tf.nn.dropout(fc1, dropout) # Output, class prediction out = tf.add(tf.matmul(fc1, weights['out']), biases['out']) return out# Store layers weight & biasweights = { # 5x5 conv, 1 input, 32 outputs 'wc1': tf.Variable(tf.random_normal([5, 5, 1, 32])), # 5x5 conv, 32 inputs, 64 outputs 'wc2': tf.Variable(tf.random_normal([5, 5, 32, 64])), # fully connected, 7*7*64 inputs, 1024 outputs 'wd1': tf.Variable(tf.random_normal([7 * 7 * 64, 1024])), # 1024 inputs, 10 outputs (class prediction) 'out': tf.Variable(tf.random_normal([1024, n_classes]))}biases = { 'bc1': tf.Variable(tf.random_normal([32])), 'bc2': tf.Variable(tf.random_normal([64])), 'bd1': tf.Variable(tf.random_normal([1024])), 'out': tf.Variable(tf.random_normal([n_classes]))}# Construct modelpred = conv_net(x, weights, biases, keep_prob)# Define loss and optimizercost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=pred, labels=y))optimizer = tf.train.AdamOptimizer(learning_rate=lr).minimize(cost)# Evaluate modelcorrect_pred = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32))# Initializing the variablesinit = tf.global_variables_initializer()# Launch the graphwith tf.Session() as sess: sess.run(init) step = 1 # Keep training until reach max iterations while step < training_iters: learningRate = min_learning_rate + (max_learning_rate - min_learning_rate) * math.exp(-step / decay_speed) batch_x, batch_y = mnist.train.next_batch(batch_size) batch_tx, batch_ty = mnist.test.next_batch(batch_size) # Run optimization op (backprop) sess.run(optimizer, feed_dict={x: batch_x, y: batch_y, keep_prob: dropout, lr:learningRate}) if step % display_step == 0: # Calculate batch loss and accuracy loss, acc = sess.run([cost, accuracy], feed_dict={x: batch_x, y: batch_y, keep_prob: 1., lr:learningRate}) print("Iter " + str(step) + ", Minibatch Loss= " + \ "{:.6f}".format(loss) + ", Training Accuracy= " + \ "{:.5f}".format(acc) + ",learningRate:{}".format(learningRate)) if step % 50 == 0: print(" ") # Calculate accuracy for 256 mnist test images testAcc = sess.run(accuracy, feed_dict={x: batch_tx, y: batch_ty, keep_prob: 1.}) print("------------------Testing Accuracy:",testAcc) step += 1 print("Optimization Finished!") WC1 = weights['wc1'].eval(sess) BC1 = biases['bc1'].eval(sess) WC2 = weights['wc2'].eval(sess) BC2 = biases['bc2'].eval(sess) WD1 = weights['wd1'].eval(sess) BD1 = biases['bd1'].eval(sess) W_OUT = weights['out'].eval(sess) B_OUT = biases['out'].eval(sess)# Create new graph for exportingg = tf.Graph()with g.as_default(): x_2 = tf.placeholder("float", shape=[None, 784], name="input") WC1 = tf.constant(WC1, name="WC1") BC1 = tf.constant(BC1, name="BC1") x_image = tf.reshape(x_2, [-1, 28, 28, 1]) CONV1 = conv2d(x_image, WC1, BC1) MAXPOOL1 = maxpool2d(CONV1, k=2) WC2 = tf.constant(WC2, name="WC2") BC2 = tf.constant(BC2, name="BC2") CONV2 = conv2d(MAXPOOL1, WC2, BC2) MAXPOOL2 = maxpool2d(CONV2, k=2) WD1 = tf.constant(WD1, name="WD1") BD1 = tf.constant(BD1, name="BD1") FC1 = tf.reshape(MAXPOOL2, [-1, WD1.get_shape().as_list()[0]]) FC1 = tf.add(tf.matmul(FC1, WD1), BD1) FC1 = tf.nn.relu(FC1) W_OUT = tf.constant(W_OUT, name="W_OUT") B_OUT = tf.constant(B_OUT, name="B_OUT") # skipped dropout for exported graph as there is no need for already calculated weights OUTPUT = tf.nn.softmax(tf.matmul(FC1, W_OUT) + B_OUT, name="softmax") out_label = tf.argmax(OUTPUT, 1,name="output") sess = tf.Session() init = tf.global_variables_initializer() sess.run(init) graph_def = g.as_graph_def() tf.train.write_graph(graph_def, EXPORT_DIR, 'mnist_model_graph.pb', as_text=False) print("Save model to {}/mnist_model_graph.pb".format(EXPORT_DIR)) # Test trained model ''' y_train = tf.placeholder("float", [None, 10]) correct_prediction = tf.equal(tf.argmax(OUTPUT, 1), tf.argmax(y_train, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float")) print("check accuracy %g" % accuracy.eval( {x_2: mnist.test.images, y_train: mnist.test.labels}, sess)) '''
运行后的参数,测试:
'''Created on 2017年9月9日@author: admin'''import matplotlib.pyplot as pltimport tensorflow as tfimport numpy as npimport PIL.Image as Imagefrom skimage import transformfrom tensorflow.examples.tutorials.mnist import input_databatch_size =1def recognize(pb_file_path): with tf.Graph().as_default(): output_graph_def = tf.GraphDef() with open(pb_file_path, "rb") as f: output_graph_def.ParseFromString(f.read()) # rb _ = tf.import_graph_def(output_graph_def, name="") with tf.Session() as sess: tf.global_variables_initializer().run() input_x = sess.graph.get_tensor_by_name("input:0") print (input_x) out_softmax = sess.graph.get_tensor_by_name("softmax:0") print (out_softmax) out_label = sess.graph.get_tensor_by_name("output:0") print (out_label) mnist = input_data.read_data_sets("E:/Program Files/MyEclipseCode"+\ "/PythonCode/MyPythonCode/MyPythonTry/MNIST_data/", one_hot=True) batch_tx, batch_ty = mnist.test.next_batch(batch_size) plt.figure("fig1") plt.imshow(np.reshape(batch_tx, (28,28)),cmap='gray') img_out_softmax = sess.run(out_softmax, feed_dict={input_x:batch_tx}) print ("img_out_softmax:", img_out_softmax) prediction_labels = np.argmax(img_out_softmax, axis=1) print ("prediction_labels:", prediction_labels) plt.show()recognize("./model/mnist_model_graph.pb")
参考
【1】MindorksOpenSource/AndroidTensorFlowMNISTExample: Android TensorFlow MachineLearning MNIST Example (Building Model with TensorFlow for Android)
https://github.com/MindorksOpenSource/AndroidTensorFlowMNISTExample
【2】模型下载地址
在tensorflow官方教程里https://github.com/tensorflow/tensorflow/tree/master/tensorflow/examples/android/
1、D:\tensorflow\WORKSPACE
(这是As a first step for all build types, clone the TensorFlow repo with:
git clone –recurse-submodules https://github.com/tensorflow/tensorflow.git
Note that –recurse-submodules is necessary to prevent some issues with protobuf compilation.)
2、D:\tensorflow-master\WORKSPACE
“http://download.tensorflow.org/models/stylize_v1.zip“,
“http://download.tensorflow.org/models/mobile_multibox_v1a.zip“,
“http://download.tensorflow.org/models/object_detection/ssd_mobilenet_v1_android_export.zip“,
“http://download.tensorflow.org/models/speech_commands_v0.01.zip“,
- 生成mnist_model_graph.pb
- 以字典方式生成mnist_model_graph.pb并保存mnist图片
- PB 菜单生成(精华)
- 生成pb文件详解
- 生成pb文件详解
- pb生成exe文件步骤
- PB逆向生成数据库设计
- pb生成word文档代码
- PB-文件生成出现问题。
- protoc生成 caffe.pb.cc和caffe.pb.hpp
- 生成caffe.pb.cc和caffe.pb.h文件
- pb树的自动生成和处理
- pb根据sql语句生成数据窗口
- PB是如何生成NK.bin的?
- PB调用VS2005生成的DLL
- pb树的自动生成和处理
- PB 生成和解析JSON格式数据
- pb生成excel的两种方式
- 关于数据库设计的一点心得
- TabLayout 关联了 ViewPager 下划线不见了?
- 【Spring】 (1)Aspect 自定义注解 使用该注解的地方 自动注入该注解里传的参数
- NOIP 2015 Day2 T3 运输计划(二分+dfs序+树上差分+倍增LCA)
- 开发相关的测试
- 生成mnist_model_graph.pb
- BZOJ1131 [POI2008]Sta
- 考试总结6
- 神经网络中的「注意力」是什么?怎么用?
- 不用恐惧AI的高速发展,论击败阿法狗(零)最简单的方法
- 微软 CEO 纳德拉访谈:人工智能的大方向与未来是什么?
- Sicily1798. Alice and Bob[策略问题]
- 【第02章】【你的第一款Netty应用程序】
- 【数论】[HAOI2011]向量