1

Tensorflowを使用して、それぞれの画像が256*256*1で、データセットが等しく2つのクラスに分割されている700 imagesのバイナリ分類画像データセットを訓練しています。我々はTensorflowCifar10モデルをわずかに変更し、私たちのモデルのコードは以下の通りです。ニューラルネットワークを変更して検証セットの精度を向上させるにはどうすればよいですか?

# conv1 
with tf.variable_scope('conv1') as scope: 
    kernel = _variable_with_weight_decay('weights', 
            shape=[5, 5, 1, 256], 
            stddev=5e-2, 
            wd=0.0) 
    conv = tf.nn.conv2d(images, kernel, [1, 1, 1, 1], padding='SAME') 
    biases = _variable_on_cpu('biases', [256], tf.constant_initializer(0.0)) 
    pre_activation = tf.nn.bias_add(conv, biases) 
    conv1 = tf.nn.relu(pre_activation, name=scope.name) 
    _activation_summary(conv1) 

# pool1 
pool1 = tf.nn.max_pool(conv1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], 
        padding='SAME', name='pool1') 
# norm1 
norm1 = tf.nn.lrn(pool1, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, 
       name='norm1') 

# conv2 
with tf.variable_scope('conv2') as scope: 
    kernel = _variable_with_weight_decay('weights', 
            shape=[5, 5, 256, 256], 
            stddev=5e-2, 
            wd=0.0) 
    conv = tf.nn.conv2d(norm1, kernel, [1, 1, 1, 1], padding='SAME') 
    biases = _variable_on_cpu('biases', [256], tf.constant_initializer(0.1)) 
    pre_activation = tf.nn.bias_add(conv, biases) 
    conv2 = tf.nn.relu(pre_activation, name=scope.name) 
    _activation_summary(conv2) 

# norm2 
norm2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001/9.0, beta=0.75, 
       name='norm2') 
# pool2 
pool2 = tf.nn.max_pool(norm2, ksize=[1, 3, 3, 1], 
        strides=[1, 2, 2, 1], padding='SAME', name='pool2') 

# local3 
with tf.variable_scope('local3') as scope: 
    reshape = tf.reshape(pool2, [FLAGS.batch_size, -1]) 
    dim = reshape.get_shape()[1].value 
    weights = _variable_with_weight_decay('weights', shape=[dim, 384], 
             stddev=0.04, wd=0.004) 
    biases = _variable_on_cpu('biases', [384], tf.constant_initializer(0.1)) 

    local3 = tf.nn.relu(tf.matmul(reshape, weights) + biases, name=scope.name) 
    _activation_summary(local3) 

# local4 
with tf.variable_scope('local4') as scope: 
    weights = _variable_with_weight_decay('weights', shape=[384, 192], 
             stddev=0.04, wd=0.004) 
    biases = _variable_on_cpu('biases', [192], tf.constant_initializer(0.1)) 
    local4 = tf.nn.relu(tf.matmul(local3, weights) + biases, name=scope.name) 
    _activation_summary(local4) 

with tf.variable_scope('softmax_linear') as scope: 
    weights = _variable_with_weight_decay('weights', [192, NUM_CLASSES], 
             stddev=1/192.0, wd=0.0) 
    biases = _variable_on_cpu('biases', [NUM_CLASSES], 
          tf.constant_initializer(0.0)) 
    softmax_linear = tf.add(tf.matmul(local4, weights), biases, name=scope.name) 
    _activation_summary(softmax_linear) 

は、我々はバッチサイズ= 2学習率= 0.005を使用しています。

現在、lossvalidation accuracyはこのように見えます。最大精度は65%70%の間でバウンスします。

精度を上げるにはどのようなパラメータを変更する必要がありますか?フィルタサイズを3に減らして2つのドロップアウトレイヤー(0.5)を追加しようとしましたが、何も変更されていないようです。

答えて

0

あなたのモデルはトレーニングデータのoverfittingのようです。つまり、あなたのモデルはデータの基本概念を実際に学習するという点では一般化していませんが、単に700のトレーニング画像を記憶するだけです。あなたのトレーニングデータの精度プロットを見ることは役に立ちます。これは90%〜98%の範囲のどこかにあると思います。あなたの損失関数は非常に急激な減少を示していますが、あなたの検証セットの精度は約65%です。これはオーバーフィットモデルの強力な指標です。

いくつかのオプションがあります。まず第一に、わずか700画像のトレーニングセットはほとんどの場合、ネットワークがかなり速くデータを暗記する原因となります。より多くの訓練データを収集するか、または訓練データにデータ補強を適用して、訓練画像の総数を増やしてください。これにより、ネットワークがすべての単一画像とその正しいラベルを記憶することが難しくなります。

さらに、あなたは、このようなネットワークはデータ上にも一般化するのに役立ち、あなたのモデルに減衰(L1、L2ノルム)またはDropoutを量るようregularization operationslecture slides)を適用する必要があります。

+0

訓練データセットの180個の画像に対して検証を実行しました。それは確かに100%です...それは間違いなくオーバーフィットです。各クラスには350の画像があり、合計で2つのクラスがあります。各クラスに必要な最適な画像数はどれくらいですか?あなたの提案をありがとうございました!彼らは非常に有用です。 – taylorm

+0

これは言うのは簡単ではありません。クラスがより良くなればなるほど、通常は数千人が良いでしょう。ほとんどの場合、各画像に「水平反転」、「ランダム作物」または「カラージッタリング」などのデータ拡張操作を適用することで、トレーニング画像の数を非常に簡単に増やすことができます。あなたのデータセット上で実行して、それを増強することができる非常に便利な事前実装されたスクリプトがいくつかあります。実際にトレーニングを受ける前に、LMDBやHD5データベースに保存しておくことで、素早くアクセスできます。 –

関連する問題