36059


TensorFlowにおけるバリデーションの方法がわかりません．  
ここではIRISデータを学習することを考えます．

現在組んでいるプログラムは大まかに以下です．

[code]

    import tensorflow as tf
    
    labels = get_labels(dataset) #データ取得
    data = get_data(dataset) #ラベル取得
    
    train_data, test_data, valid_data = divide_data(data) #データ分割
    train_labels, test_labels, valid_labels = divide_labels(labels) #ラベル分割
    
    ph_data = tf.placeholder(tf.float32, shape=(None,4)) #データ用PlaceHolder
    ph_labels = tf.placeholder(tf.float32, shape=(None,3)) #ラベル用PlaceHolder
    
    #隠れ層のノード数
    node_num = 1024
    
    # 隠れ層定義
    w_hidden = tf.Variable(tf.truncated_normal([4,node_num]))
    b_hidden = tf.Variable(tf.zeros([node_num]))
    f_hidden = tf.matmul(X, w_hidden) + b_hidden
    hidden_layer = tf.nn.relu(f_hidden)
    
    # 出力層定義
    w_output = tf.Variable(tf.zeros([node_num,3]))
    b_output = tf.Variable(tf.zeros([3]))
    f_output = tf.matmul(hidden_layer, w_output) + b_output
    out = tf.nn.softmax(f_output)
    
    cross_entropy = t * tf.log(out) #交差エントロピー
    loss = -tf.reduce_mean(cross_entropy) #誤差関数
    optimizer = tf.train.AdamOptimizer() #最適化アルゴリズム
    train_step = optimizer.minimize(loss) #lossを最小化
    
    correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(ph_labels, 1)) #答え合わせ
    accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) #正解率
    
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
    
        i = 0
        for _ in range(2000):
            i += 1
            # トレーニング
            sess.run(train_step, feed_dict={ph_data:train_data,　ph_labels:train_labels})
            # 200ステップごとに精度を出力
            if i % 200 == 0:
                # コストと精度を出力
                train_loss, train_acc = sess.run([loss, accuracy], feed_dict={ph_data:test_data, ph_labels:test_labels})
                print("Step: %d" % i)
                print("[Train] cost: %f, acc: %f" % (train_loss, train_acc))
    
[/code]

私の認識では，  
`sess.run(train_step, feed_dict={...})`でトレーニングを行い，  
`train_data`内での精度を見て，パラメータ調整をおこなっている（？）のではと思っております．  
また同時に，`train_loss, train_acc =
sess.run(...)`は学習したモデルの損失と正解率を算出しているだけで，パラメータ調整には影響していないのかなと．

上記の場合，汎化能力や過学習への対応ができないため，「バリデーションを行うべき」と多く目にします．  
しかし，`valid_data`をどのように入力すれば`valid_data`によるパラメータ調整ができるのかがわかりません．

不勉強で申し訳ないですが，どうかお願いします．


CC BY-SA 3.0
2017-07-02T09:21:40.770
36033
2017-07-03T12:03:50.727
17197
question
python tensorflow 深層学習
TensorFlowにおけるバリデーション方法


train_dataのみで学習と精度の上昇具合を繰り返している状態ですと、  
train_data内でのデータに関してはもしかしたら100%の精度を保てるかもしれませんが、  
実際にはtrain_data以外のデータでも学習されたモデルで精度が確保される状態にする必要があります。

ここで質問者様がおっしゃられている「バリデーションを行うべき」とは  
「学習に使用したデータ以外でaccuracyを見てみるべき」という意味かと認識しました。

そちらに関してはすでに下記のコードでtrain_dataとは別のデータを使い精度を出していることである意味実現できていますし  
# コストと精度を出力  
train_loss, train_acc = sess.run([loss, accuracy],
feed_dict={ph_data:test_data, ph_labels:test_labels})

また、valid_dataというデータをすでに用意されているようですので  
学習完了後に上記test_dataと同じようにlossとaccuracyにvalid_dataをfeedとして与え、  
valid_dataを使用した時のlossとaccuracyを見ることで、学習時とは異なるデータでの精度をみます。(コード的にもtest_dataと同様なので割愛します)

> valid_dataによるパラメータ調整ができる

コメント欄にもありますがvalid_dataは「train_data以外でも適切な精度が出ているか」を検証するためのものなので  
パラメータ調整を自動で行ってくれるものではありません。

現在の所モデルの形やいわゆるハイパーパラメータを自動で行う仕組みはありません。

ただ、たとえば[GoogleCloudML](https://cloud.google.com/ml-engine/docs/how-tos/using-
hyperparameter-tuning)にはハイパーパラメータのチューニングを行ってくれる機能があります。  
しかしこれも「DeepLearningの仕組みとしてなんとか」しているのではなく、バッチ処理的に色々なハイパーパラメータで試している(物だと思っています。)

※過学習に対応したいのであればドロップアウトの層を入れる等のモデル変更を行い、  
ドロップアウト率を上記ハイパーパラメータのチューニングで対処する形になるかと思います。


CC BY-SA 3.0
2017-07-03T06:01:40.607
36059
2017-07-03T12:03:50.727
2017-07-03T12:03:50.727
19716
19716
36033
answer