如何在Keras的函数式API中调用自定义层

我编写了一个Keras自定义层的简小实现,其中我直接从https://keras.io/layers/writing-your-own-keras-layers/复制了类定义

然而,当我尝试像调用标准Dense层一样调用这个自定义层时,我得到了“AssertionError”错误,并且我的Pycharm抛出了对象不可调用的警告

我在这里错过了一些基本的东西,但我无法弄清楚

如果我将这行代码

model_out = MyLayer(2)(model_in)

改为

model_out = Dense(2)(model_in)

它就能工作

这里是无法运行的代码:

from tensorflow.keras.layers import Dense, Inputfrom tensorflow.keras.models import Modelimport numpy as npfrom tensorflow.keras.layers import Layerfrom tensorflow.keras import backend as Kfrom tensorflow.keras import optimizersclass MyLayer(Layer):    def __init__(self, output_dim, **kwargs):        self.output_dim = output_dim        super(MyLayer, self).__init__(**kwargs)    def build(self, input_shape):        # 为此层创建一个可训练的权重变量。        self.kernel = self.add_weight(name='kernel',                                      shape=(input_shape[1], self.output_dim),                                      initializer='uniform',                                      trainable=True)        super(MyLayer, self).build(input_shape)  # 确保在最后调用这个    def call(self, x):        return K.dot(x, self.kernel)    def compute_output_shape(self, input_shape):        return (input_shape[0], self.output_dim)model_in = Input([4])model_out = MyLayer(2)(model_in)model = Model(inputs=model_in, outputs=model_out, name='my_model')adamOpt = optimizers.Adam(lr=1e-4)model.compile(optimizer=adamOpt, loss='mean_squared_error')hist = model.fit(np.ones((10, 4)), np.ones((10, 2))+1, verbose=2, epochs=100, batch_size=np.power(2,2))

我期望这应该能够编译并运行,就像我调用Dense而不是MyLayer时那样

完整的错误信息

Traceback (most recent call last):  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 527, in make_tensor_proto    str_values = [compat.as_bytes(x) for x in proto_values]  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 527, in <listcomp>    str_values = [compat.as_bytes(x) for x in proto_values]  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\util\compat.py", line 61, in as_bytes    (bytes_or_text,))TypeError: Expected binary or unicode string, got Dimension(4)During handling of the above exception, another exception occurred:Traceback (most recent call last):  File "G:/My Drive/python/wholebrain_worm/extra_classes.py", line 31, in <module>    model_out = MyLayer(2)(model_in)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 746, in __call__    self.build(input_shapes)  File "G:/My Drive/python/wholebrain_worm/extra_classes.py", line 20, in build    trainable=True)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 609, in add_weight    aggregation=aggregation)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\training\checkpointable\base.py", line 639, in _add_variable_with_custom_getter    **kwargs_for_getter)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1977, in make_variable    aggregation=aggregation)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 183, in __call__    return cls._variable_v1_call(*args, **kwargs)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 146, in _variable_v1_call    aggregation=aggregation)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 125, in <lambda>    previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variable_scope.py", line 2437, in default_variable_creator    import_scope=import_scope)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\variables.py", line 187, in __call__    return super(VariableMetaclass, cls).__call__(*args, **kwargs)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py", line 297, in __init__    constraint=constraint)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\resource_variable_ops.py", line 409, in _init_from_args    initial_value() if init_from_fn else initial_value,  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\keras\engine\base_layer.py", line 1959, in <lambda>    shape, dtype=dtype, partition_info=partition_info)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\init_ops.py", line 255, in __call__    shape, self.minval, self.maxval, dtype, seed=self.seed)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\random_ops.py", line 235, in random_uniform    shape = _ShapeTensor(shape)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\ops\random_ops.py", line 44, in _ShapeTensor    return ops.convert_to_tensor(shape, dtype=dtype, name="shape")  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\ops.py", line 1050, in convert_to_tensor    as_ref=False)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\ops.py", line 1146, in internal_convert_to_tensor    ret = conversion_func(value, dtype=dtype, name=name, as_ref=as_ref)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\constant_op.py", line 229, in _constant_tensor_conversion_function    return constant(v, dtype=dtype, name=name)  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\constant_op.py", line 208, in constant    value, dtype=dtype, shape=shape, verify_shape=verify_shape))  File "C:\CDocuments\python\venv\lib\site-packages\tensorflow\python\framework\tensor_util.py", line 531, in make_tensor_proto    "supported type." % (type(values), values))TypeError: Failed to convert object of type <class 'tuple'> to Tensor. Contents: (Dimension(4), 2). Consider casting elements to a supported type.

回答:

我认识到这是Keras创建新层的示例,您可以在这里找到这里

一个非常重要的细节是,这是一个keras的示例,但您正在与tf.keras一起使用。我认为TensorFlow中一定有一个错误,因为这个示例在keras中工作,但在tf.keras中不工作。

一般来说,您不应该混合使用kerastf.keras,因为它们具有相同的API但实现不同。如果您将所有tf.keras导入改为普通的keras,那么代码将正确工作。

Related Posts

为什么我们在K-means聚类方法中使用kmeans.fit函数?

我在一个视频中使用K-means聚类技术,但我不明白为…

如何获取Keras中ImageDataGenerator的.flow_from_directory函数扫描的类名?

我想制作一个用户友好的GUI图像分类器,用户只需指向数…

如何查看每个词的tf-idf得分

我试图了解文档中每个词的tf-idf得分。然而,它只返…

如何修复 ‘ValueError: Found input variables with inconsistent numbers of samples: [32979, 21602]’?

我在制作一个用于情感分析的逻辑回归模型时遇到了这个问题…

如何向神经网络输入两个不同大小的输入?

我想向神经网络输入两个数据集。第一个数据集(元素)具有…

逻辑回归与机器学习有何关联

我们正在开会讨论聘请一位我们信任的顾问来做机器学习。一…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注