首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在LeNet5体系结构中的两个不同的keras层之间创建自定义连接?

如何在LeNet5体系结构中的两个不同的keras层之间创建自定义连接?
EN

Stack Overflow用户
提问于 2018-12-22 22:28:15
回答 1查看 515关注 0票数 0

我正在研究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特征映射。如何实现这种连接。

我的代码如下所示:

代码语言:javascript
复制
from keras.models import Model
from tensorflow.keras.layers import Conv2D, Input, Concatenate, Lambda

代码-1

代码语言:javascript
复制
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

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-04-20 05:06:02

您可以创建以下自定义层类:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53899752

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档