Как изменить формы заполнителя тензорного потока для вывода - PullRequest
0 голосов
/ 27 марта 2020

Я использую tenorflow 1.13.1

Я работаю над системой машинного обучения с использованием tenorflow. Одной из функций, которые я добавляю в свою сеть, является тензор длины N, который является результатом выполнения нескольких умножений матриц с использованием реальных данных. Мы делаем это вычисление в тензорном потоке (а не numpy или pandas), потому что обучение / тестирование значительно ускоряются за счет сохранения всего внутри графика тензорного потока, а не выполнения вычисления функции вне графика, а затем подачи его в в качестве дополнительного заполнителя.

Упрощенный взгляд на это:

input_array = tf.placeholder(dtype=tf.float32, shape=[None, 100]) # Incoming data
input_expanded = tf.expand_dims(input_array, 1) # Reshape to make the matmul later on work

W1_original = np.random.random((1000, 100, 100)) # np array of shape [1000, 100, 100]
W1_date_tensor = tf.convert_to_tensor(W1_original, dtype=tf.float32) # [1000, 100, 100]

W2_original = np.random.random((1000, 100)) # np.array of shape [1000, 100]
W2_date_tensor = tf.convert_to_tensor(W2_original, dtype=tf.float32) # [1000, 100]

training_date = tf.placeholder(dtype=tf.int32, shape=[None]) # The date of data I want to index into
w1 = tf.gather(W1_date_tensor, training_date, axis=0) # W1 for today, [None, 100, 100]
w2 = tf.gather(W2_date_tensor, training_date, axis=0) # W2 for today, [None, 100]
w2_expanded = tf.expand_dims(w2, 2) # The reshaped W2, [None, 100, 1]


y_1 = tf.matmul(expanded_input, w1) # [None, 1, 100]
y_2 = tf.matmul(y_1, w2_expanded) # [None, 1, 1]
feature = tf.reshape(y_2, [-1]) # [None]

Объяснение вышесказанного:

  • Мы тренируемся по сериям времени, которые имеет растущий набор элементов в нашем списке. Размер совокупности элементов во время обучения (от даты начала обучения до даты окончания обучения) составляет 100
    • Возможные даты: [2019-01-01, ..., 2019-12-31]
    • В 2019-01-01 в input_array имеется 10 элементов, поэтому первые 10 элементов заполняются, а значения от 11 до 100 равны 0.
    • Каждые несколько дней добавляется другой элемент, так что у нас есть 11 заполненных значений, 12, 13 и т. д. c, остальные по-прежнему равны 0 с.
    • К концу временных рядов у нас есть 100 заполненных элементов
  • W1 и W2 представляют известные в реальном мире значения для тех элементов (не выученные переменные), которые используются для получения нашей функции позже

Проблема в том, что в режиме вывода я не знать размер дневного input_array (или W1 или W2) до этого дня. (Это может быть то же самое, что и вчерашние дни, или это может быть N + 1)

Поэтому я хотел бы иметь возможность загрузить свой график, а затем заменить новые значения для W1 и W2, которые могут иметь разные формы из оригинальных тензоров, которые были в графике.

Возможно ли это?


Редактировать: Нашли решение

Мы решили это таким образом, на случай, если кто-нибудь из пользователей столкнется с этой проблемой:

  1. Начало дня при выводе, мы загружаем нашу модель, используя только переменные, и реинициализируем все наши заполнители, используя текущие данные, чтобы мы знали, каков наш N.
  2. Как только мы полностью инициализировав график, мы сохраняем его в protobuf. * ​​1041 *
  3. Процесс, который делает вывод для этого дня, загружает protobuf, а затем использует его без необходимости изменять сам график.
  4. Мы повторяйте это каждый день, используя одну и ту же исходную модель, таким образом, наши переменные тензоры одинаковы, но формы промежуточных заполнителей могут быть произвольными в зависимости от дня.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...