【问题标题】:How can I create a custom connection between two different keras layers in LeNet5 architecture?如何在 LeNet 5 架构上的两个不同 keras 层之间创建自定义连接?
【发布时间】:2018-12-22 22:28:15
【问题描述】:

我正在研究LeNet5 架构。如here 所述,我想在 C3 层和 S2 层之间实现自定义连接。如果我想按照here 的说明实现自定义连接,我该如何在“CODE-1”和“CODE-2”中定义我的模型。我应该在“CODE-2”中使用多少个过滤器。任何类型的帮助将不胜感激。

s2的输出是14*14*6,需要对这6个特征图应用16个过滤器。然而,不是所有 6 个 S2 映射到 c3 的 16 个神经元,而是 C3 层映射中的大多数神经元仅连接到三个或四个 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

CODE-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)

CODE-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)

【问题讨论】:

  • 我看不到您在图片中所说的自定义连接,您能澄清一下吗?
  • @Matias Valdenegro s2 的输出为 14*14*6,需要在这 6 个特征图上应用 16 个过滤器。然而,不是所有 6 个 S2 映射到 c3 的 16 个神经元,而是 C3 层映射中的大多数神经元仅连接到三个或四个 S2 映射中的神经元。例如,如果您注意到图像 3,则 c3 的神经元 0 连接到 s2 的 0、1 和 2 个特征图。如何实现这种连接。更多细节可以在图片 2 和 3 中找到。

标签: tensorflow machine-learning keras neural-network data-science


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 2018-06-04
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2022-07-22
    相关资源
    最近更新 更多