Один и тот же вход для нескольких сетей глубокого обучения - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь создать башню, подобную той, что упомянута здесь ( Как иметь параллельные сверточные слои в кератах? ) с VGG16 и VGG19. Я читаю изображения из каталога, используя flow_from_directory для поезда и действительный. Я буду загружать VGG16 и VGG19 с использованием предварительно обученных весов imagenet, а затем объединю слои в качестве входных данных для некоторых других моделей. У меня проблемы с попыткой выяснить, как один и тот же вход подается на несколько моделей. Я встретил эту функцию генератора на одном форуме, который я использую. Это будет передавать несколько изображений в сеть в качестве входных данных. Однако в моем случае это выглядит излишним.

def generate_generator_multiple(generator,dir1, dir2, batch_size, img_height,img_width):
    genX1 = generator.flow_from_directory(dir1, target_size = (img_height,img_width), class_mode = 'categorical', batch_size = batch_size, shuffle=False, seed=7)
    genX2 = generator.flow_from_directory(dir2, target_size = (img_height,img_width), class_mode = 'categorical', batch_size = batch_size, shuffle=False, seed=7)
    while True:
            X1i = genX1.next()
            X2i = genX2.next()

            yield [X1i[0], X2i[0]], X2i[1]  #Yield both images and their mutual label 

Существует ли более простой способ передачи одного и того же входа в несколько сетей вместо нескольких входов. Я пробовал код из https://datascience.stackexchange.com/questions/30423/how-to-pass-common-inputs-to-a-merged-model-in-keras?answertab=active#tab-top,, но он дает мне ошибку отключения графика.

1 Ответ

0 голосов
/ 11 октября 2019

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

import keras
import numpy as np
import tensorflow as tf
from keras.layers import Input, Dense

tf.reset_default_graph()

# assume this is your model
def nn_model(input_x, n):
    feature_maker = Dense(n, activation='relu')(input_x)
    feature_maker = Dense(20, activation='relu')(feature_maker)
    feature_maker = Dense(1, activation='linear')(feature_maker)
    return feature_maker

input_layer = Input(shape=(3, ))
output_1 = nn_model(input_layer, 10)
output_2 = nn_model(input_layer, 20)
output_3 = nn_model(input_layer, 30)

model = keras.models.Model(inputs=input_layer, outputs=[output_1, output_2, output_3])

Вы можете построить эту модель по

from keras.utils.vis_utils import plot_model

plot_model(model, show_shapes=True)
* 1006. * Модель выглядит как

enter image description here

И эту модель можно обучить по

model.compile(loss='mse', optimizer='adam')

# example training set
x = np.linspace(1, 90, 270).reshape(90, 3)
y1 = np.random.rand(90)
y2 = np.random.rand(90) * 2
y3 = np.random.rand(90) * 3

model.fit(x, [y1, y2, y3], batch_size=32, epochs=10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...