このトピックでは、TensorFlowに関するFAQについて説明します。
内容
複数のPythonファイルを参照するにはどうすればよいですか?
Pythonファイルを使用して、トレーニングスクリプトを整理できます。 まず、データ前処理ロジックをPythonファイルに格納します。 次に、別のPythonファイルでモデルを定義します。 最後に、1つのPythonファイルを使用して、トレーニングプロセス全体を通してデータをトレーニングします。 たとえば、test1.pyファイルで関数を定義できます。 test2.pyファイルがtest1.pyファイルで提供されている関数を使用する必要があり、test2.pyファイルがプログラムエントリとして機能する場合は、test1.pyファイルとtest2.pyファイルをtar.gzパッケージに追加してパッケージをアップロードするだけです。 アップロードパラメーターを次の図に示します。 
Pythonコードファイル: tar.gzパッケージ。
Primary Python File: プログラム入力ファイル。
OSSにデータをアップロードするにはどうすればよいですか?
OSSにデータをアップロードする前に、深層学習アルゴリズムのデータを保存するOSSバケットを作成する必要があります。 深層学習に使用するGPUクラスターと同じリージョンにOSSバケットを作成することを推奨します。 これにより、アルゴリズムによって生成されたトラフィックが無料のAlibaba Cloudのクラシックネットワークでデータを送信できます。 OSSバケットを作成した後、OSSコンソールでフォルダーの作成、データディレクトリの整理、データのアップロードを行うことができます。
OSSにデータをアップロードするには、API操作を呼び出すか、SDKを使用します。 詳細は、「簡易アップロード (Simple upload)」をご参照ください。 さらに、OSSには、データのアップロードとダウンロードを容易にするための多数のツールが用意されています。 詳細は、「OSSツール」をご参照ください。 ファイルのアップロードとダウンロードには、ossutilまたはosscmdを使用することを推奨します。
これらのツールを使用してファイルをアップロードする場合、AccessKey IDとAccessKeyシークレットを設定する必要があります。 Alibaba Cloud管理コンソールにログインして、AccessKey IDとAccessKeyシークレットを作成または表示できます。
OSSからデータを読み取るにはどうすればよいですか?
Pythonコードを実行してOSSからデータを読み取ることはできません。 Python Open() やos.path.exist() などの関数を呼び出してファイルやフォルダーを操作するコードはすべて実行できません。 たとえば、scipy.misc.imread() およびnumpy.load() を呼び出すコードは実行できません。
次の方法を使用して、PAIでデータを読み取ることができます。
tf.gfileモジュールの関数を使用して、画像またはテキストを読み取ります。 次のサンプル関数がサポートされています。
tf.gfile.Copy(oldpath, newpath, overwrite=False) # Copies a file. tf.gfile.DeleteRecursively(dirname) # Recursively deletes all files in a directory. tf.gfile.Exists(filename) # Checks whether a file exists. tf.gfile.FastGFile(name, mode='r') # Reads a file in non-blocking mode. tf.gfile.GFile(name, mode='r') # Reads a file. tf.gfile.Glob(filename) # Queries all files in a directory. You can filter these files by pattern. tf.gfile.IsDirectory(dirname) # Checks whether an item is a directory. tf.gfile.ListDirectory(dirname) # Queries all files in a directory. tf.gfile.MakeDirs(dirname) # Creates a folder in a directory. If no parent directories exist, a parent directory is automatically created. If the folder you want to create already exists and is writable, a success response is returned. tf.gfile.MkDir(dirname) # Creates a folder in a directory. tf.gfile.Remove(filename) # Deletes a file. tf.gfile.Rename(oldname, newname, overwrite=False) # Renames a file. tf.gfile.Stat(dirname) # Queries statistical data about a directory. tf.gfile.Walk(top, inOrder=True) # Queries the file tree of a directory.tf.gfile.Glob、tf.gfile.FastGFile、tf.WhoFileReader()、およびtf.train.shuffer_batch()関数を使用してファイルをバッチ読み取りします。 ファイルをバッチ読み取りする前に、ファイルのリストを取得してバッチを作成する必要があります。
Machine learning Studioページで深層学習実験を作成する場合は、読み取りたいコードファイルやページの右側にあるディレクトリなどのパラメーターを指定する必要があります。 tf.flagsモジュールの関数は、-XXX形式のパラメータを渡すことができます。ここで、XXXは文字列を表します。
import tensorflow as tf
FLAGS = tf.flags.FLAGS
tf.flags.DEFINE_string('buckets', 'oss://{OSS Bucket}/', 'Folder of the training image file')
tf.flags.DEFINE_string('batch_size', '15', 'Size of the batch')
files = tf.gfile.Glob(os.path.join(FLAGS.buckets,'*.jpg')) # Queries the paths of all JPG files in buckets.ファイル数に応じて, 次の方法でファイルを一括読み込みすることを推奨します。
tf.gfile.FastGfile()関数を使用して、少数のファイルを一括読み取ります。for path in files: file_content = tf.gfile.FastGFile(path, 'rb').read() # Remember to specify rb when you call this function. Otherwise, errors may occur. image = tf.image.decode_jpeg(file_content, channels=3) # In this example, JPG images are used.tf.WhoFileReader()関数を使用して、大量のファイルをバッチで読み取ります。reader = tf.WholeFileReader() # Instantiates a reader. fileQueue = tf.train.string_input_producer(files) # Creates a queue for the reader to read. file_name, file_content = reader.read(fileQueue) # Uses the reader to read a file from the queue. image_content = tf.image.decode_jpeg(file_content, channels=3) # Decodes the file content into images. label = XXX # In this example, label processing operations are omitted. batch = tf.train.shuffle_batch([label, image_content], batch_size=FLAGS.batch_size, num_threads=4, capacity=1000 + 3 * FLAGS.batch_size, min_after_dequeue=1000) sess = tf.Session() # Creates a session. tf.train.start_queue_runners(sess=sess) # Starts the queue. If this command is not executed, the thread keeps blocked. labels, images = sess.run(batch) # Obtains the result.次に、コードについて説明します。
tf.train.string_input_producer: ファイルをキューに変換します。 キューを開始するには、tf.train.start_queue_runners構文を使用する必要があります。tf.train.shuffle_batchには、次のパラメーターが含まれます。batch_size: バッチタスクを実行した後に毎回返されるデータの量。
num_threads: 実行するスレッドの数。 値は通常4に設定されます。
capacity: ランダムにデータを抽出するデータの数。 例えば、データセットが10,000個のデータを有すると仮定する。 トレーニングする5,000のデータからランダムにデータを抽出する場合は、容量を5000に設定します。
min_after_dequeue: 維持するキューの最小長さ。 値はcapacityの値以下でなければなりません。
OSSにデータを書き込むにはどうすればよいですか?
次のいずれかの方法を使用してOSSにデータを書き込むことができます (生成されたファイルは /model/example.txtディレクトリに保存されます) 。
tf.gfile.FastGFile()関数を使用してファイルを書き込みます。 次のコードは、サンプル関数を示しています。tf.gfile.FastGFile(FLAGS.checkpointDir + 'example.txt', 'wb').write('hello world')tf.gfile.Copy()関数を使用してファイルをコピーします。 次のコードは、サンプル関数を示しています。tf.gfile.Copy('./example.txt', FLAGS.checkpointDir + 'example.txt')
OOMエラーが発生するのはなぜですか?
メモリ使用量が最大30 GBに達したため、メモリ不足 (OOM) エラーが発生します。 gfile関数を使用してOSSからデータを読み取ることを推奨します。 詳細については、このトピックの「OSSからデータを読み取る方法」をご参照ください。
TensorFlowのどのようなユースケースが利用可能ですか?
TensorFlowを使用して画像を分類します。 詳細については、「PAI-TensorFlowを使用した画像分類モデルの構築」および「CIFAR-10データセット」をご参照ください。
TensorFlowを使用して曲を書きます。 詳細については、「Lyric writing」をご参照ください。
2つのGPUが設定されている場合のmodel_average_iter_intervalの役割は何ですか?
model_average_iter_intervalパラメーターが設定されていない場合、GPUで並列確率勾配降下 (SGD) アルゴリズムが使用され、反復ごとに勾配が更新されます。 model_average_iter_intervalパラメーターが1より大きい場合、指定した反復間隔でデータを複数回トレーニングした後、モデル平均法を使用して2つの平均モデルパラメーターを計算します。 model_average_iter_intervalパラメーターは、トレーニング回数を指定します。
TensorFlowモデルをSavedModel形式でエクスポートしますか?
SavedModel形式
Machine Learning Platform for AI (PAI) のElastic Algorithm Service (EAS) に組み込まれた公式プロセッサを使用してTensorFlowモデルサービスをオンラインで展開する前に、モデルをSavedModel形式でエクスポートする必要があります。 SavedModel形式は、TensorFlowによって定義および推奨されています。 SavedModel形式では、次のディレクトリ構造が使用されます。
assets/
variables/
variables.data-00000-of-00001
variables.index
saved_model.pb|saved_model.pbtxtディレクトリ構造には、次のディレクトリが含まれます。
assetsディレクトリはオプションです。 予測サービスのサポートファイルを格納します。variablesディレクトリには、tf.train.Saverメソッドを呼び出して保存した変数が格納されます。saved_model.pbまたはsaved_model.pbtxtディレクトリには、MetaGraphDefとSignatureDefが格納されます。 MetaGraphDefはモデルトレーニングロジックを格納し、SignatureDefはモデルサービスの入力と出力を指定します。
SavedModel形式でモデルをエクスポート
TensorFlowを使用してSavedModel形式でモデルをエクスポートする方法の詳細については、「保存と復元」をご参照ください。 モデルが単純な場合は、次の方法を使用してSavedModel形式でエクスポートできます。
tf.saved_model.simple_save(
session,
"./savedmodel/",
inputs={"image": x}, ## x specifies the input variables of the model.
outputs={"scores": y} ## y specifies the output variables of the model.
)オンライン予測サービスを呼び出すときは、リクエストのモデルにsignature_nameパラメーターを設定する必要があります。 simple_save() メソッドを呼び出してモデルをエクスポートする場合、signature_nameパラメーターのデフォルト値はserving_defaultです。
モデルが複雑な場合は、次のサンプルコードに示すように、SavedModel形式で手動でエクスポートできます。
print('Exporting trained model to', export_path)
builder = tf.saved_model.builder.SavedModelBuilder(export_path)
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
prediction_signature = (
tf.saved_model.signature_def_utils.build_signature_def(
inputs={'images': tensor_info_x},
outputs={'scores': tensor_info_y},
method_name=tf.saved_model.signature_constants.PREDICT_METHOD_NAME)
)
legacy_init_op = tf.group(tf.tables_initializer(), name='legacy_init_op')
builder.add_meta_graph_and_variables(
sess, [tf.saved_model.tag_constants.SERVING],
signature_def_map={
'predict_images': prediction_signature,
},
legacy_init_op=legacy_init_op
)
builder.save()
print('Done exporting!')次のパラメータの説明に注意してください。
export_pathパラメーターは、モデルのエクスポート先のパスを指定します。prediction_signatureパラメーターは、モデルの入力と出力を指定するSignatureDefを示します。 詳細については、SignatureDefをご参照ください。 この例では、signature_nameパラメーターはpredict_imagesに設定されています。builder.add_meta_graph_and_variablesメソッドは、モデルをエクスポートするためのパラメーターを指定します。
予測に必要なモデルをエクスポートする場合、エクスポートするモデルのタグとしてtf.saved_model.tag_constants.SERVINGを指定する必要があります。
TensorFlowモデルの詳細については、TensorFlow SavedModelをご参照ください。
KerasモデルをSavedModel形式に変換
Kerasのmodel.save() メソッドを呼び出して、KerasモデルをH5形式に変換できます。 ただし、Kerasモデルは、オンライン予測のためにSavedModel形式に変換する必要があります。 形式変換を実装するには、次のサンプルコードに示すように、load_model() メソッドを呼び出してH5モデルをロードし、SavedModel形式でエクスポートします。
import tensorflow as tf
with tf.device("/cpu:0"):
model = tf.keras.models.load_model('./mnist.h5')
tf.saved_model.simple_save(
tf.keras.backend.get_session(),
"./h5_savedmodel/",
inputs={"image": model.input},
outputs={"scores": model.output}
)チェックポイントモデルをSavedModel形式に変換
モデルのトレーニング中にtf.train.Saver() メソッドを呼び出すと、モデルはチェックポイント形式で保存されます。 オンライン予測のためにSavedModel形式に変換する必要があります。 次のサンプルコードに示すように、saver.restore() メソッドを呼び出してチェックポイントモデルをtf.Sessionとして読み込み、モデルをSavedModel形式でエクスポートできます。
import tensorflow as tf
# variable define ...
saver = tf.train.Saver()
with tf.Session() as sess:
# Initialize v1 since the saver will not.
saver.restore(sess, "./lr_model/model.ckpt")
tensor_info_x = tf.saved_model.utils.build_tensor_info(x)
tensor_info_y = tf.saved_model.utils.build_tensor_info(y)
tf.saved_model.simple_save(
sess,
"./savedmodel/",
inputs={"image": tensor_info_x},
outputs={"scores": tensor_info_y}
)