Понимание вывода вложений и сообщения об ошибке при изменении параметра в слое внедрения в Keras / tenorflow 2.0 - PullRequest
0 голосов
/ 07 ноября 2019

Я пытаюсь понять и ознакомиться с вложениями.

Я создал искусный набор данных из 5000 наблюдений, состоящий из объединения 5 наборов данных:

  1. Образец1000 значений, взятых из нормального распределения со средним значением = 1, стандартное отклонение = 0,1

  2. Выборка из 1000 значений, полученных из нормального распределения со средним значением = 5, стандартное отклонение = 0,1

  3. Выборка из 1000 значений, полученных из нормального распределения со средним значением = 7, стандартная ошибка = 0,1

  4. Выборка из 1000 значений, взятых из нормального распределения со средним значением = 1, стандартная ошибка= 1

  5. Выборка из 1000 значений, полученных из нормального распределения со средним значением = 7, стандартное отклонение = 1

Вот код:

from scipy.stats import norm

y1 = norm.rvs(loc=1, scale=.1, size=1000)

y2 = norm.rvs(loc=5, scale=.1, size=1000)

y3 = norm.rvs(loc=7, scale=.1, size=1000)

y4 = norm.rvs(loc=5, scale= 1, size=1000)

y5 = norm.rvs(loc=1, scale= 1, size=1000)

df1 = pd.DataFrame({'x' : 1, 'y': y1 })

df2 = pd.DataFrame({'x' : 2, 'y': y2 })

df3 = pd.DataFrame({'x' : 3, 'y': y3 })

df4 = pd.DataFrame({'x' : 4, 'y': y4 })

df5 = pd.DataFrame({'x' : 5, 'y': y5 })

df = pd.concat([df1, df2, df3, df4, df5], axis = 0)

df= df.sample(frac=1)

enter image description here

Моя цель состояла в том, чтобы использовать вложения для представления значений кода, представляющих 5 наборов данных (то есть 1, 2, 3, 4, 5) в2-мерное пространство.

Мне было интересно посмотреть, будет ли это представление как-то отражатьВнутренняя природа каждого набора данных, т. е. тот факт, что все они были выборками, взятыми из нормального распределения, но с пятью различными комбинациями среднего и стандартного.

Я поступил следующим образом:

inputs = Input(shape=(1,))

x1 = Embedding(6, 2, input_length=1, name = 'embeddings')(inputs)

x2 = Flatten()(x1)

x3 = Dense(10, activation = 'relu')(x2)

x4 = Dense(10, activation = 'relu')(x3)

x5 = Dropout(0.5)(x4)

prediction = Dense(1)(x5)

model = Model(inputs = inputs, outputs = prediction)

model.compile(optimizer='Adam',
              loss='mse',
              metrics=['mae'])

model.fit(x = df.x.values, y = df.y.values, epochs = 10, batch_size = 16)  

Затем я извлек весы обученного слоя и исследовал их:

for layer in model.layers:

    if layer.name == 'embeddings':

        embedding_layer = layer

enter image description here

Итак, здесь у нас есть матрица с 6 строками, соответствующимиуникальные значения входов, которые, как мы видели, являются {1, 2, 3, 4, 5}.

Но какому значению соответствует какая строка?

Шестой «избыточной» строке соответствуетдо чего?

Можете ли вы предложить интуитивно понятную интерпретацию конкретных весов?

Если это вам поможет, я нанес на график веса, поскольку они представлены в двухмерном пространстве:

ax = embeddings_df.reset_index().plot.scatter(x = 'x', y = 'y')
for i, txt in enumerate(embeddings_df.index):
    ax.annotate(txt, (embeddings_df.x.iat[i],embeddings_df.y.iat[i]))

enter image description here

Фактически кажется, что уникальные входные значения соответствуют соответствующим индексам весовой матрицы. Положение векторов внедрения, по-видимому, связано со средним значением генерирующего распределения (вдоль диагонали от верхнего левого верхнего угла до правого нижнего угла). Различия в std представлены разными позициями вдоль горизонтальной оси, хотя неясно, как работает отображение.

В общем, как узнать, какой строке весовой матрицы соответствует уникальное значение в векторе входных данных? Всегда ли 1 соответствует строке весовой матрицы с индексом 1?

Какова роль строки с индексом 0?

На самом деле я пытался создавать вложения, используя какinput_dim число 5, которое привело к ошибке во время подгонки:

Train on 5000 samples
Epoch 1/10
  16/5000 [..............................] - ETA: 2:53
