tenssorflowの訓練を解決する時メモリは持続的に増加していっぱいの問題を占めます。
2136 ワード
白のテナントを記録して勉強しています。同じ悩みを持っているシロにも経験を残しています。
まず私の間違いと解決の過程を言います。スタイル移行実験をする時、プリロード重みを使用したVG 19ネットワークは中間層を抽出している結果、コードが正しくないため、画像を巡回して抽出する時にメモリが持続的に増加し、数十枚の画像を抽出する特徴メモリが満杯になる。
なぜなら、各画像の順方向伝播が終了したら、中間情報を残しているからです。具体的には、順方向に伝播するコードとモデルのコードを分離し、画像を巡回するたびに順方向に伝播し、テナントflowに多くの計算ノード(tf.matmulなど)が新たに増加し、メモリに大量の期限切れ情報が残されている。
修正のやり方は一つの前提です。循環訓練画像の場合、tfを使ってリソースを計算することを避けます。
placceholderを入力データの入口として用い,順方向伝搬を含む使用する関数をモデルに定義した。画像を巡回する時は、tf計算を追加しないでください。
このような問題があったら、必ず後でコードを確認します。特に他の人が書いたコードをもとに修正します。多くのソースコードを公開学習します。
エラーの例:
以上、テナントflowのトレーニングをしている間にメモリが増え続け、いっぱいになっている問題は、小編集が皆さんに共有している内容の全部です。参考にしてもらいたいです。よろしくお願いします。
まず私の間違いと解決の過程を言います。スタイル移行実験をする時、プリロード重みを使用したVG 19ネットワークは中間層を抽出している結果、コードが正しくないため、画像を巡回して抽出する時にメモリが持続的に増加し、数十枚の画像を抽出する特徴メモリが満杯になる。
なぜなら、各画像の順方向伝播が終了したら、中間情報を残しているからです。具体的には、順方向に伝播するコードとモデルのコードを分離し、画像を巡回するたびに順方向に伝播し、テナントflowに多くの計算ノード(tf.matmulなど)が新たに増加し、メモリに大量の期限切れ情報が残されている。
修正のやり方は一つの前提です。循環訓練画像の場合、tfを使ってリソースを計算することを避けます。
placceholderを入力データの入口として用い,順方向伝搬を含む使用する関数をモデルに定義した。画像を巡回する時は、tf計算を追加しないでください。
このような問題があったら、必ず後でコードを確認します。特に他の人が書いたコードをもとに修正します。多くのソースコードを公開学習します。
エラーの例:
def build_model(model_path):
model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS])
vec1 = ...
......
return model_input,vec1
def get_style_represent(vec):
# tf
return new_vec
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
img_input,vec1 = build_model(VGG19_MODEL) #
for cur_img_path in imgs_path_list: #
cur_img = load_image(cur_img_path)
vec1_out = sess.run(vec1, feed_dict = {img_input:cur_img}) # vec1
# vec1 , tensorflow ,
new_vec = get_style_represent(vec1_out)
正しい例:
def build_model(model_path):
model_input = tf.placeholder('float32', [1, IMAGE_HEIGHT, IMAGE_WIDTH, COLOR_CHANNELS])
vec1 = ...
......
new_vec = ... # get_style_represent
return model_input,vec1,new_vec
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
img_input,vec1,new_vec = build_model(VGG19_MODEL)
for cur_img_path in imgs_path_list:
cur_img = load_image(cur_img_path)
# vec1 ,
vec1_out,new_vec_out = sess.run([vec1,new_vec], feed_dict = {img_input:cur_img})
だから、もしあなたも同じ問題に遭遇したら、反復中に新しいtf計算ノードを追加的に使ったのではないかを確認してください。以上、テナントflowのトレーニングをしている間にメモリが増え続け、いっぱいになっている問題は、小編集が皆さんに共有している内容の全部です。参考にしてもらいたいです。よろしくお願いします。