Machine learning 如何在两个不同的keras层之间创建自定义(卷积)连接

Machine learning 如何在两个不同的keras层之间创建自定义(卷积)连接,machine-learning,keras,neural-network,Machine Learning,Keras,Neural Network,我正在两个不同的keras层之间实现一个自定义连接。神经网络从如下开始: model = tf.keras.Sequential() c1 = model.add(Conv2D(6, kernel_size=[5,5], strides=(stride,stride), padding="valid", input_shape=(32,32,1), activation = 'tanh')) s2 = model.add(AveragePooling2D(p

我正在两个不同的keras层之间实现一个自定义连接。神经网络从如下开始:

model = tf.keras.Sequential()
c1 = model.add(Conv2D(6, kernel_size=[5,5], strides=(stride,stride), padding="valid", input_shape=(32,32,1), 
                  activation = 'tanh'))
s2 = model.add(AveragePooling2D(pool_size=2, strides=2, padding='valid'))
现在,s2的输出的大小为14*14*6

这里,我想将我的自定义连接应用到卷积层c3,其输出大小为10*10*16(也就是说,需要在大小为14*14*6的s2上应用16个过滤器,并获得10*10*16的输出)。为此,我需要使用
kernal_size=5*5
filers=16
stride=1
,以及
padding=valid

但是,所有6个要素图(s2)均未连接到16个要素图(c3)。这些连接的解释如下所示

例如(上面给出的链接的解释),为了构建C3的第一个特征图,您使用5x5过滤器对3个输入图(大小为14*14*6的s2)进行卷积,这将为您提供3个10x10的图,这些图相加后将得到您的第一个特征图,其大小为10x10

我在某个地方读到,我们需要用它来建造这个

但是,我不确定如何进一步进行。有人能帮我实现这一点吗

我的初步实施方法如下:

from keras.models import Model
from keras.layers import Conv2D, Input, Concatenate, Lambda, Add

inputTensor = Input(shape=(14, 14,6))
stride =1
group0_a = Lambda(lambda x: x[:,:,0])(inputTensor)
group0_b = Lambda(lambda x: x[:,:,1])(inputTensor)
group0_c = Lambda(lambda x: x[:,:,2])(inputTensor) # Take 0,1,2 feature map of s2

conv_group0_a = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group0_a)
conv_group0_b = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group0_b)
conv_group0_c = Conv2D(1, kernel_size=[5,5], strides=(stride,stride), padding="valid", activation = 'tanh')(group0_c)  #Applying convolution on each of 0, 1, 2 feature maps of s2 with distinct kernals

added_0 = Add()([conv_group0_a, conv_group0_b, conv_group0_c]) #adding all the three to get one of the 10*10*16

#Repeat this for 16 neurons of c3 and then finally
output_layer = Concatenate()([]) #concatenate them
Mymodel = Model(inputTensor,output_layer)

我想知道我的方法是否正确(我知道这不是因为我犯了太多错误)。因此,如上所述,我需要帮助重新创建自定义连接。感谢您的帮助。

以上代码是正确的,我所做的唯一更改是
group0_a=Lambda(Lambda x:x[:,:,0:1])(inputSensor)
,也就是说,不是将
x作为
x[:,:,0]
传递,而是将其作为
x[:,:,0:1]

从您的解释来看,您的代码似乎没有问题。它只需要一次又一次地执行。@giser_yugang我们需要使用函数式API而不是顺序API来实现整个代码。@VamshiPulluri你明白了吗?您遇到了什么类型的错误?@Moondra请检查我下面的答案