2017-08-03 72 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

相关问题