Yuqing Wu
Yuqing Wu

Reputation: 21

ValueError: name for name_scope must be a string

I have defined attention layer in Keras, Attention layer is like this:

class Attention(Layer):
def __init__(self,
             W_regularizer=None, b_regularizer=None,
             W_constraint=None, b_constraint=None,
             bias=True, **kwargs):

    self.supports_masking = True
    # self.init = initializations.get('glorot_uniform')
    self.init = initializers.get('glorot_uniform')

    self.W_regularizer = keras.regularizers.get(W_regularizer)
    self.b_regularizer = keras.regularizers.get(b_regularizer)

    self.W_constraint = keras.constraints.get(W_constraint)
    self.b_constraint = keras.constraints.get(b_constraint)

    self.bias = bias

    self.features_dim = 0
    super(Attention, self).__init__(**kwargs)

def build(self, input_shape):
    self.step_dim = input_shape[1]
    assert len(input_shape) == 3  # batch, timestep, num_features
    print(input_shape)
    self.W = self.add_weight((input_shape[-1],),  # num_features
                             initializer=self.init,
                             name='{}_W'.format(self.name),
                             regularizer=self.W_regularizer,
                             **constraint=self.W_constraint**)
    self.features_dim = input_shape[-1]

And constraint=self.W_constraint this code may cause:

File "/Users/zrb/Workspace/sms/RCnn.py", line 268, in build
constraint=self.W_constraint)
File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer.py", line 446, in add_weight
    caching_device=caching_device)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/training/tracking/base.py", line 744, in _add_variable_with_custom_getter
    **kwargs_for_getter)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/keras/engine/base_layer_utils.py", line 142, in make_variable
    shape=variable_shape if variable_shape else None)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/variables.py", line 258, in __call__
    return cls._variable_v1_call(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/variables.py", line 219, in _variable_v1_call
    shape=shape)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/variables.py", line 197, in <lambda>
    previous_getter = lambda **kwargs: default_variable_creator(None, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/variable_scope.py", line 2596, in default_variable_creator
    shape=shape)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/variables.py", line 262, in __call__
    return super(VariableMetaclass, cls).__call__(*args, **kwargs)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/resource_variable_ops.py", line 1411, in __init__
    distribute_strategy=distribute_strategy)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/ops/resource_variable_ops.py", line 1520, in _init_from_args
    if init_from_fn else [initial_value]) as name:
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 6186, in name_scope
    return name_scope_v2(name or "")
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib    
    return name_scope_v2(name or "")
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/tensorflow_core/python/framework/ops.py", line 6367, in __init__
    raise ValueError("name for name_scope must be a string.")
ValueError: name for name_scope must be a string.

Why it would be cause error and how to solve it?

Upvotes: 2

Views: 1353

Answers (1)

Karthik Gali
Karthik Gali

Reputation: 121

Please include shape= as first parameter

self.W = self.add_weight(shape=(input_shape[-1], input_shape[-1],),
                                 initializer=self.init,
                                 name='{}_W'.format(self.name),
                                 regularizer=self.W_regularizer,
                                 constraint=self.W_constraint)

Upvotes: 3

Related Questions