Странное поведение в тензорном потоке, если входные данные - словарь - PullRequest
1 голос
/ 04 мая 2020

Версия Tensorflow: 2.1

ОС - ubuntu 20.04

Если мы используем параметр name при создании слоя 'Input`, тогда мы можем подавать входные данные в модель как словарь , Можно было бы ожидать, что ввод словаря действительно отобразит пары ключ: значение, но я боюсь, что этого не происходит. Ниже приведен минимальный воспроизводимый код, позволяющий заглянуть в проблему:

import tensorflow as tf
class IL(layers.Layer):
    def __init__(self):
        super().__init__()
    def call(self,inputs,training=True):
        return inputs

il = IL()
aa = tf.keras.Input((2,), name='a')
bb = tf.keras.Input((2,), name='b')
cc = tf.keras.Input((2,), name='c')
ix1 = {'pq':cc,'mn':aa,'yz':bb}
out1 = il(ix1)
model = tf.keras.Model(ix1, [out1])
x1 = {'1': np.arange(0,2,dtype=np.float32).reshape(-1,2),\
      '3': np.arange(10,12,dtype=np.float32).reshape(-1,2),
      'a': np.arange(20,22,dtype=np.float32).reshape(-1,2)}
y_pred = model(x1,training=True)

Ожидаемое поведение: x1 сопоставляется с соответствующими ключами. я не знаю, должны ли эти ключи быть именами слоев или входными данными, заданными для модели ix1.

Вопрос 1: Можете ли вы уточнить, для чего предназначены словарные ключи во входных данных?

Текущее поведение: концепция словаря полностью исключена. Происходит следующее: x1 будет отсортирован по ключам и передан в модель так, как если бы 1x1 также был отсортирован. Это означает, что в приведенном выше сценарии использования 'mn' ('a' в соответствии с именем слоя) будет отображаться в 1 в x1, pq в 3 и yz в a. Что здесь происходит? Я ищу немного понимания того, как все работает с tenorflow. Прямо сейчас это кажется такой же хитрой штуковиной палочек и камней, как и тензорный поток 1, который разбивает мне сердце

1 Ответ

0 голосов
/ 04 мая 2020

Входные данные x1 и клавиши ix1 сортируются перед подачей на модель. Поэтому они сопоставляются друг с другом в отсортированном порядке.

Возьмите примеры в вашем случае, если мы изменим x1 ключи на ['5', '3', '2'] и ix1 на ['1', '2', '3'], то они будут объединены с друг с другом в обратной последовательности.

Насколько мне известно, если мы определили ix1 и x1 с одинаковыми ключами, все будет хорошо.

Ниже приведен мой тестовый код :

import tensorflow as tf
from tensorflow.keras import layers
import numpy as np

class IL(layers.Layer):
    def __init__(self):
        super().__init__()
    def call(self,inputs,training=True):
        return inputs

il = IL()
aa = tf.keras.Input((2,), name='a')
bb = tf.keras.Input((2,), name='b')
cc = tf.keras.Input((2,), name='c')
ix1 = {'1':cc,'2':aa,'3':bb}
out1 = il(ix1)
model = tf.keras.Model(ix1, [out1])
x1 = {'5': np.arange(0,2,dtype=np.float32).reshape(-1,2),\
      '3': np.arange(10,12,dtype=np.float32).reshape(-1,2),
      '1': np.arange(20,22,dtype=np.float32).reshape(-1,2)}
y_pred = model(x1,training=True)
print(y_pred)

Вывод:

[{'1': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[20., 21.]], dtype=float32)>,
  '2': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[10., 11.]], dtype=float32)>,
  '3': <tf.Tensor: shape=(1, 2), dtype=float32, numpy=array([[0., 1.]], dtype=float32)>}]

Воспроизведение кодирования ~

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...