def train_test_dog_breed_detector(do_model_test=True):
    '''
    Trains and tests the dog breed detector model

    :param do_model_test: set to True for running prediction on the test data
    :return: dog breed detector model
    '''
    # get train and validation data and labels
    data_extractor = DataExtractor('dog_images/train', 'dog_images/valid',
                                   'dog_images/test')

    train_data = data_extractor.load_train_data()
    train_labels, train_num_dog_breeds = data_extractor.load_train_labels()

    valid_data = data_extractor.load_valid_data()
    valid_labels, valid_num_dog_breeds = data_extractor.load_valid_labels()

    assert train_num_dog_breeds == valid_num_dog_breeds

    # create and init the model
    model = DogBreedDetectorModel(num_dog_breeds=train_num_dog_breeds)
    model.init_model(train_data)

    # train the model
    if not model.load_model():
        model.train(train_data, train_labels, valid_data, valid_labels)

    # load test data and predict
    if do_model_test:
        test_data = data_extractor.load_test_data()
        test_labels, test_num_dog_breeds = data_extractor.load_test_labels()
        assert train_num_dog_breeds == test_num_dog_breeds

        model.predict(test_data, test_labels)
    return model