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

Posted

技术标签:

【中文标题】如何在 keras lambda 层中使用 tf.py_func 来包装 python 代码。 ValueError:应定义 Dense 输入的最后一个维度。没有找到【英文标题】:How to use tf.py_func in keras lambda layer to wrap python code. ValueError: The last dimension of the inputs to Dense should be defined. Found None 【发布时间】:2021-03-24 01:42:50 【问题描述】:

我想在使用 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(最近一次调用最后一次) 在 () 21 22 ---> 23 型号 = 型号 () 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 为无,则为 1180: -> 1181 raise ValueError('输入到Dense的最后一个维度' 1182'应该被定义。找到None.') 第1183章自己

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

【问题讨论】:

【参考方案1】:

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

z = Lambda(my_lambda_func)(x)

z.set_shape(x.shape)

【讨论】:

以上是关于如何在 keras lambda 层中使用 tf.py_func 来包装 python 代码。 ValueError:应定义 Dense 输入的最后一个维度。没有找到的主要内容,如果未能解决你的问题,请参考以下文章

Keras 2:在“合并”图层中使用lambda函数

如何有条件地缩放 Keras Lambda 层中的值?

在 Keras Lambda 层中调整输入图像的大小

如何在 Tensorflow 2.x Keras 自定义层中使用多个输入?

如何在Tensorflow 2.x Keras自定义层中使用多个输入?

Dropout与过拟合抑制函数式API