繁体   English   中英

如何在 model 适合之前连接两个生成器 object?

[英]How do concatenate two generator object before model fit?

我想用一个生成器规范化训练和验证图像,并使用另一个生成器从训练和验证视图中获取新图像。 然后我想分别组合和训练它们。 我该如何做这个合并操作? 我收到一个错误。

ValueError:model 层需要 1 个输入,但它接收到 2 个输入张量。 收到的输入:[<tf.Tensor 'IteratorGetNext:0' shape=(None, None, None, None) dtype=float32>, <tf.Tensor 'IteratorGetNext:1' shape=(None, None, None, None) dtype =浮动32>]

# Images Paths
train_path = "train/"
valid_path = "valid/"

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
from keras.utils.np_utils import to_categorical

# *********************TRAINING **************************
train_datagen1 = ImageDataGenerator(rescale=1./255)
train_generator1 = train_datagen1.flow_from_directory(
    train_path,
    save_to_dir="train_augm/",
    target_size=(224, 224),
    batch_size=6)

train_datagen2 = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=40,
    width_shift_range=0.2, 
    height_shift_range=0.2,
    zoom_range=[0.8, 1.2], 
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='nearest')
train_generator2 = train_datagen2.flow_from_directory(
    train_path,
    save_to_dir="train_augm/",
    target_size=(224, 224),
    batch_size=6)    


# ****************** VALIDATION *******************************
validation_datagen1 = ImageDataGenerator(rescale=1./255)
validation_generator1 = validation_datagen1.flow_from_directory(
    valid_path,
    save_to_dir="valid_augm/",
    target_size=(224, 224),
    batch_size=3)

validation_datagen2 = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=40,
    width_shift_range=0.2, 
    height_shift_range=0.2,
    zoom_range=[0.8, 1.2], 
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='nearest')
validation_generator2 = validation_datagen2.flow_from_directory(
    valid_path, 
    save_to_dir="valid_augm/",
    target_size=(224, 224), 
    batch_size=3) 

def combine_generator1(gen1, gen2):
    while True:
        X1i = gen1.next()
        X2i = gen2.next()
        yield [X1i[0], X2i[0]], X2i[1]  #Yield both images and their mutual label

def combine_generator2(gen_v1, gen_v2):
    while True:
        V1i = gen_v1.next()
        V2i = gen_v2.next()
        yield [V1i[0], V2i[0]], V2i[1]  #Yield both images and their mutual label
        
train_generator = combine_generator1(train_generator1, train_generator2)    
validation_generator = combine_generator2(validation_generator1, validation_generator2)

    
# *********************TRAINING THE MODEL ************************* 
history = new_model.fit(
    train_generator,
    #steps_per_epoch=null,
    epochs=5,
    validation_data = validation_generator,
    #validation_steps=null,
    shuffle = True,
    verbose = 1)

我使用了序列方法。 但这也没有用。

# Images Paths
train_path = "train/"
valid_path = "valid/"

from tensorflow.keras.preprocessing.image import ImageDataGenerator
import numpy as np
from keras.utils.np_utils import to_categorical
from tensorflow.keras.utils import Sequence

# *********************TRAIN **************************
train_datagen1 = ImageDataGenerator(rescale=1./255)
train_generator1 = train_datagen1.flow_from_directory(
    train_path,
    save_to_dir="train_augm/",
    target_size=(224, 224),
    batch_size=6)

train_datagen2 = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=40,
    width_shift_range=0.2, 
    height_shift_range=0.2,
    zoom_range=[0.8, 1.2], 
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='nearest')
train_generator2 = train_datagen2.flow_from_directory(
    train_path,
    save_to_dir="train_augm/",
    target_size=(224, 224),
    batch_size=6)    


# ****************** VALIDATION *******************************
validation_datagen1 = ImageDataGenerator(rescale=1./255)
validation_generator1 = validation_datagen1.flow_from_directory(
    valid_path,
    save_to_dir="valid_augm/",
    target_size=(224, 224),
    batch_size=3)

validation_datagen2 = ImageDataGenerator(
    rescale=1./255, 
    rotation_range=40,
    width_shift_range=0.2, 
    height_shift_range=0.2,
    zoom_range=[0.8, 1.2], 
    horizontal_flip=True,
    vertical_flip=True,
    fill_mode='nearest')
validation_generator2 = validation_datagen2.flow_from_directory(
    valid_path, 
    save_to_dir="valid_augm/",
    target_size=(224, 224), 
    batch_size=3) 

class MySequence(Sequence):
    def __init__(self, seq1, seq2):
        self.seq1, self.seq2 = seq1, seq2
    def __len__(self):
        return len(self.seq1)
    def __getitem(self, idx):
        x1, y1 = self.seq1[idx]
        x2, y2 = self.seq2[idx]
        return [x1, x2], [y1, y2]

my_seq_t = MySequence(train_generator1, train_generator2)
my_seq_v = MySequence(validation_generator1, validation_generator2)
 
# *********************TRAINING THE MODEL *************************
history = new_model.fit(
    my_seq_t,
    #steps_per_epoch=null, # train_samples / batch_size 
    epochs=5,
    validation_data = my_seq_v,
    #validation_steps=null, # valid_samples / batch_size 
    #callbacks=callback
    shuffle = True,
    verbose = 1)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM