Tensorflow: замена / заполнение заполнителя графа с помощью tf.Variable? - PullRequest
0 голосов
/ 04 мая 2018

У меня есть модель M1, чей ввод данных является заполнителем M1.input и чьи веса обучены. Моя цель состоит в том, чтобы построить новую модель M2, которая вычисляет выходной сигнал o из M1 (с его обученными весами) из входного значения w в форме tf.Variable (вместо подачи фактических значений в * 1008). *). Другими словами, я использую обученную модель M1 в качестве функции черного ящика для построения новой модели o = M1(w) (в моей новой модели необходимо изучить w, а веса M1 зафиксированы как константы ). Проблема в том, что M1 принимает только в качестве входных данных M1.input, через которые нам нужно передавать фактические значения, а не tf.Variable, как w.

В качестве наивного решения для построения M2 я могу просто вручную построить M1 в M2, а затем инициализировать веса M1 с предварительно обученными значениями и сохранить их не обучаемыми в M2. Однако на практике M1 является сложным, и я не хочу вручную строить M1 снова в M2. Я ищу более элегантное решение, что-то вроде временного решения или прямого решения для замены входного заполнителя M1.input из M1 на tf.Variable w.

Спасибо за ваше время.

1 Ответ

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

Это возможно. Как насчет:

import tensorflow as tf


def M1(input, reuse=False):
    with tf.variable_scope('model_1', reuse=reuse):
        param = tf.get_variable('param', [1])
        o = input + param
        return o


w = tf.get_variable('some_w', [1])
plhdr = tf.placeholder_with_default(w, [1])

output_m1 = M1(plhdr)

with tf.Session() as sess:

    sess.run(tf.global_variables_initializer())

    sess.run(w.assign([42]))

    print(sess.run(output_m1, {plhdr: [0]}))  # direct from placeholder
    print(sess.run(output_m1))                # direct from variable

Так что, когда feed_dict имеет значение для заполнителя, это значение используется. В противном случае активируется запасной вариант с использованием переменной «w».

...