MindSpore informa ValueError: `padding_idx` en `Error de incrustación fuera de rango

1 Descripción del error

1.1 Entorno del sistema

 Entorno de hardware (Ascend/GPU/CPU): Entorno de software  Ascend : -- Versión de MindSpore (fuente o binario): 1.8.0  -- Versión de Python (p. ej., Python 3.7.5): 3.7.6  -- Plataforma y distribución del sistema operativo ( por ejemplo, Linux Ubuntu 16.04): Ubuntu 4.15.0-74-generic  -- GCC/Versión del compilador (si se compila desde la fuente):

1.2 Información básica

1.2.1 Guión

El script de entrenamiento completa la operación de la capa de incrustación mediante la construcción de una red de incrustación de un solo operador. El guión es el siguiente:

 01 class Net(nn.Cell):
 02     def __init__(self, vocab_size, embedding_size, use_one_hot, padding_idx=None):
 03         super(Net, self).__init__()
 04         self.op = nn.Embedding(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=padding_idx)
 05 
 06     def construct(self, x):
 07         output = self.op(x)
 08         return output
 09 
 10 input = Tensor(np.ones([8, 128]), mindspore.int32)
 11 vocab_size = 2000
 12 embedding_size = 768
 13 use_one_hot = True
 14 example = Net(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=10000)
 15 output = example(input)
 16 print("Output: ", output.shape)
Copiar

1.2.2 Informe de errores

El mensaje de error aquí es el siguiente:

Traceback (most recent call last):
  File "C:/Users/user1/PycharmProjects/q2_map/new/I3MRK3.py", line 26, in <module>
    example = Net(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=10000)
  File "C:/Users/user1/PycharmProjects/q2_map/new/I3MRK3.py", line 12, in __init__
    self.op = nn.Embedding(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=padding_idx)
  File "C:\Users\user1\PycharmProjects\q2_map\lib\site-packages\mindspore\nn\layer\embedding.py", line 111, in __init__
    self.padding_idx = validator.check_int_range(padding_idx, 0, vocab_size, Rel.INC_BOTH,
  File "C:\Users\user1\PycharmProjects\q2_map\lib\site-packages\mindspore\_checkparam.py", line 413, in check_int_range
    return check_number_range(arg_value, lower_limit, upper_limit, rel, int, arg_name, prim_name)
  File "C:\Users\user1\PycharmProjects\q2_map\lib\site-packages\mindspore\_checkparam.py", line 209, in check_number_range
    raise ValueError("{} {} should be in range of {}, but got {} with type `{}`.".format(
ValueError: `padding_idx` in `Embedding` should be in range of [0, 2000), but got 10000 with type `int`.
Copiar

Análisis de causa

Observamos el mensaje de error, en ValueError, la escritura padding_idx debe  Embedding estar en el rango de [0, 2000), pero obtuvo 10000 con el tipo  int., lo que significa que el valor de padding_idx' en el operador de incrustación debe estar entre 0 y 2000, pero tengo 10000. Combinado con la descripción del sitio web oficial del uso del operador Ebedding, se encuentra que padding_idx se ha definido claramente, y su valor debe estar entre 0 y vocab_size: 

2 soluciones

En base a las razones conocidas anteriores, es fácil realizar las siguientes modificaciones:

 01 class Net(nn.Cell):
 02     def __init__(self, vocab_size, embedding_size, use_one_hot, padding_idx=None):
 03         super(Net, self).__init__()
 04         self.op = nn.Embedding(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=padding_idx)
 05 
 06     def construct(self, x):
 07         output = self.op(x)
 08         return output
 09 
 10 input = Tensor(np.ones([8, 128]), mindspore.int32)
 11 vocab_size = 2000
 12 embedding_size = 768
 13 use_one_hot = True
 14 example = Net(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=1000)
 15 output = example(input)
 16 print("Output: ", output.shape)
Copiar

En este momento, la ejecución es exitosa y el resultado es el siguiente:

Output: (8, 128, 768)

3 resumen

Pasos para localizar el problema de informe de errores:

1. Busque la línea de código de usuario que informó el error: ejemplo = Net(vocab_size=vocab_size, embedding_size=embedding_size, use_one_hot=use_one_hot, padding_idx=10000) ;

2. De acuerdo con las palabras clave en el mensaje de error de registro, reduzca el alcance del problema de análisis padding_idx en  Embedding el rango de [0, 2000), pero obtuvo 10000 con el tipo  int.

4 Documentos de referencia

4.1  Incrustación de la interfaz API del operador

 

Supongo que te gusta

Origin blog.csdn.net/beauty0220/article/details/129139184
Recomendado
Clasificación