将Keras模型导出到tflite

时间:2018-10-30 08:52:15

标签: python tensorflow machine-learning keras

我正在尝试结合这两个示例,并为我的android应用创建tflite文件。

https://medium.com/nybles/create-your-first-image-recognition-classifier-using-cnn-keras-and-tensorflow-backend-6eaab98d14dd

https://medium.com/@xianbao.qian/convert-keras-model-to-tflite-e2bdf28ee2d2

这是我的代码:

# Part 1 - Building the CNN

# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Convolution2D
from keras.layers import MaxPooling2D
from keras.layers import Flatten
from keras.layers import Dense
import tensorflow as tf
from keras.models import load_model


# Initialising the CNN
classifier = Sequential()

# Step 1 - Convolution
classifier.add(Convolution2D(32, 3, 3, input_shape = (64, 64, 3), activation = 'relu'))

# Step 2 - Pooling
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Adding a second convolutional layer
classifier.add(Convolution2D(32, 3, 3, activation = 'relu'))
classifier.add(MaxPooling2D(pool_size = (2, 2)))

# Step 3 - Flattening
classifier.add(Flatten())

# Step 4 - Full connection
classifier.add(Dense(output_dim = 128, activation = 'relu'))
classifier.add(Dense(output_dim = 1, activation = 'sigmoid'))

# Compiling the CNN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Part 2 - Fitting the CNN to the images

from keras.preprocessing.image import ImageDataGenerator

train_datagen = ImageDataGenerator(rescale = 1./255,
                                   shear_range = 0.2,
                                   zoom_range = 0.2,
                                   horizontal_flip = True)

test_datagen = ImageDataGenerator(rescale = 1./255)

training_set = train_datagen.flow_from_directory('dataset/training_set',
                                                 target_size = (64, 64),
                                                 batch_size = 32,
                                                 class_mode = 'binary')

test_set = test_datagen.flow_from_directory('dataset/test_set',
                                            target_size = (64, 64),
                                            batch_size = 32,
                                            class_mode = 'binary')

classifier.fit_generator(training_set,
                         samples_per_epoch = 80,
                         nb_epoch = 1,
                         validation_data = test_set,
                         nb_val_samples = 20)



output_names = [node.op.name for node in classifier.outputs]
sess = tf.keras.backend.get_session()
frozen_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_names)    


tflite_model = tf.contrib.lite.toco_convert(frozen_def, [inputs], output_names)
with tf.gfile.GFile(tflite_graph, 'wb') as f:
    f.write(tflite_model)                     

在这一行:

frozen_def = tf.graph_util.convert_variables_to_constants(sess, sess.graph_def, output_names)

我有一个例外:

tensorflow.python.framework.errors_impl.FailedPreconditionError: Attempting to use uninitialized value conv2d_1/bias
[[Node: _retval_conv2d_1/bias_0_0 = _Retval[T=DT_FLOAT, index=0, _device="/job:localhost/replica:0/task:0/device:CPU:0"](conv2d_1/bias)]]

我是机器学习的初学者,而且完全不知道关于:-(

有人可以向我解释什么地方不对吗? 我所需要的只是处理了多个包含许多图片的文件夹,并可以预测新出现的图片与该文件夹的关系。 谢谢。

2 个答案:

答案 0 :(得分:0)

可以使用.tflite函数将keras模型直接转换为tf.lite.TFLiteConverter.from_session。将以下代码放在fit_generator之后以导出它(已使用tensorflow 1.3.1测试)

with tf.keras.backend.get_session() as sess:
    sess.run(tf.global_variables_initializer())    
    converter = tf.lite.TFLiteConverter.from_session(sess, model.inputs, model.outputs)
    tflite_model = converter.convert()
    with open("model.tflite", "wb") as f:
        f.write(tflite_model)   

答案 1 :(得分:0)

聚会晚了一点,但是您要这样做:

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()

来源:https://www.tensorflow.org/lite/convert/python_api