【发布时间】:2019-07-05 17:24:39
【问题描述】:
我是 Keras 的新手。我想实现一个并非所有权重都会更新的层。例如,在下面的代码中,我希望dilation 层将更新为某些中心权重永远不会更新。例如,dilation 层中每个特征矩阵(共 1024 个)的形状为 448, 448,并且所有特征矩阵中心的 8x8 块将永远不会更新,即 8x8 块是特征矩阵的(不可训练的)掩码。
input_layer=Input(shape=(896,896,3))
new_layer = Conv2D(32, kernel_size=(3,3), padding="same", activation='relu', kernel_initializer='he_normal')(input_layer)
new_layer = MaxPooling2D(pool_size=(2, 2), strides=(2,2), padding='same', data_format=None)(new_layer)
new_layer = Conv2D(64, kernel_size=(3,3), padding='same', activation='relu', kernel_initializer='he_normal')(new_layer)
new_layer = Conv2D(1024, kernel_size=(7,7), dilation_rate=8, padding="same", activation='relu', kernel_initializer='he_normal', name='dialation')(new_layer)
new_layer = Conv2D(32, kernel_size=(1,1), padding="same", activation='relu', kernel_initializer='he_normal')(new_layer)
new_layer = Conv2D(32, kernel_size=(1,1), padding="same", activation='relu', kernel_initializer='he_normal')(new_layer)
model = Model(input_layer, new_layer)
我正在尝试使用 Keras 的 custom layer [link],但我很难理解。任何人都会请帮忙。
更新: 我添加了下图以便更好地理解。膨胀层包含 1024 个特征。我希望每个特征的中间区域是不可训练的(静态的)。
【问题讨论】:
-
请解释清楚。您正在混合权重和特征,它们是两种不同的东西。您希望特征在某个坐标处是静态的,还是希望权重在某个坐标处是静态的?还是您希望某些特征对权重更新没有贡献?
-
感谢您的意见。我更新了描述。我想要某些坐标的特征的静态权重。
-
只是为了确定。您是否了解权重始终为 7x7 并且完全独立于图像中的坐标?相同的 7x7 将应用于整个图像。
-
权重是可训练的,但特征是不可训练的。这就是为什么我对你想要什么感到困惑。不过,有一些可能性。您可以将特征的中间部分替换为常数值。您可以在特征中间停止渐变,这样这部分特征就不会计入反向传播(尽管如此,权重会更新,相同的 7x7 矩阵会应用于整个图像)。
-
这就是我想要实现的:“你可以用一个常数值替换特征的中间。你可以在特征的中间停止渐变,所以这部分特征不计入反向传播” - 你能提供任何实现吗?
标签: keras convolution masking