【问题标题】:Adding outputs of two layers in keras在keras中添加两层的输出
【发布时间】:2018-06-20 09:52:20
【问题描述】:

我有一个问题,在 Keras 中似乎没有直接的解决方案。 我的服务器在 ubuntu 14.04 上运行,带有后端 tensorflow 的 keras。

问题来了:

我有两个形状的输入 Tenor:Input(shape=(30,125,1)),它们每个都被馈送到下面的三层级联:

CNN1 = Conv2D(filters = 8, kernel_size = (1,64) , padding = "same" , activation = "relu" )
CNN2 = Conv2D(filters = 8, kernel_size = (8,1) , padding = "same" , activation = "relu" )
pool = MaxPooling2D((2, 2))

为各个输入获得的每个输出张量的形状为(None, 15, 62, 8)。现在,我希望为每个过滤器的两个输入添加每个(15,62) 矩阵,并再次获得维度的输出(None, 15, 62, 8)

我尝试使用 Lambda 层使用以下代码行,但它会引发错误。

from keras import backend as K
from keras.layers import Lambda

def myadd(x):
    increment = x[1]
    result = K.update_add(x[0], increment)
    return result

in_1 = Input(shape=(30,125,1))
in_1CNN1 = CNN1(in_1)
in_1CNN2 = CNN2(in_1CNN1)
in_1pool = pool(in_1CNN2)

in_2 = Input(shape=(30,125,1))
in_2CNN1 = CNN1(in_2)
in_2CNN2 = CNN2(in_2CNN1)
in_2pool = pool(in_2CNN2)

y1 =y1.astype(np.float32) # an input regression label array of shape (numsamples,1) loaded from a mat file

out1 = Lambda(myadd, output_shape=(None, 15, 62, 8))([in_1pool,in_2pool])
a= keras.layers.Flatten()(out1)

pre1 = Dense(1000, activation='sigmoid')(a)
pre2 =Dropout(0.2)(pre1)
predictions = Dense(1, activation='sigmoid')(pre2)

model = Model(inputs=[in_1,in_2], outputs=predictions)
model.compile(optimizer='sgd',loss='mean_squared_error')
model.fit([inputdata1,inputdata2], y1, epochs=20, validation_split=0.5)
#inputdata1, inputdata2 are arrays loaded from a mat file and are each of shape (5169, 30, 125, 1)

错误在下面突出显示:

Traceback (most recent call last):
  File "keras_workshop/keras_multipleinputs_multiple CNN.py", line 225, in <module>
    out1 = Lambda(myadd, output_shape=(None, 15, 62, 8))([in_1pool,in_2pool])
  File "/home/tharun/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 603, in __call__
    output = self.call(inputs, **kwargs)
  File "/home/tharun/anaconda2/lib/python2.7/site-packages/keras/layers/core.py", line 651, in call
    return self.function(inputs, **arguments)
  File "keras_workshop/keras_multipleinputs_multiple CNN.py", line 75, in myadd
    result = K.update_add(x[0], increment)
  File "/home/tharun/anaconda2/lib/python2.7/site-packages/keras/backend/tensorflow_backend.py", line 958, in update_add
    return tf.assign_add(x, increment)
  File "/home/tharun/anaconda2/lib/python2.7/site-packages/tensorflow/python/ops/state_ops.py", line 245, in assign_add
    return ref.assign_add(value)
AttributeError: 'Tensor' object has no attribute 'assign_add'

【问题讨论】:

  • 是的,Add() 方法正在工作。

标签: python-2.7 deep-learning keras keras-layer


【解决方案1】:

试试 Keras 提供的 Add() layeradd() function


添加

keras.layers.Add()  

添加输入列表的层。

它将一个张量列表作为输入,所有形状都相同,并返回一个张量(也具有相同的形状)。


添加

keras.layers.add(inputs)

添加层的功能接口。

参数

inputs:输入张量列表(至少 2 个)。
**kwargs:标准层关键字参数。

返回

张量,输入的总和。

【讨论】:

  • 欢迎来到 Stack Overflow!我编辑了答案以在帖子本身中包含一些文档,并将其从更像评论的回复更改为更像完整答案的内容。当您达到 50 个代表时,您将能够发表评论(请参阅此 here 的更多信息),但在那之前,请尽量将您的解决方案完整地写出来,无论如何您都可以立即发表评论。继续努力!
猜你喜欢
  • 2017-10-06
  • 2018-07-06
  • 2020-02-02
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 1970-01-01
  • 2017-04-18
  • 2019-05-22
相关资源
最近更新 更多