Керасы дают вход в промежуточный слой и получают окончательный вывод - PullRequest
0 голосов
/ 14 октября 2018

Моя модель представляет собой простую полностью подключенную сеть, подобную этой:

inp=Input(shape=(10,))
d=Dense(64, activation='relu')(inp)
d=Dense(128,activation='relu')(d)
d=Dense(256,activation='relu')(d)     #want to give input here, layer3
d=Dense(512,activation='relu')(d)
d=Dense(1024,activation='relu')(d)
d=Dense(128,activation='linear')(d)

Итак, после сохранения модели я хочу передать данные в слой 3. Что я сейчас делаю, так это:

model=load_model('blah.h5')    #above described network
print(temp_input.shape)        #(16,256), which is equal to what I want to give

index=3
intermediate_layer_model = Model(inputs=temp_input,
                                 outputs=model.output)

End_output = intermediate_layer_model.predict(temp_input)

Но это не работает, т.е. я получаю ошибки, такие как несовместимый ввод, вводы должны быть кортежами и т. Д. Сообщение об ошибке:

raise TypeError('`inputs` should be a list or tuple.') 
TypeError: `inputs` should be a list or tuple.

Есть ли способ передать моисобственные входы в середине сети и получить вывод вместо того, чтобы давать ввод в начале и получать вывод с конца?Любая помощь будет высоко оценена.

1 Ответ

0 голосов
/ 15 октября 2018

Сначала вы должны узнать, что в Keras, когда вы применяете слой к входу, создается новый узел внутри этого слоя , который соединяет тензоры входа и выхода.Каждый слой может иметь несколько узлов, соединяющих разные входные тензоры с соответствующими им выходными тензорами.Чтобы построить модель, эти узлы просматриваются и создается новый граф модели, который состоит из всех узлов, необходимых для достижения выходных тензоров из входных тензоров (т. Е. Которые вы указываете при создании модели: model = Model(inputs=[...], outputs=[...]).

Теперь вы хотите заполнить промежуточный слой модели и получить выходные данные модели. Так как это новый путь потока данных, нам нужно создать новые узлы для каждого слоя, соответствующего этому новому вычислительному графу. Мы можем сделатьэто примерно так:

idx = 3  # index of desired layer
input_shape = model.layers[idx].get_input_shape_at(0) # get the input shape of desired layer
layer_input = Input(shape=input_shape) # a new input tensor to be able to feed the desired layer

# create the new nodes for each layer in the path
x = layer_input
for layer in model.layers[idx:]:
    x = layer(x)

# create the model
new_model = Model(layer_input, x)

К счастью, ваша модель состоит из одной ветви, и мы могли бы просто использовать цикл for для создания новой модели. Однако для более сложных моделей может быть нелегкосделайте это, и вам может понадобиться написать больше кодов для построения новой модели.

...