簡體   English   中英

Keras 中的正則化:如何控制最后一層的最大零權重數?

[英]Regularization in Keras: How can I control the maximum number of zero weights on the last layer?

我有一個神經網絡,最后一層輸出一個大小為 N(N=8)的向量。 在進行多標簽分類時,我發現大多數 output 向量元素等於 0,最多有兩個元素等於 1。例如y_pred == [1, 0, 0, 0, 0, 0, 0, 1]

我想告訴我的網絡,即至少 N-2 output 權重等於 0。

我目前的model如下:

ResNet18, preprocess_input = Classifiers.get('resnet18')
resnet = ResNet18((im_size, im_size, 3), weights='imagenet', include_top=False)
headModel = keras.layers.pooling.AveragePooling2D(pool_size=(3,3))(resnet.output)
headModel = Flatten(name="flatten")(headModel)
headModel = Dense(256, activation="relu")(headModel)
headModel = Dropout(0.5)(headModel)
    
# 'sigmoid' parameter indicating that we’ll be performing multi-label classification.
headModel = Dense(8, activation="sigmoid")(headModel)

我正在考慮在我的最后一個Dense層中添加一個正則化my_reg ,類似於

headModel = Dense(8, activation="sigmoid", kernel_regularizer=my_reg)(headModel)

我沒有使用 Keras 中的正則化器以及如何操作權重的經驗。

您可以自定義 function 作為您的激活 function。 更具體地說,將兩個最小的概率設置為零。

def custom_func(x):
    second_smallest = tf.sort(tf.squeeze(x))[1]
    x = tf.where(second_smallest >= x, tf.zeros_like(x), x)
    return x
import numpy as np
import tensorflow as tf

inp = tf.keras.Input(shape=(224, 224, 3))
base = tf.keras.applications.MobileNetV2(include_top=False, 
                                         input_shape=(224, 224, 3))(inp)
gap = tf.keras.layers.GlobalAveragePooling2D()(base)
out = tf.keras.layers.Dense(8, activation='sigmoid')(gap)
custom_function = tf.keras.layers.Lambda(custom_func)(out)

model = tf.keras.Model(inp, custom_function)

model(np.random.rand(1, 224, 224, 3).astype(np.float32))
<tf.Tensor: shape=(1, 8), dtype=float32, numpy=
array([[0.36225533, 0.66996753, 0.9467776 , 0.        , 0.6429986 ,
        0.9498544 , 0.        , 0.6883256 ]], dtype=float32)>

你也可以讓它接受這樣的論點:

import numpy as np
import tensorflow as tf


def custom_func(inputs, n_to_zero):
    second_smallest = tf.sort(tf.squeeze(inputs))[n_to_zero - 1]
    out = tf.where(second_smallest >= inputs, tf.zeros_like(inputs), inputs)
    return out


inp = tf.keras.Input(shape=(224, 224, 3))
base = tf.keras.applications.MobileNetV2(include_top=False, 
                                         input_shape=(224, 224, 3))(inp)
gap = tf.keras.layers.GlobalAveragePooling2D()(base)
out = tf.keras.layers.Dense(8, activation='sigmoid')(gap)
custom_function = tf.keras.layers.Lambda(
    lambda x: custom_func(inputs=x, n_to_zero=4)
                                        )(out)

model = tf.keras.Model(inp, custom_function)

model(np.random.rand(1, 224, 224, 3).astype(np.float32))
<tf.Tensor: shape=(1, 8), dtype=float32, numpy=
array([[0.8537902, 0.       , 0.       , 0.       , 0.7386258, 0.       ,
        0.0948523, 0.7973974]], dtype=float32)>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM