私はTensorflowでLSTM RNN分類モデルを訓練しました。チェックポイントを保存して復元して、モデルを再テストしてテストに使用しました。今では、Tensorflowサービングを使用して、モデルを本番環境で使用できるようにしたいと考えています。Tensorflow Servingを使用している場合、辞書を保存して単語をintにマップする方法は?
最初はコーパスを解析して辞書を作成し、文字列の単語を整数にマップするのに使用します。私は、この辞書をpickleファイルに保存します。このファイルは、チェックポイントを復元してデータセットを再学習するときや、モデルを使用してマッピングが一貫するように再ロードすることができます。 SavedModelBuilderを使用してモデルを保存するときに、この辞書を保存するにはどうすればよいですか?
ニューラルネットワークのコードは次のとおりです。モデルを保存するためのコードは、(私はコンテキストの全体構造の概要を含めています)終わりに向かっている:
...
# Read files and store them in variables
with open('./someReview.txt', 'r') as f:
reviews = f.read()
with open('./someLabels.txt', 'r') as f:
labels = f.read()
...
#Pre-processing functions
#Parse through dataset and create a vocabulary
vocab_to_int, reviews = RnnPreprocessing.map_vocab_to_int(reviews)
with open(pickle_path, 'wb') as handle:
pickle.dump(vocab_to_int, handle, protocol=pickle.HIGHEST_PROTOCOL)
#More preprocessing functions
...
# Building the graph
lstm_size = 256
lstm_layers = 2
batch_size = 1000
learning_rate = 0.01
n_words = len(vocab_to_int) + 1
# Create the graph object
tf.reset_default_graph()
with tf.name_scope('inputs'):
inputs_ = tf.placeholder(tf.int32, [None, None], name="inputs")
labels_ = tf.placeholder(tf.int32, [None, None], name="labels")
keep_prob = tf.placeholder(tf.float32, name="keep_prob")
#Create embedding layer LSTM cell, LSTM Layers
...
# Forward pass
with tf.name_scope("RNN_forward"):
outputs, final_state = tf.nn.dynamic_rnn(cell, embed, initial_state=initial_state)
# Output. We are only interested in the latest output of the lstm cell
with tf.name_scope('predictions'):
predictions = tf.contrib.layers.fully_connected(outputs[:, -1], 1, activation_fn=tf.sigmoid)
tf.summary.histogram('predictions', predictions)
#More functions for cost, accuracy, optimizer initialization
...
# Training
epochs = 1
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
iteration = 1
for e in range(epochs):
state = sess.run(initial_state)
for ii, (x, y) in enumerate(get_batches(train_x, train_y, batch_size), 1):
feed = {inputs_: x,
labels_: y[:, None],
keep_prob: 0.5,
initial_state: state}
summary, loss, state, _ = sess.run([merged, cost, final_state, optimizer], feed_dict=feed)
train_writer.add_summary(summary, iteration)
if iteration%1==0:
print("Epoch: {}/{}".format(e, epochs),
"Iteration: {}".format(iteration),
"Train loss: {:.3f}".format(loss))
if iteration%2==0:
val_acc = []
val_state = sess.run(cell.zero_state(batch_size, tf.float32))
for x, y in get_batches(val_x, val_y, batch_size):
feed = {inputs_: x,
labels_: y[:, None],
keep_prob: 1,
initial_state: val_state}
summary, batch_acc, val_state = sess.run([merged, accuracy, final_state], feed_dict=feed)
val_acc.append(batch_acc)
print("Val acc: {:.3f}".format(np.mean(val_acc)))
iteration +=1
test_writer.add_summary(summary, iteration)
#Saving the model
export_path = './SavedModel'
print ('Exporting trained model to %s'%(export_path))
builder = saved_model_builder.SavedModelBuilder(export_path)
# Build the signature_def_map.
classification_inputs = utils.build_tensor_info(inputs_)
classification_outputs_classes = utils.build_tensor_info(labels_)
classification_signature = signature_def_utils.build_signature_def(
inputs={signature_constants.CLASSIFY_INPUTS: classification_inputs},
outputs={
signature_constants.CLASSIFY_OUTPUT_CLASSES:
classification_outputs_classes,
},
method_name=signature_constants.CLASSIFY_METHOD_NAME)
legacy_init_op = tf.group(
tf.tables_initializer(), name='legacy_init_op')
#add the sigs to the servable
builder.add_meta_graph_and_variables(
sess, [tag_constants.SERVING],
signature_def_map={
signature_constants.DEFAULT_SERVING_SIGNATURE_DEF_KEY:
classification_signature
},
legacy_init_op=legacy_init_op)
print ("added meta graph and variables")
#save it!
builder.save()
print("model saved")
私だ、これはこのようなモデルを保存する正しい方法がある場合は、完全にわからないけどこれは私がドキュメンテーションとオンラインチュートリアルで見つけた唯一の実装です。
辞書を保存するための例や明示的なガイド、またはドキュメントのsavedModelを復元するときに辞書を使用する方法が見つかりませんでした。
チェックポイントを使用する場合、セッションを実行する前にpickleファイルをロードするだけです。辞書を使用して同じ単語をintマッピングに使用できるように、このsavedModelを復元するにはどうすればよいですか?モデルを保存したり読み込んだりする具体的な方法はありますか?
また、入力シグネチャの入力としてinputs_を追加しました。これは単語がマッピングされた後の一連のintegeresです。 AttributeError: 'str' object has no attribute 'dtype'
という文字列を入力として指定することはできません。そのような場合、実際に生産されているモデルの整数がどのように整数にマップされていますか?
それでも、何かが見つからない限り、入力内のすべての単語を整数にマッピングするときに参照できる語彙または語彙が必要です。この辞書はどこに保管しますか?あなたは詳細を教えていただけますか? – skbrhmn