Keras使用面罩冻结比重

Keras使用面罩冻结比重,keras,convolution,masking,Keras,Convolution,Masking,我是凯拉斯的新手。我想实现一个层,其中不是所有的权重都将更新。例如,在下面的代码中,我希望膨胀层的更新方式使某些中心权重永远不会更新。例如,diagration层中每个特征矩阵(1024个)的形状是448、448,所有特征矩阵中心的8x8块将永远不会更新,即8x8块是特征矩阵的(不可训练)掩码 input_layer=Input(shape=(896,896,3)) new_layer = Conv2D(32, kernel_size=(3,3), padding="same", activat

我是凯拉斯的新手。我想实现一个层,其中不是所有的权重都将更新。例如,在下面的代码中,我希望
膨胀
层的更新方式使某些中心权重永远不会更新。例如,
diagration
层中每个特征矩阵(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的
自定义层
,但我很难理解。任何人都可以帮忙

更新: 为了更好地理解,我添加了下图。膨胀层包含1024个特征。我希望每个特性的中间区域是不可训练的(静态)


在两种情况下都使用此遮罩:

mask = np.zeros((1,448,448,1))
mask[:,220:228,220:228] = 1
更换部分功能部件 如果将部分特征替换为常量值,这意味着该特征将是静态的,但它仍将参与反向传播(因为这部分图像的权重仍将相乘和求和,并且存在连接)

保留特征值,但停止反向传播 这里,扩张层和进一步的权重将正常更新,但是扩张层之前的权重将不会受到中心区域的影响

def stopBackprop(x):
    stopped=K.stop_gradients(x)
    return x*(1-mask) + stopped*mask

#before the dilation layer
new_layer=Lambda(stopBackprop)(new_layer) 

在两种情况下都使用此掩码:

mask = np.zeros((1,448,448,1))
mask[:,220:228,220:228] = 1
更换部分功能部件 如果将部分特征替换为常量值,这意味着该特征将是静态的,但它仍将参与反向传播(因为这部分图像的权重仍将相乘和求和,并且存在连接)

保留特征值,但停止反向传播 这里,扩张层和进一步的权重将正常更新,但是扩张层之前的权重将不会受到中心区域的影响

def stopBackprop(x):
    stopped=K.stop_gradients(x)
    return x*(1-mask) + stopped*mask

#before the dilation layer
new_layer=Lambda(stopBackprop)(new_layer) 

请解释清楚。你在混合权重和特征,它们是两个不同的东西。您希望特征在某个坐标上是静态的,还是希望权重在某个坐标上是静态的?或者你想让某些功能不影响重量更新?谢谢你的观点。我更新了描述。我想要在某些坐标下的特征的静态权重。只是为了确定。您是否了解权重始终为7x7且完全独立于图像中的坐标?相同的7x7将应用于整个图像。重量是可训练的,但功能是不可训练的。这就是为什么我不知道你想要什么。不过,也有一些可能性。可以使用常量值替换特征的中间部分。可以在特征的中间停止渐变,所以这部分特征在反向传播中不起作用(权重将更新,同样的7x7矩阵被应用到整个图像)。这就是我想要实现的:“您可以用常量值替换特征的中间部分。可以在特征的中间停止渐变,所以这部分特征在反向传播中不起作用。“-您能否提供任何实施方案?请更好地解释。你在混合权重和特征,它们是两个不同的东西。您希望特征在某个坐标上是静态的,还是希望权重在某个坐标上是静态的?或者你想让某些功能不影响重量更新?谢谢你的观点。我更新了描述。我想要在某些坐标下的特征的静态权重。只是为了确定。您是否了解权重始终为7x7且完全独立于图像中的坐标?相同的7x7将应用于整个图像。重量是可训练的,但功能是不可训练的。这就是为什么我不知道你想要什么。不过,也有一些可能性。可以使用常量值替换特征的中间部分。可以在特征的中间停止渐变,所以这部分特征在反向传播中不起作用(权重将更新,同样的7x7矩阵被应用到整个图像)。这就是我想要实现的:“您可以用常量值替换特征的中间部分。你可以在特征的中间停止渐变,所以这部分的特性在反向传播中不起作用。-你能提供任何实现吗?谢谢你的实现例子。谢谢你的实现例子。