我尝试自定义设计一个可以具有如下层的网络体系结构:
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端的错误?
答案 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函数。