ValueError:生成器的输出应为元组`(x,y,sample_weight)`或`(x,y)`。找到:<keras ...>

时间:2019-02-11 04:21:03

标签: python keras deep-learning

当我在Keras上训练vgg_face模型时,我使用了数据生成器,但遇到了以下问题:ValueError:生成器的输出应为元组(x, y, sample_weight)(x, y)。找到:

我已经尝试了有关类似问题的先前方法:ValueError:generator的输出应为元组(x, y, sample_weight)(x, y)。找到:没有,但是没有用。

def process_line(行):

path = '/home/apptech/pixeleye_test/apps/arup/dataset/AFAD-Full'
label_ages = np.asarray([line[1:3]])
label_genders = np.array([line[4:7]])
data = Image.open(path + line)
arr = np.asarray(data, dtype="float32")
arr = cv2.resize(arr, (224, 224))
#     return (arr,label_ages)
if label_ages and label_genders != None:
    return (arr, label_ages)

def generate_arrays_from_file(数据,批处理大小,数据生成):

# np_utils.to_categorical  onehot
while True:
    f = data
    cnt = 0
    X_Y = []
    X = []
    Y_age = []
    Y_gender = []
    for line in f:
        #             x,y_age,y_gender=process_line(line.strip('\n'))
        x, y_age = process_line(line.strip('\n'))[0], process_line(line.strip('\n'))[1]
        X.append(x)
        #             X_Y.append(x_y)
        Y_age.append(y_age)
        #             if int(y_gender)==111:
        #                 label=np.array([1,0])
        #                 Y_gender.append(label)
        #             if int(y_gender)==112:
        #                 label = np.array([0, 1])
        #                 Y_gender.append(label)
        cnt += 1
        if cnt == batch_size:
            cnt = 0
            datagen.fit(X)
            print(np.asarray(X).shape, np.asarray(Y_age).shape)
            yield datagen.flow(np.array(X), np.array(Y_age), batch_size=batch_size)
            #                 yield np.asarray(X), np.asarray(Y_age)
            X = []
            X_Y = []
            Y_age = []
            Y_gender = []
            #         f.close()

def模型(epochs,lr,batch_size):

content = open('/home/apptech/pixeleye_test/apps/arup/dataset/AFAD-Full/AFAD-Full.txt').readlines()
random.shuffle(content)
num = int(len(content) * 0.8)
train_data = content[:num]
test_data = content[num:]
# Convolution Features

vgg_model = VGGFace(model='resnet50', include_top=False, input_shape=(224, 224, 3),
                    pooling='max')  # pooling: None, avg or max
# custom parameters
last_layer = vgg_model.get_layer('avg_pool').output
x = Flatten(name='flatten')(last_layer)
out_age = Dense(units=1000, activation='relu', name='regression', kernel_regularizer=regularizers.l2(0.01))(x)
out_age1 = Dense(units=500, activation='relu', name='regression1', kernel_regularizer=regularizers.l2(0.01))(
    out_age)
out_age2 = Dense(units=100, name='regression2', kernel_regularizer=regularizers.l2(0.01))(out_age1)
out_age3 = Dense(units=1, name='regression3', kernel_regularizer=regularizers.l2(0.01))(out_age2)
out_gender = Dense(units=2, activation='softmax', name='classifier1')(x)

#     custom_vgg_model = Model(vgg_model.input, outputs=[out_age3, out_gender])
custom_vgg_model = Model(vgg_model.input, outputs=out_age3)

# Create the model
model = custom_vgg_model
sgd = optimizers.Adam(lr=0.001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.0, amsgrad=False)

#     model.compile(optimizer=sgd, loss=["mean_squared_error", "categorical_crossentropy"],
#                   metrics=['accuracy'])
model.compile(optimizer=sgd, loss=["mean_squared_error"],
              metrics=['accuracy'])

logging.debug("Model summary...")
model.count_params()
model.summary()

class Schedule:
    def __init__(self, nb_epochs, initial_lr):
        self.epochs = nb_epochs
        self.initial_lr = initial_lr

    def __call__(self, epoch_idx):
        if epoch_idx < self.epochs * 0.25:
            return self.initial_lr
        elif epoch_idx < self.epochs * 0.50:
            return self.initial_lr * 0.2
        elif epoch_idx < self.epochs * 0.75:
            return self.initial_lr * 0.04
        return self.initial_lr * 0.008

callbacks = [LearningRateScheduler(schedule=Schedule(epochs, lr)),
             ModelCheckpoint("/home/apptech/pixeleye_test/apps/arup/result/weights.{epoch:02d}-{val_loss:.2f}.hdf5",
                             monitor="val_loss",
                             verbose=1,
                             save_best_only=True,
                             mode="auto")
             ]
logging.debug("Running training...")

datagen = ImageDataGenerator(
    width_shift_range=0.1,
    height_shift_range=0.1,
    horizontal_flip=True,
    preprocessing_function=get_random_eraser(v_l=0, v_h=255))
# training_generator = MixupGenerator(X_train, [y_train_a, y_train_g], batch_size=32, alpha=0.2,
#                                     datagen=datagen)()

hist = model.fit_generator(generator=generate_arrays_from_file(train_data, batch_size, datagen),
                           steps_per_epoch=len(train_data) // batch_size,
                           validation_data=generate_arrays_from_file(test_data, batch_size, datagen),
                           validation_steps=len(test_data) // batch_size,
                           epochs=epochs, verbose=1,
                           callbacks=callbacks)

1 个答案:

答案 0 :(得分:0)

固定。

datagen.flow()返回一个生成器。要获取批次,请使用: X_batch,y_batch = datagen.flow(X_train,y_train,batch_size = 9).next()