我正在研究LeNet5体系结构。我想实现层C3和S2之间的自定义连接,如解释的这里。如果我想按照解释的那样实现自定义连接,我必须如何在"CODE-1“和"CODE-2”中定义模型。我应该在"CODE-2“中使用多少个过滤器。任何类型的帮助都将不胜感激。
s2的输出为14*14*6,需要在这6个特征映射上应用16个过滤器。然而,与所有6个S2映射到16个c3神经元相比,层C3图谱中的大多数神经元仅在3或4个S2映射中与神经元连接。在图像2和3中可以找到更多的细节。c3层有16幅大小为5×5、步长为1的特征图。在这一层中,16幅特征图中只有10张与s2的6幅特征图相连接。
如果您注意到图3,c3的神经元0连接到s2的0、1和2特征映射。如何实现这种连接。
我的代码如下所示:
from keras.models import Model
from tensorflow.keras.layers import Conv2D, Input, Concatenate, Lambda代码-1
inputTensor = Input(shape=(14, 14, 6))
group0 = Lambda(lambda x: x[:,:,:3], output_shape=((10, 10, 1)))(inputTensor)
group1 = Lambda(lambda x: x[:,:,1:4], output_shape=((10, 10, 1)))(inputTensor)
group2 = Lambda(lambda x: x[:,:,2:5], output_shape=((10, 10, 1)))(inputTensor)
group3 = Lambda(lambda x: x[:,:,3:6], output_shape=((10, 10, 1)))(inputTensor)
# all 16 layers of c3 (of the Custom Connections image)代码-2
conv_group0 = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group0)
conv_group1 = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group1)
conv_group2 = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group2)
#all 16 layers convolution
output_layer = Concatenate()([conv_group0,conv_group1,conv_group2,conv_group3,conv_group4,conv_group5,conv_group6,conv_group7,
conv_group8,conv_group9,conv_group10,conv_group11,conv_group12,conv_group13,conv_group14,conv_group15])
Mymodel = Model(inputTensor,output_layer)发布于 2021-04-20 05:06:02
您可以创建以下自定义层类:
CustomLayer(tf.keras.layers.Layer):
""" Custom layer with initialize matrix = connect_matrix. """
def __init__(self, activation, units, connect_matrix):
super(CustomLayer, self).__init__()
self.units = units
self.connect_matrix = np.asarray(connect_matrix, dtype='float32')
self.activation = tf.keras.activations.get(activation)
def build(self, input_shape):
self.w = self.add_weight(shape=(input_shape[-1], self.units), initializer=tf.constant_initializer(value=self.connect_matrix), trainable=True)
self.b = self.add_weight(shape=(self.units,), initializer="zeros", trainable=True)
self.m = self.add_weight(shape=(input_shape[-1], self.units), initializer=tf.constant_initializer(value=self.connect_matrix), trainable=False)
#super().build(batch_input_shape)
def call(self, inputs):
wm = tf.math.multiply(self.w, self.m)
out_lin = tf.matmul(inputs, wm) + self.b
return self.activation(out_lin)
def get_config(self):
base_config = super().get_config()
return {**base_config, "units": self.units, "activation": keras.activations.serialize(self.activation)}将连接矩阵保存为2D numpy数组A,并使用CustomLayer(单位、激活、connect_matrix=A)作为通常的tf.keras.layer,您可以在以下链接中找到更多信息:CustomTF2KerasObjects
https://stackoverflow.com/questions/53899752
复制相似问题