寒假博客日记——第二天

今天看了很多别人的博客,还是对自定义层和自定义损失函数下不了手,发现了一个大佬的博客:“让Keras更酷一些!”:精巧的层与花式的回调 - 科学空间|Scientific Spaces。看见他将keras运用得蛮灵活的,打算多学学。

今天晚上尝试写了一下一致性正则化,所谓一致性,是指输出、预测的一致性, 如前所述, 给输入添加极小的扰动后, 神经网络的预测就会发生很大的变化, 所以提高一致性后就能提高模型的泛化能力, 同时, 因为这些方法往往基于模型输出的预测向量,不需要具体的标签,所以基于一致性的正则化方法基本能应用于半监督学习。

下面这篇博客记录了一些一致性正则化的论文,如果打算深入的话肯定要读的。

一致性正则化 · 无题 (zhimind.com)

我将一致性正则化运用到猫狗大战的数据集上,在不做任何数据增强技术、过拟合技术的情况下,三层卷积能达到80%左右的准确率。我用一种很笨拙的方法写了一致性正则化,但是模型没有明显的性能提升(可能是统计误差,也可能有1-2%左右)。

方法就是定义两个输出层,这两个输出是同一个输出,将其中一个的损失函数定义为交叉熵,另一个的损失函数定义为KL散度或者MSE。

def my_model(input_shape):
    inputs=Input(input_shape)
    x=Conv2D(64,kernel_size=(3,3),activation='relu')(inputs)
    x=MaxPooling2D()(x)
    x=Conv2D(128,kernel_size=(3,3),activation='relu')(x)
    x=MaxPooling2D()(x)
    x=Conv2D(256,kernel_size=(3,3),activation='relu')(x)
    x=MaxPooling2D()(x)

    x=Flatten()(x)
    x=Dense(512,'relu')(x)
    output=Dense(1,'sigmoid')

    output1=output(x)
    output2=output(x)

    model=Model(inputs,[output1,output2])
    return model
        model.compile(Adam(), loss=[keras.losses.binary_crossentropy, keras.losses.kl_divergence],
                      loss_weights=[1.0, 1.0],
                      metrics='accuracy')
def my_train():
    x, y = np.load('x.npy'), np.load('y.npy')
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)


    model=my_model(x.shape[1:])
    model.summary()
    model.compile(Adam(),loss=[keras.losses.binary_crossentropy,keras.losses.kl_divergence],loss_weights=[1.0,0],
                  metrics='accuracy')

    model.fit(x_train,[y_train,y_train],validation_data=(x_test,y_test),batch_size=256)
    y_pred=model.predict(x_train)[0]

    for i in range(30):

        x_train2=5*np.random.random(x_train.shape)+x_train

        model.compile(Adam(), loss=[keras.losses.binary_crossentropy, keras.losses.kl_divergence],
                      loss_weights=[1.0, 1.0],
                      metrics='accuracy')

        model.fit(x_train2, [y_train,y_pred], validation_data=(x_test, y_test), batch_size=256)

        # model.compile(Adam(), loss=[keras.losses.binary_crossentropy, keras.losses.kl_divergence],
        #               loss_weights=[1.0, 0],
        #               metrics='accuracy')
        #
        # model.fit(x_train, [y_train, y_train], validation_data=(x_test, y_test), batch_size=256)

        y_pred=model.predict(x_train)[0]

接下来会进一步研究一致性正则化,看了很多文章以后感觉一致性正则化还是很有用的。只是没有了很好的指导书,凭借网上碎片化的资料,推进起来是在太慢了。买了两本keras相关的书,其中有一本是keras之父写的,希望能够讲得深一点。从头开始学TensorFlow和pytorch显然时间成本太大了。。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇

)">
下一篇>>