def test_predict_non_ensemble(batch_size: int, empty_labels: bool) -> None: config = ConstantScalarConfig(1.) model_and_info = ModelAndInfo(config=config, model_execution_mode=ModelExecutionMode.TEST, checkpoint_path=None) model_loaded = model_and_info.try_create_model_load_from_checkpoint_and_adjust( ) assert model_loaded model = model_and_info.model pipeline = ScalarInferencePipeline(model, config, 0, 0) actual_labels = torch.zeros( (batch_size, 1)) * np.nan if empty_labels else torch.zeros( (batch_size, 1)) data = { "metadata": [GeneralSampleMetadata(id='2')] * batch_size, "label": actual_labels, "images": torch.zeros( ((batch_size, 1) + config.expected_image_size_zyx)), "numerical_non_image_features": torch.tensor([]), "categorical_non_image_features": torch.tensor([]), "segmentations": torch.tensor([]) } results = pipeline.predict(data) ids, labels, predicted = results.subject_ids, results.labels, results.model_outputs assert ids == ['2'] * batch_size assert torch.allclose(labels, actual_labels, equal_nan=True) # The model always returns 1, so predicted should be sigmoid(1) assert torch.allclose(predicted, torch.full((batch_size, 1), 0.731058578))
def test_predict_non_ensemble(batch_size: int, empty_labels: bool) -> None: config = ConstantScalarConfig(1.) model = create_lightning_model(config, set_optimizer_and_scheduler=False) assert isinstance(model, ScalarLightning) pipeline = ScalarInferencePipeline(model, config, 0) actual_labels = torch.zeros( (batch_size, 1)) * np.nan if empty_labels else torch.zeros( (batch_size, 1)) data = { "metadata": [GeneralSampleMetadata(id='2')] * batch_size, "label": actual_labels, "images": torch.zeros( ((batch_size, 1) + config.expected_image_size_zyx)), "numerical_non_image_features": torch.tensor([]), "categorical_non_image_features": torch.tensor([]), "segmentations": torch.tensor([]) } results = pipeline.predict(data) ids, labels, predicted = results.subject_ids, results.labels, results.posteriors assert ids == ['2'] * batch_size assert torch.allclose(labels, actual_labels, equal_nan=True) # The model always returns 1, so predicted should be sigmoid(1) assert torch.allclose(predicted, torch.full((batch_size, 1), 0.731058578))
def test_predict_non_ensemble(batch_size: int, empty_labels: bool) -> None: config = ClassificationModelForTesting() model: Any = ScalarOnesModel(config.expected_image_size_zyx, 1.) update_model_for_multiple_gpus(ModelAndInfo(model), args=config, execution_mode=ModelExecutionMode.TEST) pipeline = ScalarInferencePipeline(model, config, 0, 0) actual_labels = torch.zeros( (batch_size, 1)) * np.nan if empty_labels else torch.zeros( (batch_size, 1)) data = { "metadata": [GeneralSampleMetadata(id='2')] * batch_size, "label": actual_labels, "images": torch.zeros( ((batch_size, 1) + config.expected_image_size_zyx)), "numerical_non_image_features": torch.tensor([]), "categorical_non_image_features": torch.tensor([]), "segmentations": torch.tensor([]) } results = pipeline.predict(data) ids, labels, predicted = results.subject_ids, results.labels, results.model_outputs assert ids == ['2'] * batch_size assert torch.allclose(labels, actual_labels, equal_nan=True) # The model always returns 1, so predicted should be sigmoid(1) assert torch.allclose(predicted, torch.full((batch_size, 1), 0.731058578))