为什么正则化会增加CNN中的验证错误?

时间:2019-04-27 17:19:18

标签: python keras neural-network conv-neural-network pose-estimation

我正在尝试实施CNN以根据本文的深度图估算3D人体姿势:https://www.researchgate.net/publication/326437587_3D_human_pose_estimation_from_depth_maps_using_a_deep_combination_of_poses

但是,我的实现是在keras中进行的,无论如何,我似乎都无法达到与本文相同的准确性。我的主要问题似乎是正则化,因为在不使用正则化的情况下,我几乎可以过度拟合(平均误差〜1cm)训练数据集,但是在损失函数中使用正则化项的方式与本文中提到的相同,两者训练和验证错误增加。我可以理解为什么训练误差更高,但是我认为验证误差应该减少。如本文所述,我还在使用辍学0.2。

这是我建立模型的方式:

XmlElement: <?xml version="1.0" encoding="UTF-8"?><car><name>car1</name></car>
XmlElement: <?xml version="1.0" encoding="UTF-8"?><other><something>Unknown</something></other>
XmlElement: <?xml version="1.0" encoding="UTF-8"?><car><name>car2</name></car>

以及我对损失函数的实现:

def DPP(weights=None):
    model = Sequential()

    model.add(Conv2D(filters=96, kernel_size=(7, 7), strides=(1, 1), input_shape=(100, 100, 1),
                 kernel_initializer=keras.initializers.glorot_normal(), 
    data_format="channels_last",
                 bias_initializer='zeros', activation='relu')) 

    model.add(MaxPooling2D((2, 2), strides=(2, 2)))


    model.add(Conv2D(filters=192, kernel_size=(5, 5), strides=(2, 2), activation='relu'))

    model.add(MaxPooling2D((2, 2), strides=(2, 2)))


    model.add(Conv2D(filters=512, kernel_size=(3, 3), strides=(1, 1), activation='relu'))

    model.add(MaxPooling2D((2, 2), strides=(2, 2)))


    model.add(Conv2D(filters=1024, kernel_size=(2, 2), strides=(2, 2), activation='relu'))


    model.add(Conv2D(filters=2048, kernel_size=(2, 2), strides=(1, 1),
                 activation='relu')) 

    model.add(Flatten())

    model.add(Dense(1024))
    model.add(Dropout(0.2))  

    model.add(Dense(256)) 

    model.add(Dense(K, name='output'))

    if weights:
         model.load_weights(weights)

    return model

其中C是具有原型姿势的张量,meanpose和varpose是聚类火车数据集的均值和变异。

关于正则化,我是否缺少明显的东西?

0 个答案:

没有答案