def fit(cls, n_epoch=50, batch_size=96, image_size=(64, 64)):
        """ Learn face images from databases.
        use images at reception_robot.person.face_imgs
        Returns:
        """
        (X, Y), (X_test, Y_test) = Person.train_test_images_ids(
            image_size=image_size)
        print(X.shape, Y.shape, X_test.shape, Y_test.shape)
        person_ids = np.sort(list(set(Y))).tolist()
        print("person_ids: {}".format(person_ids))
        person_num = len(person_ids)
        print("label_num: {}".format(person_num))
        X, Y = shuffle(X, Y)
        Y = cls.to_categorical(Y, person_ids)
        Y_test = cls.to_categorical(Y_test, person_ids)

        face_recognizer_search_query = {
            'n_epoch': n_epoch,
            'batch_size': batch_size,
            'image_size': image_size,
            'person_ids': person_ids,
        }
        # face recognizer
        face_recognizer = cls.objects(**face_recognizer_search_query).first()
        if face_recognizer is None:
            face_recognizer = cls(**face_recognizer_search_query,
                                  person_num=person_num)

        network = face_recognizer.generate_network()
        # Train using classifier
        run_id = 'face_cnn'
        model = tflearn.DNN(network, tensorboard_verbose=3,
                            tensorboard_dir='tensorboard_log',
                            checkpoint_path='checkpoints/{}'.format(run_id))
        model.fit(X, Y, n_epoch=n_epoch, shuffle=True,
                      validation_set=(X_test, Y_test),
                      show_metric=True, batch_size=batch_size, run_id=run_id)
        import os
        try:
            os.makedirs('models')
        except Exception as e:
            print(e)
        model.save(face_recognizer.generate_filename())
        face_recognizer.save()