我目前正在尝试有多个层与自定义激活的名称cust_sig
。但是当我尝试编译模型时,我得到了一个ValueError,因为多个层具有相同的名称cust_sig
。我知道我可以手动更改每个层的名称,但我想知道是否可以像内置层那样自动将_1, _2, ...
添加到名称中。模型定义可以在下面找到。
# Creating a model
from tensorflow.python.keras import keras
from tensorflow.python.keras.models import Model
from tensorflow.python.keras.layers import Dense
# Custom activation function
from tensorflow.python.keras.layers import Activation
from tensorflow.python.keras import backend as K
from keras.utils.generic_utils import get_custom_objects
def custom_activation(x):
return (K.sigmoid(x) * 5) - 1
get_custom_objects().update({'custom_activation': Activation(custom_activation)})
data_format = 'channels_first'
spec_input = keras.layers.Input(shape=(1, 3, 256), name='spec')
x = keras.layers.Flatten(data_format)(spec_input)
for layer in range(3):
x = Dense(512)(x)
x = Activation('custom_activation', name='cust_sig')(x)
out = Dense(256, activation="sigmoid", name='out')(x)
model = Model(inputs=spec_input, outputs=out)
错误消息如下所示
Traceback (most recent call last):
File "/home/xyz/anaconda3/envs/ctf/lib/python3.7/site-packages/tensorflow/python/training/tracking/base.py", line 457, in _method_wrapper
result = method(self, *args, **kwargs)
File "/home/xyz/anaconda3/envs/ctf/lib/python3.7/site-packages/tensorflow/python/keras/engine/network.py", line 315, in _init_graph_network
self.inputs, self.outputs)
File "/home/xyz/anaconda3/envs/ctf/lib/python3.7/site-packages/tensorflow/python/keras/engine/network.py", line 1861, in _map_graph_network
str(all_names.count(name)) + ' times in the model. '
ValueError: The name "cust_sig" is used 3 times in the model. All layer names should be unique.
4条答案
按热度按时间nbnkbykc1#
下面应该做:
说明:
从源代码来看,自动命名的工作原理如下:
检查Keras图中是否存在与您正在定义的对象同名的现有对象-如果存在,则继续递增1,直到没有匹配的对象。问题是,您不能指定
name=
,因为这消除了根据上述条件的自动命名。唯一的解决办法可能是使用所需的名称作为类名定义自己的自定义激活层,如上所述,其表现如下:
noj0wjuj2#
如果你检查
Layer
类的源代码,你可以找到决定层名称的这些行。K.get_uid(prefix)
将从图中获得唯一的id,这就是为什么你会看到activation_1
,activation_2
。如果你想在自定义的激活函数上有同样的效果,一个更好的方法是定义你自己的类,它继承自
Layer
。输出
laik7k3q3#
如果你想多次使用
specific_name
和数字后缀,使用这个:或
在您的案例中:
ht4b089n4#
Tensorflow库不提供自定义名称的自动增量。你必须创建一个全新的层类,这是不切实际的。
以下技巧是创建激活层并为其命名的最简单方法。请随意复制粘贴,它不需要更改:
只需将您的激活层替换为以下函数:
在绘制模型的图形时,名称会自动递增,以避免图形错误。它显示如下: