[英]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.