Keras 的 lambda 层在与常量非张量数相加或相乘时出错
Error in Keras' lambda layer while adding or multiplying with constant non-tensor numbers
我尝试自定义设计一个网络架构,我可以有一个层如下:
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' object has no attribute '_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 端的错误?
我不知道你为什么从
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)
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 函数执行张量切片操作并更改输出形状。
我尝试自定义设计一个网络架构,我可以有一个层如下:
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' object has no attribute '_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 端的错误?
我不知道你为什么从
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)
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 函数执行张量切片操作并更改输出形状。