如何创建具有本地连接层和密集父层的本地连接层?

时间:2019-07-10 16:58:39

标签: python tensorflow keras

我目前有一个具有两个输入层的网络(image of toy example)。 in1只是值的简短平面向量,而in2是27通道图像。我希望将网络构建在本地连接的层上,但是我不知道用in1来填充in2数据的好方法。目前,我将in2的分支平整了几层,与in1合并,然后添加了密集的层。

如何在保持本地连接体系结构的同时密集引入in1的数据?上面链接的图像用红色箭头显示了该目标。

我想到的一种可能的解决方案是将in1的向量作为通道复制到in2,以使in2的尺寸为width * height * (num_original_channels + len(in1) )。这似乎不太优雅,因为它将复制in1 很多次。必须有更好的方法。

我是keras的新手,所以请原谅我摇摇欲坠的词汇。另外,这只是一个玩具示例,仅用于说明我的想法,因此可能会有其他一些/无关的建筑批评。

提前感谢您的任何建议!

首先,这是我正在使用的代码:

input1 = Input( ... ) #small flat vec
input2 = Input( ... ) #deep picture

pre = Reshape( ... )( input2 )
l1 = LocallyConnected2D( ... )( pre )
l2 = LocallyConnected2D( ... )( l1 )
l3 = LocallyConnected2D( ... )( l2 )
flat = Flatten( ... )( l3 )
merge = tensorflow.keras.layers.concatenate( [flat, input1], ... )
l4 = Dense( ... )( merge )
l5 = Dense( ... )( l4 )
output = Dense( ... )( l5 )

1 个答案:

答案 0 :(得分:0)

在这里回答我自己的问题。似乎最好的解决方案是让input1和input2都创建两个具有相同层且没有激活函数的张量,将它们加在一起,然后添加激活。

使用之前的示例看起来像这样:

(我正在添加示例尺寸以希望阐明我的意思。它们是凭空制作的)

input1 = Input( ... ) #small flat vec, 1x200
input2 = Input( ... ) #deep picture,   50x50x10

l1 = LocallyConnected2D( activation=None, ... )( input2 ) # 40x40x5

num_elements = 40 * 40 * 5
d1 = Dense( units=num_elements, activation=None, ... )( input1 ) # 1x8000
d1_3D = Reshape( target_shape=(40, 40, 5,) )( d1 ) #40x40x5

merge = Add()([ l1, d1_3D ]) #40x40x5
l2 = LeakyReLU( ... )( merge ) #Or whatever activation function you want, 40x40x5

# ...