Keras: как использовать fit_generator с несколькими типами ввода (объединенная сеть)

моя модель: введите здесь описание изображения

Я хочу использовать для этого генератор данных изображений. Я написал этот код для ввода 3vgg, который дает изображения в качестве входных данных, но я не знал, как генерировать и для mlp...

from keras.preprocessing.image import ImageDataGenerator
batch_size=2
# Define the image transformations here
gen = ImageDataGenerator(rotation_range=10,
        zoom_range=0.10,
        width_shift_range=0.2,
        height_shift_range=0.2,
        shear_range=0.15,
        horizontal_flip=True,
    # brightness_range=[0.2,1.0],
        fill_mode="nearest")

# Here is the function that merges our two generators
# We use the exact same generator with the same random seed for both the y and angle arrays
def generator_three_img(X1, X2, X3, y, batch_size):
    genX1 = gen.flow(X1, y,  batch_size=batch_size, seed=1)
    genX2 = gen.flow(X2, y, batch_size=batch_size, seed=1)
    genX3 = gen.flow(X3, y, batch_size=batch_size, seed=1)
    while True:
        X1i = genX1.next()
        X2i = genX2.next()
        X3i = genX3.next()
        # X4i = genX4.next()

        yield [X1i[0], X2i[0], X3i[0]], X1i[1]

# Finally create generator
gen_flow = generator_three_img(im_train_whole,im_train_L,im_train_R,y_train_whole,2)

person vajihe Tavakoli    schedule 11.02.2021    source источник
comment
Вы не должны использовать фрагмент стека для языков, отличных от JS. // Также включите язык тегов -- я добавил его для вас.   -  person user202729    schedule 11.02.2021
comment
Похоже, у вас уже есть какой-то рабочий код, так что же такое неработающий код и его сообщения об ошибках?   -  person user202729    schedule 11.02.2021


Ответы (2)


вы можете передать свой ввод в виде списка данных
пример: model.fit([trainDataset1, trainImages2], y_train,...)
лучший способ — вернуть сгенерированные данные в этой форме, как объяснено здесь.

person Pykeras    schedule 11.02.2021

Это работает для меня с TF2.4.1 вместе с

tf.data.Dataset.from_generator

Если вы хотите, чтобы ваша модель имела несколько входных данных, убедитесь, что сначала ваши входные слои названы правильно, например.

input_x_1 = Input(shape=(10,), name='input_1')
input_x_2 = Input(shape=(10,), name='input_2')
x_1 = Dense(16)(input_x_1)
x_2 = Dense(16)(input_x_2)
x_concat = concatenate([x_1,x_2])
decoded = Dense(32)(x_concat)
Model(inputs=[input_x_1,input_x_2], outputs=decoded, name='super_model')

После этого убедитесь, что генератор возвращает правильные имена:

def _input_fn():
  x1 = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.int64)
  x2 = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.int64)
  x1 = np.reshape(x1, (10, 1))
  x2 = np.reshape(x2, (10, 1))

  labels = np.array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=np.int64)
  y = np.reshape(labels, (10, 1))

  def generator():
      yield {"input_1": x1, "input_2": x2}, y

  dataset = tf.data.Dataset.from_generator(generator, output_types=({"input_1": tf.int64, "input_2": tf.int64}, tf.int64))
  dataset = dataset.batch(2)
  return dataset

...
model.fit(_input_fn(), epochs=100, steps_per_epoch=10)
person Alexander    schedule 23.03.2021