2016-10-18 5 views
0

私は関数を持ち、各反復で精度(と他のメトリック)をとり、単純なCNNに学習率を与えるDetermineLearningRateと呼んでいます。外部機能による学習率の変更、多くのセッションを実行する必要がありますか?

ワークフロー

  1. シンプルCNN DetermineLearningRateは()の精度に取ると CNNのTensorFlowグラフが に学習率を取り、1回の反復を実行し、戻ってくる学習率
  2. を返します精度
  3. これは、すべての反復が終了するまで繰り返されます。

10,000回反復すると、実行して10,000セッションを終了する必要がありますか?これは、各反復で関数呼び出しを行わずに反復を続け、精度を得て学習率を返すことを望まないためです。

これは私が念頭に置いていたワークフローです:

  1. グローバル変数LRグラフが機能
  2. によって与えられたLRで
  3. 実行セッション1にアクセスすることを精度
  4. がセッションを閉じなさい
  5. セッション2を、関数によって与えられたLRで実行した後、 の精度
  6. accuを取得する
  7. 際どいは

セッションに

  • 繰り返しを閉じることができ、誰かのアドバイス?どうもありがとう。

  • 答えて

    0

    いいえ、学習率LR=tf.placeholder(tf.float32,[])のプレースホルダを作成し、トレーニングステップのfeed_dict引数として関数の値を使用するだけです。

    チュートリアル:私は、セッションを閉じられることはありません

    x=tf.placeholder([None,dim_x],tf.float32) 
    target=tf.placeholder([None,dim_target],tf.float32) 
    LR=tf.placeholder([],tf.float32) 
    #a list of operations on x to get y_pred 
    y_pred=... 
    #Your loss 
    loss=your_loss_function(y_pred,target) 
    acc=accuracy(y_pred,target) 
    #I am now passing the placeholder LR as a learning rate 
    train_step = tf.train.YourFavoriteOptimizer(LR).minimize(loss) 
    sess=tf.Session() 
    sess.run(tf.initialize_all_variables()) 
    for i in xrange(training_steps): 
        acc_arg=sess.run(acc,feed_dict={x: batch_x, target: batch_target}) 
        lr_val=DetermineLearningRate(acc_arg) 
        #lr is a scalar not a list 
        sess.run(train_step,feed_dict={x: batch_x, target: batch_target, LR: lr_val}) 
    

    お知らせ:

    ですから、これとあなたの学習率を計算する機能DetermineLearningRate()ようになりますグラフを定義しているとします。 これを行うための他のよりエレガントな方法がありますが、私の意見では、これは最も簡単です。
    あなたはLR=tf.div(1,acc)などのテンソルを使ってテンソルaccから得られたテンソルとしてLRを定義することができ、ses.run()を1回だけ呼び出すことができます。
    LRには訓練できない変数を使用し、関数の結果にはtf.assignを使用してください。

    編集:操作がTFで実行されないようにするには、別の操作が完了する前にtf.control_dependencies()を使用します。

    +0

    しかし、外部関数は、次の反復の開始時に学習率を与える前に、精度(最初の反復の終了)を最初に取得する必要があります。これは学習率として値リストを渡すだけですか?これがどのように機能するかのサンプルがありますか? – Ritchie

    +0

    それは役に立ちましたか? – jean

    +0

    これまでのご協力ありがとうございます。しかし、私が言及した問題は以下の通りです。 私の外部関数が前のバッチから精度を得てTFが次のバッチで使用するための学習率を返さない限り、反復は動かないはずです。 1000年におけるiに対する '' ' : 私の外部関数は、ループである LR = determineLearningRate(精度) 精度= someFunctionToGetAccuracyFromTF(LR) ' '' – Ritchie

    関連する問題