This repository will show you how to put your own model directly into mobile(iOS/Android) with basic example. First part is about deep learning model to mobile machine learning framework, and second part is about deep learning framework to mobile machine learning framework
| Neural Network | CoreML | TensorFlow Mobile | Tensorflow Lite |
|---|---|---|---|
| Feedforward NN | ✔️ | ✔️ | ✔️ |
| Convolutional NN | ✔️ | ✔️ | ✔️ |
| Recurrent NN | ✔️ | ✔️ | ❗️ |
| Framework | CoreML | TensorFlow Mobile | Tensorflow Lite |
|---|---|---|---|
| Tensorflow | tf-coreml |
tensorflow |
tensorflow |
| Pytorch | onnx |
← | ← |
| Keras | coremltools |
tensorflow backend |
← |
| Caffe | coremltools |
caffe-tensorflow |
← |
I'll use Golbin code in this TensorFlow-Tutorials, and simple Keras code to convert. I use two examples because there are different limits.
import tensorflow as tf
import numpy as np
x_data = np.array(
[[0, 0], [1, 0], [1, 1], [0, 0], [0, 0], [0, 1]])
y_data = np.array([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0],
[1, 0, 0],
[0, 0, 1]
])
global_step = tf.Variable(0, trainable=False, name='global_step')
X = tf.placeholder(tf.float32, name='Input')
Y = tf.placeholder(tf.float32, name='Output')
with tf.name_scope('layer1'):
W1 = tf.Variable(tf.random_uniform([2, 10], -1., 1.), name='W1')
b1 = tf.Variable(tf.zeros([10]), name='b1')
L1 = tf.add(tf.matmul(X, W1), b1, name='L1')
L1 = tf.nn.relu(L1)
with tf.name_scope('layer2'):
W2 = tf.Variable(tf.random_uniform([10, 3], -1., 1.), name='W2')
b2 = tf.Variable(tf.zeros([3]), name='b2')
model = tf.add(tf.matmul(L1, W2), b2, name='model')
prediction = tf.argmax(model, 1, name='prediction')
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits_v2(labels=Y, logits=model), name='cost')
optimizer = tf.train.AdamOptimizer(learning_rate=0.01, name='optimizer')
train_op = optimizer.minimize(cost, global_step=global_step)
init = tf.global_variables_initializer()
sess = tf.Session()
sess.run(init)
saver = tf.train.Saver(tf.global_variables())
merged = tf.summary.merge_all()
writer = tf.summary.FileWriter('./logs', sess.graph)
for step in range(30):
sess.run(train_op, feed_dict={X: x_data, Y: y_data})
if (step + 1) % 30 == 0:
print(step + 1, sess.run(cost, feed_dict={X: x_data, Y: y_data}))
tf.train.write_graph(sess.graph_def, '.', './model/FFNN.pbtxt')
saver.save(sess, './model/FFNN.ckpt', global_step=global_step)
break
target = tf.argmax(Y, 1)
is_correct = tf.equal(prediction, target)
accuracy = tf.reduce_mean(tf.cast(is_correct, tf.float32))
print('Accuracy: %.2f' % sess.run(accuracy * 100, feed_dict={X: x_data, Y: y_data}))import numpy as np
import tensorflow as tf
x_data = np.array(
[[0, 0], [1, 0], [1, 1], [0, 0], [0, 0], [0, 1]])
y_data = np.array([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1],
[1, 0, 0],
[1, 0, 0],
[0, 0, 1]
])
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(10, input_dim=2,activation="relu"))
model.add(tf.keras.layers.Dense(2, activation="relu", kernel_initializer="uniform"))
model.add(tf.keras.layers.Dense(3))
model.add(tf.keras.layers.Activation("softmax"))
adam = tf.keras.optimizers.Adam(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=adam, metrics=['accuracy'])
model.summary()
reult = model.fit(x_data, y_data, shuffle=True, epochs=10, batch_size=2, validation_data=(x_data, y_data))- ML Framework supported by Apple, using
.mlmodelextension - Automatically generated wrapper for iOS(Swift or Objective-C)
-
Neural Network CoreML Feedforward NN ✔️ Convolutional NN ✔️ Recurrent NN ✔️
- ML Framework supported by Google, using
.pbextension - Support Java for Android, Objective-C++ for iOS
-
Neural Network TensorFlow Mobile Feedforward NN ✔️ Convolutional NN ✔️ Recurrent NN ✔️
- ML Framework supported by Google, using
.tfliteextension - Support Java for Android, Objective-C++ for iOS
- Recommand way by Google to use tensorflow in Mobile
-
Neural Network TensorFlow Mobile Feedforward NN ✔️ Convolutional NN ✔️ Recurrent NN RNN is not supported see more information in this link
We can get FFNN.pbtxtand FFNN.ckpt-90 in Part 0 code.
from tensorflow.python.tools import freeze_graph
freeze_graph.freeze_graph("model/FFNN.pbtxt", "",
"", "model/FFNN.ckpt-90", "Output",
"", "",
"FFNN_frozen_graph.pb", True, "")Now you can use FFNN_frozen_graph.pb in TensorFlow Mobile!
| Neural Network | freeze_graph |
|---|---|
| Feedforward NN | ✔️ |
| Convolutional NN | ✔️ |
| Recurrent NN | ✔️ |
You have to check frozen tensor graph
def load_graph(frozen_graph_filename):
with tf.gfile.GFile(frozen_graph_filename, "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
with tf.Graph().as_default() as graph:
tf.import_graph_def(graph_def, name="")
return graph
graph = load_graph('FFNN_frozen_graph.pb')
for op in graph.get_operations():
print(op.name)tf-coreml is the recommended way from Apple to convert tensorflow to CoreML
tf-coreml currently could not convert cycled graph like RNN... etc #124
import tfcoreml
mlmodel = tfcoreml.convert(
tf_model_path = 'FFNN_frozen_graph.pb',
mlmodel_path = 'FFNN.mlmodel',
output_feature_names = ['layer2/prediction:0'],
input_name_shape_dict = {'Input:0': [1, 2]})Now you can use FFNN.mlmodel in iOS project!
| Neural Network | tf-coreml |
|---|---|
| Feedforward NN | ✔️ |
| Convolutional NN | ✔️ |
| Recurrent NN | ✖️ |
toco is the recommended way from Google to convert TensorFlow to TensorFlow Lite
import tensorflow as tf
graph_def_file = "FFNN_frozen_graph.pb"
input_arrays = ["Input"]
output_arrays = ["layer2/prediction"]
converter = tf.contrib.lite.TocoConverter.from_frozen_graph(
graph_def_file, input_arrays, output_arrays)
tflite_model = converter.convert()
open("FFNN.tflite", "wb").write(tflite_model)Now you can use FFNN.tflite in Android project!
| Neural Network | toco |
|---|---|
| Feedforward NN | ✔️ |
| Convolutional NN | ✔️ |
| Recurrent NN | ✖️ |
coremltools is the recommended way from Apple to convert Keras to CoreML
import coremltools
coreml_model = coremltools.converters.keras.convert(model)
coreml_model.save('FFNN.mlmodel')Now you can use FFNN.mlmodel in Android project!
| Neural Network | coremltools |
|---|---|
| Feedforward NN | ✔️ |
| Convolutional NN | ✔️ |
| Recurrent NN | ✔️ |
toco is the recommended way from Google to convert Keras to TensorFlow Lite
Make .h5 Keras extension and then convert it to .tflie extension
keras_file = "FFNN.h5"
tf.keras.models.save_model(model, keras_file)
converter = tf.contrib.lite.TocoConverter.from_keras_model_file(keras_file)
tflite_model = converter.convert()
open("FFNN.tflite", "wb").write(tflite_model)Now you can use FFNN.tflite in Android project!
| Neural Network | toco |
|---|---|
| Feedforward NN | ✔️ |
| Convolutional NN | ✔️ |
| Recurrent NN | ✖️ |
DeepLearningToMobile is available under the MIT license. See the LICENSE file for more info.

