【问题标题】:Calculating L2 norm using Keras Lambda layer doesn't seem to work使用 Keras Lambda 层计算 L2 范数似乎不起作用
【发布时间】:2018-05-20 15:19:12
【问题描述】:

我有以下自定义层:

import keras.backend as K
from keras.layers import Lambda
def l2_norm(x):
    x = x ** 2
    x = K.sum(x, axis=1)
    x = K.sqrt(x)
    return x

我后来以这种方式在我的模型中使用它:

class Arq(object):
def __init__(self, nb_filters_1=10, nb_filters_2=20, lenght_filters=4,
             pool_size_1=4, pool_size_2=2, dropout_prob_1=0.5,
             dropout_prob_2=0.5, frames=2580, frequency=128,
             dense_size=100, nb_classes=8):
    self.nb_filters_1 = nb_filters_1
    self.nb_filters_2 = nb_filters_2
    self.lenght_filters = lenght_filters
    self.pool_size_1 = pool_size_1
    self.pool_size_2 = pool_size_2
    self.dropout_prob_1 = dropout_prob_1
    self.dropout_prob_2 = dropout_prob_2
    self.frames = frames
    self.frequency = frequency
    self.dense_size = dense_size
    self.nb_classes = nb_classes

def build_convolutional_model(self):
    input_placeholder = Input(shape=(self.frames, self.frequency))

    conv_1 = Conv1D(self.nb_filters_1, self.lenght_filters,
                    activation='relu', border_mode='same')(input_placeholder)
    pool_1 = MaxPooling1D(self.pool_size_1)(conv_1)


    conv_2 = Conv1D(self.nb_filters_1, self.lenght_filters,
                           border_mode='same', activation='relu')(pool_1)
    pool_2 = MaxPooling1D(self.pool_size_1)(conv_2)


    conv_3 = Conv1D(self.nb_filters_2, self.lenght_filters,
                    border_mode='same', activation='relu')(pool_2)
    pool_3 = MaxPooling1D(self.pool_size_2)(conv_3)

    global_mean = GlobalAveragePooling1D()(pool_3)
    global_max = GlobalMaxPooling1D()(pool_3)
    global_l2 = Lambda(l2_norm)(pool_3)

    concat = merge([global_mean, global_max, global_l2], mode='concat', concat_axis=-1)

    hidden = Dense(self.dense_size, activation='relu')(concat)
    drop_1 = Dropout(self.dropout_prob_1)(hidden)
    hidden_2 = Dense(self.dense_size, activation='relu')(drop_1)
    drop_2 = Dropout(self.dropout_prob_1)(hidden_2)

    output = Dense(self.nb_classes, activation='softmax')(drop_2)

    model = Model(input=input_placeholder, output=output)

    model.compile(loss='categorical_crossentropy',
                  optimizer='adam',
                  metrics=['accuracy'])
    self.model = model
    return

def fit(self, x, y, batch_size, nb_epoch, validation_split):
    self.model.fit(x, y, batch_size=batch_size, nb_epoch=nb_epoch,
                   validation_split=validation_split)
    return 

当我拥有这种架构时,模型不会学习超过 25% 的准确度,但在 merge 层上,我移除 L2 范数,即 concat = merge([global_mean, global_max], mode='concat', concat_axis=-1),然后它会达到大约 90% 的准确度。

我没有在数据或训练过程中进行任何更改,这让我相信我在 Lambda 层中的自定义函数有问题,但我不知道是什么? p>

【问题讨论】:

    标签: python python-3.x keras


    【解决方案1】:
    norm_layer = Lambda(lambda x: K.l2_normalize(x, axis = 1))(input layer)
    

    您应该指定要在哪个轴上标准化数据。通常是一维向量,所以轴应该是1。

    【讨论】:

      猜你喜欢
      • 2018-04-19
      • 2018-11-27
      • 2018-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 1970-01-01
      • 2014-03-20
      相关资源
      最近更新 更多