将keras模型导出到tfli

2024-04-20 04:26:54 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图结合这两个例子,为我的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)                     

在这条线上:

^{pr2}$

我有个例外:

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)]]

我是机器学习的初学者,完全不知道这个错误是关于什么的:-(

有人能给我解释一下怎么回事吗? 我只需要处理几个文件夹和许多图片,使它能够预测新来的图片与特定文件夹的关系。 谢谢您。在


Tags: thetofromtestimportaddoutputsize
2条回答

可以使用tf.lite.TFLiteConverter.from_session函数将keras模型直接转换为.tflite。将以下代码放在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)   

派对有点晚了,但你可以这样做:

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

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

相关问题 更多 >