2017-08-03 1 views
-1

これは私のコードです。 ReLuとELuの組み合わせと、カーネルとアクティビティの多くの正則化を組み合わせて、VGG 11層ネットワークを構築しようとしました。結果は本当に混乱しています:コードは10エポックです。列車と貨物両方での私の損失は2000年から1.5に減少しましたが、列車と貨物両方の私の損は同じまま50%でした。誰かが私に説明することはできますか?テーラーのケラス:ロスは減少しますが、精度は変化しません。

# VGG 11 
from keras.regularizers import l2 
from keras.layers.advanced_activations import ELU 
from keras.optimizers import Adam 
model = Sequential() 

model.add(Conv2D(64, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      input_shape=(1, 96, 96), activation='relu')) 
model.add(Conv2D(64, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(128, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001),activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(Conv2D(128, (3, 3), kernel_initializer='he_normal',  
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(256, (3, 3), kernel_initializer='he_normal',  
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(Conv2D(256, (3, 3), kernel_initializer='he_normal',  
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

model.add(Conv2D(512, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(Conv2D(512, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001), 
      activation='relu')) 
model.add(Conv2D(512, (3, 3), kernel_initializer='he_normal', 
      kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.0001),  
      activation='relu')) 
model.add(MaxPooling2D(pool_size=(2, 2))) 

# convert convolutional filters to flat so they can be feed to fully connected layers 
model.add(Flatten()) 

model.add(Dense(2048, kernel_initializer='he_normal', 
       kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.01))) 
model.add(ELU(alpha=1.0)) 
model.add(Dropout(0.5)) 

model.add(Dense(1024, kernel_initializer='he_normal', 
       kernel_regularizer=l2(0.0001), activity_regularizer=l2(0.01))) 
model.add(ELU(alpha=1.0)) 
model.add(Dropout(0.5)) 

model.add(Dense(2)) 
model.add(Activation('softmax')) 

adammo = Adam(lr=0.0008, beta_1=0.9, beta_2=0.999, epsilon=1e-08, decay=0.0) 
model.compile(loss='categorical_crossentropy', optimizer=adammo, metrics=['accuracy']) 
hist = model.fit(X_train, y_train, batch_size=48, epochs=20, verbose=1, validation_data=(X_val, y_val)) 
+0

あまりにも多くの正則化を使用しています – Nain

+0

ありがとうございました。なぜaccが増加していないのか理論的な理由を説明できますか?あまりにも多くの正則化が損失を最小限に抑えることを確かに知っています。 – Estellad

+0

@Estelladコメントを追加して、なぜ私が与えた答えに投票したのですか?あなたがこのネットワークの理論的な好みを持っているという理由だけで、あなたの初期設定、ELU、あなたが任意に選択したアクティベーション機能は、それが正しいことを意味するものではありません。これは一般的ではありません。だから私はまったく異なる構造を提案した。 – modesitt

答えて

-1

これは実際には完全に可能です。

カテゴリcross entropy lossは、精度が低下するのを防ぐために、精度を上げる必要はありません。これはkerasやtheanoのバグではなく、むしろネットワークやデータの問題です。

このネットワーク構造は、おそらくあなたがしようとしているものに対して過度に複雑です。正規化の一部を削除し、ReLuのみを使用し、レイヤーを減らし、標準のadamオプティマイザ、より大きなバッチなどを使用する必要があります。まず、ケラール 'default models VGG16のようなものを使用してください。

別のVGG11のような構造のためにそれを編集する。それはここにあります:

def VGG_16(weights_path=None): 
    model = Sequential() 
    model.add(ZeroPadding2D((1,1),input_shape=(3,224,224))) 
    model.add(Convolution2D(64, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(64, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(128, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(256, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(ZeroPadding2D((1,1))) 
    model.add(Convolution2D(512, 3, 3, activation='relu')) 
    model.add(MaxPooling2D((2,2), strides=(2,2))) 

    model.add(Flatten()) 
    model.add(Dense(4096, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(4096, activation='relu')) 
    model.add(Dropout(0.5)) 
    model.add(Dense(1000, activation='softmax')) 

    if weights_path: 
     model.load_weights(weights_path) 

    return model 

これはずっと簡単です。それは、正当化、異なる畳み込み構造などを持っていない、唯一のrely(最近普及している)を使用します。あなたのニーズにそれを修正してください!

+0

あなたの提案、Nucl3icありがとう!私は標準的なVGG16を試しましたが、より少ないフィルターで、64-128-256-512-> 16-32-64-128となりました。パフォーマンスは改善されておらず、LeNet 5と同じでした。だから理論的には最高の私自身のネットワークを構築しようとするべきだと思った。私はモデルを単純化します。 – Estellad

+0

あなたは何ですか? – modesitt

+0

私の画像はすべて、1つの核について96×96のグレースケール画像にリサイズされています。 – Estellad

関連する問題