为什么我的验证损失没有在多流模型上收敛?

时间:2019-01-14 07:40:34

标签: python keras conv-neural-network

我想合并在不同数据集上训练的两个CNN。我采用了两个顺序模型并将其合并。但是,使用自定义的fit_generato时,验证损失不会收敛。如何传递不同数据集的生成器?

input1_1 = keras.layers.Input(shape=(129,129,3))
x1 = keras.layers.Conv2D(kernel_size = (3,3), filters = 32, 
activation='PReLU')(input1_1)

x3 = keras.layers.MaxPooling2D(2,2)(x1)
x4 = keras.layers.Conv2D(kernel_size = (5,5), filters = 64, 
activation='relu')(x3)
x5 = keras.layers.MaxPooling2D(2,2)(x4)
x6 = keras.layers.Conv2D(kernel_size = (7,7), filters = 128, 
activation='relu')(x5)
d1_1 = keras.layers.Dropout(0.5)(x6)
br1_1= keras.layers.MaxPooling2D(2,2)(d1_1)
br1_1 = keras.layers.Flatten()(br1_1)


input2_2 = keras.layers.Input(shape=(129,129,3))
x1 = keras.layers.Conv2D(kernel_size = (3,3), filters = 32, 
activation='PReLU')(input2_2)

x3 = keras.layers.MaxPooling2D(2,2)(x1)
x4 = keras.layers.Conv2D(kernel_size = (5,5), filters = 64, 
activation='relu')(x3)
x5 = keras.layers.MaxPooling2D(2,2)(x4)
x6 = keras.layers.Conv2D(kernel_size = (7,7), filters = 128, 
activation='relu')(x5)
d2_2 = keras.layers.Dropout(0.5)(x6)
br2_2= keras.layers.MaxPooling2D(2,2)(d2_2)
br2_2 = keras.layers.Flatten()(br2_2)

added1_1 = keras.layers.concatenate([br1_1, br2_2], axis=1)
d2_3 = keras.layers.Dropout(0.5)(added1_1)
# d2_4 = keras.layers.Dropout(0.4)(d2_3)
out1_1 = keras.layers.Dense(159,activation='softmax',kernel_regularizer=regularizers.l2(0.01),
            activity_regularizer=regularizers.l1(0.01))(d2_3)
# model=keras.layers.Conv2DTranspose(kernel_size= (4,4), filters=10, activation='relu')(out)
modal1_1 = keras.models.Model(inputs=[input1_1,input2_2], outputs=out1_1)
modal1_1.summary()

我尝试压缩生成器(train_face,train_iris),但它没有完成任务。

def custom_iterator(Xp, Xs):

  from keras.preprocessing.image import ImageDataGenerator

  ig1 = ImageDataGenerator(rescale=1./255)
  ig2 = ImageDataGenerator(rescale=1./255)
  temp1 = ig1.flow_from_directory(Xp,target_size = (129, 129),batch_size = 
10,class_mode = "categorical")
  temp2 = ig2.flow_from_directory(Xs,target_size = (129, 129),batch_size = 
10,class_mode = "categorical")


  for batch in zip(temp1,temp2):


    yield [batch[0][0], batch[1][0]], [batch[0][1]]

执行Zip后,如果我调用fit generator,我的验证损失就不会收敛。

train_data_dir = "C:\\Users\\Desktop\\SDUMLA\\faceDataset\\mixTrain"
validation_data_dir = "C:\\Users\\Desktop\\SDUMLA\\faceDataset\\mixTest"
train_data_dir_nir = "C:\\Users\\Desktop\\SDUMLA\\IRIS(129_129)\\mixTrain"
validation_data_dir_nir = "C:\\Users\\Desktop\\SDUMLA\\IRIS(129_129)\\mixTest"
train_gen=custom_iterator(train_data_dir_nir, train_data_dir)
valid_gen=custom_iterator(validation_data_dir_nir, validation_data_dir)
nb_train_samples=2226
nb_validation_samples=1272
batch_size=10
Spe=nb_train_samples/ batch_size
valiStep=nb_validation_samples / batch_size


print ('compiling')
modal1_1.compile(optimizer=keras.optimizers.Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False),
          loss='categorical_crossentropy',
          metrics=['accuracy'])

hist=modal1_1.fit_generator(train_gen,
           steps_per_epoch = Spe,
           epochs = 200,verbose = 1,
           validation_data = valid_gen,
           validation_steps = valiStep)

我该怎么办?我在犯什么错误?

0 个答案:

没有答案