использование вывода model.predict в качестве входных данных для другой модели - PullRequest
0 голосов
/ 13 июня 2018

Я пытаюсь использовать вывод model.predict как вход для другой модели.Это на самом деле для целей отладки, и почему я не использую get_layer.output или глобальную модель, которая объединяет эти две модели.

Я сталкиваюсь с этой ошибкой:

TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("input_1:0", shape=(?, 10, 10, 2048), dtype=float32) is not an element of this graph.

Вот мой текущий код:

Я использую приведенную ниже функцию в качестве узкого места генератора

def test_model_predictions(params):

        batch_size = params['batch_size'] #params just contains model parameters
        base_model = create_model() #this just creates an instance of Inception model with final layers cutoff
        train,_ = create_generators(params) #creats a generator for image files

        while True:
                for x, y in train:
                        predict1 = base_model.predict(x)

                        yield (predict1, y)




def training_bottleneck():


    bottleneck_train = test_model_predictions(params) #generator 



    def bottleneck_model_1():
        bottleneck_input = Input(shape = (10, 10, 2048))
        x = GlobalAveragePooling2D()(bottleneck_input)
        x = Dense(1024, activation='relu')(x)
        predictions = Dense(params['classes'], activation='softmax')(x)
        model = Model(inputs=bottleneck_input, outputs=predictions)
        return model




    model2 =  bottleneck_model_1()
    model2.compile(optimizer= optimizers.SGD(lr=0.0001, momentum=0.99),
                  loss='categorical_crossentropy', metrics = ['accuracy'])

    print('Starting model training')
    history = model2.fit_generator(bottleneck_train,
    steps_per_epoch = 1000,
    epochs = 85,
    shuffle= False,
    verbose = 2,  )
    return history

Есть какие-нибудь подсказки, как заставить это работать?

Спасибо.

РЕДАКТИРОВАТЬ: кажется, некоторая путаница относительно того, почему я делаю это таким образом, поэтому я добавлю еще немного информации.

Я специально использовал predict, потому что я заметилрасхождение при сохранении значений model.predict (значений узких мест) в файл hdf5 и последующей загрузке этих значений в другую модель (вторая половина исходной модели),

по сравнению с простой загрузкой всей модели и просто замораживаниемверхняя половина (не могу тренировать первую половину).Разница, которую я заметил, несмотря на использование одних и тех же гиперпараметров и, по сути, одинаковой модели, заключалась в том, что полная модель обучается правильно и сходится, в то время как модель, загружающая значения узкого места, на самом деле не улучшалась.Таким образом, я пытался понять, что слияние model.predict для сохранения значений узких мест стало причиной несоответствия между обеими моделями.

1 Ответ

0 голосов
/ 13 июня 2018

Таким образом, в основном вы хотите использовать прогноз одной модели в качестве входных данных для второй модели?В вашем коде вы смешиваете Tensors и "нормальные" структуры данных Python, которые не могут работать, так как вы должны построить граф вычисления дырок с Tensors.

Я предполагаю, что вы хотите использовать "предсказание" первой моделии добавить некоторые другие функции, чтобы сделать прогноз со второй моделью?В этом случае вы можете сделать следующее:

from keras.layers import Input, Dense, concatenate
input_1= Input(shape=(32,))
input_2= Input(shape=(64,))
out_1= Dense(48, input_shape=(32,))(input_1) # your model 1
x = concatenate([out_1, input_2]) # stack both feature vectors
x = Dense(1, activation='sigmoid')(x)    # your model 2
model = Model(inputs=[input_1, input_2], outputs=[x]) # if you want the outputs of model 1 you can add the output out1


history = model.fit([x_train, x_meta_train], y_train, ...)
...