模型代碼:
keep_prob = tf.placeholder(dtype=tf.float32, shape=[], name='keep_prob')
images = tf.placeholder(dtype=tf.float32, shape=[None, 64, 64, 1], name='image_batch')
labels = tf.placeholder(dtype=tf.int64, shape=[None], name='label_batch')
is_training = tf.placeholder(dtype=tf.bool, shape=[], name='train_flag')
with tf.device('/cpu:0'):
with slim.arg_scope([slim.conv2d, slim.fully_connected],
normalizer_fn=slim.batch_norm,
normalizer_params={'is_training': is_training}):
conv3_1 = slim.conv2d(images, 64, [3, 3], 1, padding='SAME', scope='conv3_1')
max_pool_1 = slim.max_pool2d(conv3_1, [2, 2], [2, 2], padding='SAME', scope='pool1')
conv3_2 = slim.conv2d(max_pool_1, 128, [3, 3], padding='SAME', scope='conv3_2')
max_pool_2 = slim.max_pool2d(conv3_2, [2, 2], [2, 2], padding='SAME', scope='pool2')
conv3_3 = slim.conv2d(max_pool_2, 256, [3, 3], padding='SAME', scope='conv3_3')
max_pool_3 = slim.max_pool2d(conv3_3, [2, 2], [2, 2], padding='SAME', scope='pool3')
conv3_4 = slim.conv2d(max_pool_3, 512, [3, 3], padding='SAME', scope='conv3_4')
conv3_5 = slim.conv2d(conv3_4, 512, [3, 3], padding='SAME', scope='conv3_5')
max_pool_4 = slim.max_pool2d(conv3_5, [2, 2], [2, 2], padding='SAME', scope='pool4')
flatten = slim.flatten(max_pool_4)
fc1 = slim.fully_connected(slim.dropout(flatten, keep_prob), 1024,
activation_fn=tf.nn.relu, scope='fc1')
logits = slim.fully_connected(slim.dropout(fc1, keep_prob), FLAGS.charset_size, activation_fn=None,
scope='fc2')
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=labels))
accuracy = tf.reduce_mean(tf.cast(tf.equal(tf.argmax(logits, 1), labels), tf.float32))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
if update_ops:
updates = tf.group(*update_ops)
loss = control_flow_ops.with_dependencies([updates], loss)
global_step = tf.get_variable("step", [], initializer=tf.constant_initializer(0.0), trainable=False)
optimizer = tf.train.AdamOptimizer(learning_rate=0.1)
train_op = slim.learning.create_train_op(loss, optimizer, global_step=global_step)
probabilities = tf.nn.softmax(logits)
tf.summary.scalar('loss', loss)
tf.summary.scalar('accuracy', accuracy)
merged_summary_op = tf.summary.merge_all()
predicted_val_top_k, predicted_index_top_k = tf.nn.top_k(probabilities, k=top_k)
accuracy_in_top_k = tf.reduce_mean(tf.cast(tf.nn.in_top_k(probabilities, labels, top_k), tf.float32))
生成pb檔案
output_node_names = "fc2/BatchNorm/Reshape_1"
saver = tf.train.import_meta_graph(input_checkpoint + '.meta', clear_devices=False)
with tf.Session() as sess:
saver.restore(sess, input_checkpoint) # 恢復圖并得到資料
output_graph_def = graph_util.convert_variables_to_constants( # 模型持久化,將變數值固定
sess=sess,
input_graph_def=sess.graph_def, # 等于:sess.graph_def
output_node_names=output_node_names.split(",")) # 如果有多個輸出節點,以逗號隔開
all_output_node_names = [n.name for n in output_graph_def.node]
print(str(all_output_node_names))
pb_file1 = './output_graph-7.pb'
with tf.gfile.GFile(pb_file1, "wb") as f: # 保存模型
f.write(output_graph_def.SerializeToString()) # 序列化輸出
生成tflite檔案:
def get_tflite_file(pb_file_path):
input_names = ["image_batch", "train_flag", "keep_prob"]
output_names = ["fc2/BatchNorm/Reshape_1"]
input_tensor = {"image_batch": [1, float(64), float(64), 1], "train_flag": [True], "keep_prob": [4]}
convert = tf.lite.TFLiteConverter.from_frozen_graph(pb_file_path, input_arrays=input_names, output_arrays=output_names,input_shapes=input_tensor)
convert.post_training_quantize = True
convert.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS]
convert.allow_custom_ops = True
convert.default_ranges_stats = (0, 255)
tflite_model = convert.convert()
open("../bak/output_graph-1.tflite", "wb").write(tflite_model)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/256055.html
上一篇:如何處理TypeError: 'type' object is not subscriptable
下一篇:求大佬指路小白。
