График отключается при попытке создания моделей в Keras с помощью метода .get_layer - PullRequest
0 голосов
/ 31 декабря 2018

В обычном коде я делаю что-то вроде этого, и все работает нормально:

from keras.layers import Input, Dense
from keras.models import Model
import keras.backend as K
import numpy as np
import tensorflow as tf
from sklearn.datasets import make_blobs

X, y = make_blobs(500,50,2)

def make_network1():
    input_layer = Input((50,))
    layer1 = Dense(100,name='network1_dense1')(input_layer)
    output = Dense(50,name='network1_dense2')(layer1)
    model = Model(input_layer,output)

    return model

def make_network2():
    input_layer = Input((50,))
    layer1 = Dense(100,name='network2_dense1')(input_layer)
    output = Dense(1,name='network2_output')(layer1)
    model = Model(input_layer,output)

    return model

network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)

model = Model(network1.input, output)

Теперь я хочу поэкспериментировать с методом .get_layer и атрибутом .output в Keras, заменивпоследняя строка кода с:

model = Model(network1.input, network2.get_layer('network2_output').output)

Затем выдается следующая ошибка:

График отключен: невозможно получить значение для тензорного тензора ("input_4: 0", shape =(?, 50), dtype = float32) на уровне "input_4".Следующие предыдущие слои были доступны без проблем: []

Мой вопрос

Однако, не должно ли быть output и network2.get_layer('network2_output').output одним и тем же?Когда я пытаюсь распечатать их обоих, он говорит:

Тензор ("model_14 / network2_output / BiasAdd: 0", shape = (?, 1), dtype = float32)

и

Тензор ("network2_output_1 / BiasAdd: 0", shape = (?, 1), dtype = float32)

И network2уже подключен к выходу network1, я не понимаю, почему он отключен.Как заставить код работать с методами .get_layer и .output?

Я использую keras == 2,24 и tenorflow-gpu == 1,5.

Ответы [ 2 ]

0 голосов
/ 31 декабря 2018

не должен выводиться, а network2.get_layer ('network2_output'). Выводить одно и то же?

Нет !, это не одно и то же.Позвольте мне объяснить, что здесь происходит

network1 = make_network1()
network2 = make_network2()
output = network2(network1.output)

Сначала вы создаете две модели с одним входом для каждого слоя, а затем вы заменяете вход второй модели на выход последних слоев первой модели.Таким образом, вы вводите переменную output в качестве ввода для первой модели.Таким образом, network1.inputs и output связаны между собой.Но в следующей строке нет связи между network1.input и network2.get_layer('network2_output').output

model = Model(network1.input, network2.get_layer('network2_output').output)
0 голосов
/ 31 декабря 2018

После запуска этой строки:

output = network2(network1.output)

модель network2 имеет два потока вычислений: один - исходный, построенный при выполнении make_network2(), а другой - поток вычислений с network1.output в качествевход строится при запуске вышеуказанной строки.Следовательно, он будет иметь два выхода, соответствующих каждому из этих двух потоков вычислений:

>>> network2.get_output_at(0)
<tf.Tensor 'network2_output_4/BiasAdd:0' shape=(?, 1) dtype=float32>

>>> network2.get_output_at(1)
<tf.Tensor 'model_14/network2_output/BiasAdd:0' shape=(?, 1) dtype=float32>

Поэтому, когда вы хотите перейти от network1.input к выходу модели network2, вы должны использоватьвторой выход, который подключен к network1.input:

model = Model(network1.input, network2.get_output_at(1))

По существу, network2.get_output_at(1) эквивалентен output, полученному в этой строке: output = network2(network1.output).

...