gpt4 book ai didi

python - 如何使用函数式 API 调用 Keras 中的自定义层

转载 作者:行者123 更新时间:2023-11-30 08:37:40 25 4
gpt4 key购买 nike

我编写了一个 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, Input
from tensorflow.keras.models import Model
import numpy as np
from tensorflow.keras.layers import Layer
from tensorflow.keras import backend as K
from tensorflow.keras import optimizers


class MyLayer(Layer):

def __init__(self, output_dim, **kwargs):
self.output_dim = output_dim
super(MyLayer, self).__init__(**kwargs)

def build(self, input_shape):
# Create a trainable weight variable for this layer.
self.kernel = self.add_weight(name='kernel',
shape=(input_shape[1], self.output_dim),
initializer='uniform',
trainable=True)
super(MyLayer, self).build(input_shape) # Be sure to call this at the end

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 创建新层的示例,您可以找到 here .

一个非常重要的细节是,这是一个 keras 示例,但您将其与 tf.keras 一起使用。我认为tensorflow中一定存在错误,因为该示例适用于keras,但不适用于tf.keras

一般来说,您不应混合使用 kerastf.keras,因为它们具有相同的 API,但实现方式不同。如果将所有 tf.keras 导入更改为纯 keras,则代码可以正常工作。

关于python - 如何使用函数式 API 调用 Keras 中的自定义层,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56094714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com