1

Kaggle でDogs vs. Cats Redux: Kernels Editionの問題を解決しようとしていました。単純な画像分類問題です。ただし、スコアが 17+ のランダム予測子よりも悪い結果になっています。これがなぜなのか誰か知っていますか?

ニューラル ネットワーク モデル

def convolutional_neural_network():
    weights = {
        # 3x3x3 conv => 1x1x8
        'conv1': tf.Variable(tf.random_normal([3, 3, 3, 8])),
        # 5x5x8 conv => 1x1x16
        'conv2': tf.Variable(tf.random_normal([5, 5, 8, 16])),
        # 3x3x16 conv => 1x1x32
        'conv3': tf.Variable(tf.random_normal([3, 3, 16, 32])),
        # 32 FC => output_features
        'out': tf.Variable(tf.random_normal([(SIZE//16)*(SIZE//16)*32, output_features]))
    }

    biases = {
        'conv1': tf.Variable(tf.random_normal([8])),
        'conv2': tf.Variable(tf.random_normal([16])),
        'conv3': tf.Variable(tf.random_normal([32])),
        'out': tf.Variable(tf.random_normal([output_features]))
    }
    conv1 = tf.add(conv2d(input_placeholder, weights['conv1'], 1), biases['conv1'])
    relu1 = relu(conv1)
    pool1 = maxpool2d(relu1, 4)

    conv2 = tf.add(conv2d(pool1, weights['conv2'], 1), biases['conv2'])
    relu2 = relu(conv2)
    pool2 = maxpool2d(relu2, 2)

    conv3 = tf.add(conv2d(pool2, weights['conv3'], 1), biases['conv3'])
    relu3 = relu(conv3)
    pool3 = maxpool2d(relu3, 2)

    pool3 = tf.reshape(pool3 , shape=[-1, (SIZE//16)*(SIZE//16)*32])

    output = tf.add(tf.matmul(pool3, weights['out']), biases['out'])
    return output

出力には活性化機能はありません。

予測、オプティマイザー、損失関数

output_prediction = convolutional_neural_network()
loss = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(output_prediction, output_placeholder) )
trainer = tf.train.AdamOptimizer()
optimizer = trainer.minimize(loss)
test_prediction = tf.nn.softmax(output_prediction)

画像はサイズ128 x 128 x 3の numpy 配列に変換され、64 のバッチ サイズでニューラル ネットワークに供給されます。

完全なコードはこちら

編集: 200 エポックに対して同じコードを実行しました。改善なし。私は少し悪いことをしました。

4

2 に答える 2

3

これはコメントのようなものですが、そのための十分な特権ポイントではありません:

データを正規化しましたか (つまり、ピクセル値を 255 で割りましたか)? スクリプトでそれを行うことはわかりません。

17 logloss のようなひどい結果が得られた場合、それはモデルが常に 100% の信頼度で 1 つのクラスを予測していることを意味します。通常、この場合、アーキテクチャや学習率やエポック数ではなく、正規化を忘れたり、ラベルを混同したりするなどのばかげた間違いが原因です。この特定の問題について、アーキテクチャを考えると、エポック数 40 以内で約 80% の精度と 0.4 の対数損失が見られるはずです。何千ものエポックは必要ありません:)

于 2017-01-11T23:56:30.357 に答える
1

精度を向上させることは、1 つのタスク ソリューションよりも芸術です。次の方法のいくつかを試すことができます。

  • 別の勾配最適化、SGD、モメンタム、ネストロフ、adap などを試してください。
  • 適応学習率を試す
  • 正規化方法の改善 L1、L2、dropout、drop connect、...
  • トレーニング データを増やします (データを増やします)。
  • ネットワーク ハイパー パラメータを変更する
  • 最後に、ネットワーク構造の変更に何も役立たなかった場合。
于 2016-12-31T14:20:03.780 に答える