首页 > 解决方案 > 如何在 keras lambda 层中使用 tf.py_func 来包装 python 代码。ValueError:应定义 Dense 输入的最后一个维度。没有找到

问题描述

我想在使用 keras 的自定义 lambda 层中使用 tf.py_fucn 包装 numpy 代码。

注意:仅为了简单起见,我展示了一个简单的 np.power 函数。

这是我所做的

def my_func(x):

    return np.power(x, 2)

def my_lambda_func(x):

    return tf.py_function(my_func, [x], tf.float32)


def model():

    inp = Input(shape=(2,))
    x = Dense(128)(inp)
    x = Dense(128)(x)

    z = Lambda(my_lambda_func)(x)

    output = Dense(1)(z)
    model = Model(inputs=inp, outputs=output)

    return model



model = model ()
model.compile(optimizer='adam', loss='mse')

然后我得到这个错误


ValueError Traceback (last last call last) in () 21 22 ---> 23 model = model () 24 model.compile(optimizer='adam', loss='mse')

3 帧 /usr/local/lib/python3.6/dist-packages/tensorflow/python/keras/layers/core.py in build(self,input_shape)1179 last_dim = tensor_shape.dimension_value(input_shape[-1])1180 if last_dim is None: -> 1181 raise ValueError('Dense应定义'1182'的输入的最后一个维度。找到None。') 1183 self.input_spec = InputSpec(min_ndim=2, axes={-1: last_dim})

ValueError:Dense应定义输入的最后一个维度。找到None

标签: numpytensorflowkeraslambdalayer

解决方案


您可能需要指定 Lambda 层 z 的输出形状,tf.py_function 将给出 None 作为输出形状,这与紧随其后的 Dense 层不匹配。你应该试试:

z = Lambda(my_lambda_func)(x)

z.set_shape(x.shape)


推荐阅读