【问题标题】:Error in Keras' lambda layer while adding or multiplying with constant non-tensor numbers与常数非张量数相加或相乘时,Keras 的 lambda 层出错
【发布时间】:2019-06-24 17:07:17
【问题描述】:

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

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 or float) 是一个合法的 Tensorflow 操作。

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

【问题讨论】:

    标签: python tensorflow lambda keras layer


    【解决方案1】:

    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 函数来执行张量切片操作并更改输出形状。

    【讨论】:

    • 感谢您的评论,非常有帮助!
    【解决方案2】:

    我不知道你为什么改成

    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)
    

    【讨论】:

    • 你是对的!最初我使用 keras.layers.Add 进行测试,它需要一个至少包含两个项目的 list 作为输入。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多