Tensorflowを使用して、それぞれの画像が256*256*1
で、データセットが等しく2つのクラスに分割されている700 images
のバイナリ分類画像データセットを訓練しています。我々はTensorflow
のCifar10
モデルをわずかに変更し、私たちのモデルのコードは以下の通りです。ニューラルネットワークを変更して検証セットの精度を向上させるにはどうすればよいですか?
# 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を使用しています。
現在、lossとvalidation accuracyはこのように見えます。最大精度は65%
と70%
の間でバウンスします。
精度を上げるにはどのようなパラメータを変更する必要がありますか?フィルタサイズを3に減らして2つのドロップアウトレイヤー(0.5)を追加しようとしましたが、何も変更されていないようです。
訓練データセットの180個の画像に対して検証を実行しました。それは確かに100%です...それは間違いなくオーバーフィットです。各クラスには350の画像があり、合計で2つのクラスがあります。各クラスに必要な最適な画像数はどれくらいですか?あなたの提案をありがとうございました!彼らは非常に有用です。 – taylorm
これは言うのは簡単ではありません。クラスがより良くなればなるほど、通常は数千人が良いでしょう。ほとんどの場合、各画像に「水平反転」、「ランダム作物」または「カラージッタリング」などのデータ拡張操作を適用することで、トレーニング画像の数を非常に簡単に増やすことができます。あなたのデータセット上で実行して、それを増強することができる非常に便利な事前実装されたスクリプトがいくつかあります。実際にトレーニングを受ける前に、LMDBやHD5データベースに保存しておくことで、素早くアクセスできます。 –