2017-04-16 27 views
0

を上げるこんにちは、私は私の問題で微調整にVGGをしようとしているが、私はこのエラーを取得し、ネットを養成しようとします。形状テンソルを割り当てるとき微調整VGGは、メモリエラー

OOMは[25088,4096】ネットがこの構造を有する

enter image description here

を私はこのsiteからこのtensorflow pretrained VGG実装codeを取ります。

私はネットを訓練するために、この手順を追加します。

with tf.name_scope('joint_loss'): 
    joint_loss = ya_loss+yb_loss+yc_loss+yd_loss+ye_loss+yf_loss+yg_loss+yh_loss+yi_loss+yl_loss+ym_loss+yn_loss 

    # Loss with weight decay 
    l2_loss = tf.add_n([tf.nn.l2_loss(v) for v in tf.trainable_variables()]) 
    self.joint_loss = joint_loss + self.weights_decay * l2_loss 
    self.optimizer = tf.train.AdamOptimizer(learning_rate=self.learning_rate).minimize(joint_loss) 

私はバッチサイズ私は同じエラーを取得 2にではなく、作品を軽減しようとします。このエラーは、テンソルがメモリに割り当てられないために発生します。私はネットワークを最小限にすることなく値を与えれば、列車の場合のみこのエラーが発生します。どのように私はこのエラーを回避することができますか?どのように私は、グラフィックカード(のNvidiaのGeForce GTX 970)のメモリを節約することができますか?

UPDATE:私はトレーニングプロセスの開始GradientDescentOptimizerを使用している場合、私はAdamOptimizerを使用する場合は代わりに私は、メモリエラーを取得し、GradientDescentOptimizerが少ないメモリを使用しているようです。復路なし

答えて

1

(「最小化せずに値をフィード」)、TensorFlowは直ちに中間アクティベーションをデ割り当てることができます。逆方向パスでは、グラフは巨大なU字型をしています。ここで、順方向パスからのアクティベーションは、逆方向パスのためにメモリ内に保持する必要があります。そこ(例えばswapping to host memoryなど)いくつかのトリックがありますが、一般的なバックプロパゲーションでメモリ使用量が高くなることを意味します。

アダムは、それはあなたの体重の変数がすでに使用しているメモリの量に比例してメモリ使用量が増加しますので、周りにいくつかの余分な簿記変数を保持しません。あなたのトレーニングの手順は(この場合、GPU上の変数の更新を持つことは重要ではありません)かなりの時間がかかる場合は、代わりにホストメモリ内の最適化OPSを見つけることができます。

大きなバッチサイズが必要で、画像の解像度やモデルサイズを縮小できない場合は、SyncReplicasOptimizerなどを使用して複数のワーカー/ GPUのグラデーションを組み合わせるとよいでしょう。このモデルに関連する論文を見ると、それぞれが12GBのメモリを搭載した4つのGPUでトレーニングを受けているように見えます。

関連する問題