---------------------------------------------------------------------------
InvalidArgumentError                      Traceback (most recent call last)
<ipython-input-44-ec152436476c> in <module>
----> 1 model.fit(x = df.x.values, y = df.y.values, epochs = 10, batch_size = 16)

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs)
    726         max_queue_size=max_queue_size,
    727         workers=workers,
--> 728         use_multiprocessing=use_multiprocessing)
    729 
    730   def evaluate(self,

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py in fit(self, model, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, **kwargs)
    322                 mode=ModeKeys.TRAIN,
    323                 training_context=training_context,
--> 324                 total_epochs=epochs)
    325             cbks.make_logs(model, epoch_logs, training_result, ModeKeys.TRAIN)
    326 

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\keras\engine\training_v2.py in run_one_epoch(model, iterator, execution_function, dataset_size, batch_size, strategy, steps_per_epoch, num_samples, mode, training_context, total_epochs)
    121         step=step, mode=mode, size=current_batch_size) as batch_logs:
    122       try:
--> 123         batch_outs = execution_function(iterator)
    124       except (StopIteration, errors.OutOfRangeError):
    125         # TODO(kaftan): File bug about tf function and errors.OutOfRangeError?

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\keras\engine\training_v2_utils.py in execution_function(input_fn)
     84     # `numpy` translates Tensors to values in Eager mode.
     85     return nest.map_structure(_non_none_constant_value,
---> 86                               distributed_function(input_fn))
     87 
     88   return execution_function

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\def_function.py in __call__(self, *args, **kwds)
    455 
    456     tracing_count = self._get_tracing_count()
--> 457     result = self._call(*args, **kwds)
    458     if tracing_count == self._get_tracing_count():
    459       self._call_counter.called_without_tracing()

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\def_function.py in _call(self, *args, **kwds)
    518         # Lifting succeeded, so variables are initialized and we can run the
    519         # stateless function.
--> 520         return self._stateless_fn(*args, **kwds)
    521     else:
    522       canon_args, canon_kwds = \

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\function.py in __call__(self, *args, **kwargs)
   1821     """Calls a graph function specialized to the inputs."""
   1822     graph_function, args, kwargs = self._maybe_define_function(args, kwargs)
-> 1823     return graph_function._filtered_call(args, kwargs)  # pylint: disable=protected-access
   1824 
   1825   @property

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\function.py in _filtered_call(self, args, kwargs)
   1139          if isinstance(t, (ops.Tensor,
   1140                            resource_variable_ops.BaseResourceVariable))),
-> 1141         self.captured_inputs)
   1142 
   1143   def _call_flat(self, args, captured_inputs, cancellation_manager=None):

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\function.py in _call_flat(self, args, captured_inputs, cancellation_manager)
   1222     if executing_eagerly:
   1223       flat_outputs = forward_function.call(
-> 1224           ctx, args, cancellation_manager=cancellation_manager)
   1225     else:
   1226       gradient_name = self._delayed_rewrite_functions.register()

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\function.py in call(self, ctx, args, cancellation_manager)
    509               inputs=args,
    510               attrs=("executor_type", executor_type, "config_proto", config),
--> 511               ctx=ctx)
    512         else:
    513           outputs = execute.execute_with_cancellation(

~\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\eager\execute.py in quick_execute(op_name, num_outputs, inputs, attrs, ctx, name)
     65     else:
     66       message = e.message
---> 67     six.raise_from(core._status_to_exception(e.code, message), None)
     68   except TypeError as e:
     69     keras_symbolic_tensors = [

~\Anaconda3\envs\tf2\lib\site-packages\six.py in raise_from(value, from_value)

InvalidArgumentError: 2 root error(s) found.
  (0) Invalid argument:  indices[1,0] = 5 is not in [0, 5)
     [[node model_4/embeddings/embedding_lookup (defined at C:\Users\Alienware\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]]
     [[Adam/Adam/update/AssignSubVariableOp/_39]]
  (1) Invalid argument:  indices[1,0] = 5 is not in [0, 5)
     [[node model_4/embeddings/embedding_lookup (defined at C:\Users\Alienware\Anaconda3\envs\tf2\lib\site-packages\tensorflow_core\python\framework\ops.py:1751) ]]
0 successful operations.
0 derived errors ignored. [Op:__inference_distributed_function_33376]

Function call stack:
distributed_function -> distributed_function

Это озадачивает меня, потому что в действительности размерность входов равна 5, поскольку у меня есть 5 различных / уникальных значений, которые должны быть представлены в векторной форме.

Не могли бы вы объяснить это?

...