用恒定的非张量数相加或相乘时,Keras Lambda层出错

时间:2019-06-24 17:07:17

标签: python tensorflow lambda keras layer

我尝试自定义设计一个可以具有如下层的网络体系结构:

x = k.Input(shape=(1,))
y = k.layers.Dense(1)(x + 1)  #k.backend.constant(1) -- no difference
Fx = k.models.Model(x, y)

虽然“ x + 1”是正确的Tensorflow操作,但是,我收到了NoneType错误:

  

AttributeError:“ NoneType”对象没有属性“ _inbound_nodes”

当我尝试使用Lambda层来规避这种情况时,我遇到了相同的错误:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x[0] + x[1])(
    [x, k.backend.constant(1, shape=(1,1))]
)
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)

但是我可以通过以下方法来破解:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x[0]+1)([x, x])
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)

因为Tensor +(int或float)是合法的Tensorflow操作。

我在定义Lambda层时是否犯了错误,或者这是Keras端的错误?

2 个答案:

答案 0 :(得分:0)

我不知道你为什么从

x + 1

 x[0]+1

如果您只想在x的元素中添加1,然后再通过密集层,则可以像这样应用lambda层:

x = k.Input(shape=(1,))
xx = k.layers.Lambda(lambda x: x + 1)(x)
y = k.layers.Dense(1)(xx)
Fx = k.models.Model(x, y)

答案 1 :(得分:0)

y = k.layers.Dense(1)(x + 1)不正确的原因是+ 1是有效的张量运算。按照Keras层定义的Keras模型;不是张量。因此,您需要使用x_p = Lambda(lambda x: x + 1)(x)。 后者是指定所需操作的正确方法。

即lambda x:x + 1是在Lambda()实例化图层时对张量的操作。图层是Keras跟踪图层/图形构造等之间依赖关系的方式。例如,当Keras生成图形然后计算输出形状时,lambda图层将知道其输入形状的格式。在您的情况下,形状是相似的,但是例如,您可以使用执行张量切片操作并更改输出形状的lambda函数。