2017-08-03 35 views
-1

這是我的代碼。我試圖建立一個VGG 11層網絡,結合ReLu和ELu激活以及內核和活動的許多正則化。結果令人困惑:代碼是在第10個時代。我在列車和val方面的損失已經從2000年下降到1.5,但我在列車和val方面的表現仍然保持在50%。有人可以向我解釋嗎?Kera與Theano:損失減少但準確性不變

# 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優化器,較大的批次等。嘗試先使用keras'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 

你可以看到它更簡單。它只使用依賴(最近流行起來)沒有正則化,不同的卷積結構等。根據需要修改它!

+0

感謝您的建議,Nucl3ic!我嘗試了標準的VGG16,但使用更少的過濾器:64-128-256-512 - > 16-32-64-128。性能沒有改善,與LeNet 5相同。所以我認爲我應該嘗試建立自己的理論上最好的網絡。那麼我將簡化我的模型。 – Estellad

+0

你是誰的照片? – modesitt

+0

我的圖像全部調整爲96 * 96,單個核的灰度圖像。 – Estellad

相關問題