keras K.function error для извлечения вывода слоя - PullRequest
0 голосов
/ 28 мая 2019

В настоящее время у меня есть модифицированная архитектура resnet 50, которая принимает два входа. Построение модели и обучение модели работает нормально, но когда я пытаюсь извлечь выходные данные слоя, используя функцию бэкэнда, я сталкиваюсь с ошибками.

Я бы предпочел извлекать слои, используя бэкэнд-функцию, а не создавать новую усеченную модель, используя только интересующий меня слой в качестве вывода.

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

Я пытался переформатировать функцию несколькими способами, например K.function( [ mymodel.input[0],mymodel.input[1] ] , [mymodel.layers[-1].layers[-6].output]) или же K.function( [ mymodel.layers[0].input,mymodel.layers[1].input ] , [mymodel.layers[-1].layers[-6].output]) но, похоже, ничего не решает проблему

##imports
from keras.applications.resnet50 import ResNet50
from keras.layers import Input
from keras.layers import Lambda
from keras.models import Model
from keras.optimizers import Adam
import keras
import keras.backend as K
import numpy as np

#pop off the input
res = ResNet50(weights=None,include_top=True,classes=2)
res.layers.pop(0)

#add two inputs
auxinput= Input(batch_shape=(None,224,224,1), name='aux_input')
main_input = Input(batch_shape=(None,224,224,3), name='main_input')

#use a lambda functon to return just our main input (avoids errors from out auxilary input not being used in resnet50 component)
l_output = Lambda(lambda x: x[0])([main_input, auxinput])

#feed our main layer to resnet50
data_passed_thru = res(l_output)

#assemble the model with our two inputs, and output
mymodel = Model(inputs=[main_input, auxinput], outputs=[data_passed_thru])
mymodel.compile(optimizer=Adam(lr=0.001), loss= keras.losses.poisson, metrics=[ 'accuracy'])
print("my model summary:")
mymodel.summary()

##generate some fake data for testing
fake_aux= np.zeros((224,224))
fake_aux=fake_aux[None,...]
fake_aux=fake_aux[...,None]
print('fake aux input shape:', fake_aux.shape)
fake_main= np.zeros((224,224,3))
fake_main=fake_main[None,...]
print('fake main input shape:', fake_main.shape)

#check our model inputs and target layer
print("inputs:", mymodel.input)
print("layer outout I'm trying to extract:", mymodel.layers[-1].layers[-6])

#create function to feed inputs, get our desired layer outputs
get_output_func = K.function( mymodel.input ,  [mymodel.layers[-1].layers[-6].output])

##this is the line that fails
X= [fake_main,fake_aux]
preds=get_output_func(X)

Я получаю сообщение об ошибке

InvalidArgumentError: You must feed a value for placeholder tensor 'input_1' with dtype float and shape [?,224,224,3]
     [[{{node input_1}}]]

1 Ответ

0 голосов
/ 30 мая 2019

Мне удалось это исправить, обратившись к входам Resnet50 непосредственно для функции, а не только к начальным входам всей модели. K.function, которая работает:

get_output_func = K.function( [mymodel.layers[-1].get_input_at(0)] ,  [mymodel.layers[-1].layers[-6].output])
X= [fake_main]
preds=get_output_func(X)

Это работает только потому, что моя архитектура зависит только от прохождения 1 входа, поэтому не уверен, что решение будет для других ситуаций, но работает для моего случая

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