def test_samples(fmodel_and_data: ModelAndData, batchsize: int) -> None: fmodel, _, _ = fmodel_and_data if hasattr(fmodel, "data_format"): data_format = fmodel.data_format # type: ignore x, y = fbn.samples(fmodel, batchsize=batchsize) assert len(x) == len(y) == batchsize assert not ep.istensor(x) assert not ep.istensor(y) x, y = fbn.samples(fmodel, batchsize=batchsize, data_format=data_format) assert len(x) == len(y) == batchsize assert not ep.istensor(x) assert not ep.istensor(y) with pytest.raises(ValueError): data_format = { "channels_first": "channels_last", "channels_last": "channels_first", }[data_format] fbn.samples(fmodel, batchsize=batchsize, data_format=data_format) else: x, y = fbn.samples(fmodel, batchsize=batchsize, data_format="channels_first") assert len(x) == len(y) == batchsize assert not ep.istensor(x) assert not ep.istensor(y) with pytest.raises(ValueError): fbn.samples(fmodel, batchsize=batchsize)
def jax_simple_model(request: Any) -> ModelAndData: import jax def model(x: Any) -> Any: return jax.numpy.mean(x, axis=(1, 2)) bounds = (0, 1) fmodel = fbn.JAXModel(model, bounds=bounds) x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16, data_format="channels_last") x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y
def tensorflow_resnet50(request: Any) -> ModelAndData: if request.config.option.skipslow: pytest.skip() import tensorflow as tf model = tf.keras.applications.ResNet50(weights="imagenet") preprocessing = dict(flip_axis=-1, mean=[104.0, 116.0, 123.0]) # RGB to BGR fmodel = fbn.TensorFlowModel(model, bounds=(0, 255), preprocessing=preprocessing) x, y = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = ep.astensor(y) return fmodel, x, y
def tensorflow_simple_functional(request: Any) -> ModelAndData: import tensorflow as tf channels = 3 h = w = 224 data_format = tf.keras.backend.image_data_format() shape = (channels, h, w) if data_format == "channels_first" else (h, w, channels) x = x_ = tf.keras.Input(shape=shape) x = tf.keras.layers.GlobalAveragePooling2D()(x) model = tf.keras.Model(inputs=x_, outputs=x) bounds = (0, 1) fmodel = fbn.TensorFlowModel(model, bounds=bounds) x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y
def tensorflow_simple_sequential( device: Optional[str] = None, preprocessing: fbn.types.Preprocessing = None) -> ModelAndData: import tensorflow as tf with tf.device(device): model = tf.keras.Sequential() model.add(tf.keras.layers.GlobalAveragePooling2D()) bounds = (0, 1) fmodel = fbn.TensorFlowModel(model, bounds=bounds, device=device, preprocessing=preprocessing) x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y
def pytorch_resnet18(request: Any) -> ModelAndData: if request.config.option.skipslow: pytest.skip() import torchvision.models as models model = models.resnet18(pretrained=True).eval() preprocessing = dict(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225], axis=-3) fmodel = fbn.PyTorchModel(model, bounds=(0, 1), preprocessing=preprocessing) x, y = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = ep.astensor(y) return fmodel, x, y
def tensorflow_simple_subclassing(request: Any) -> ModelAndData: import tensorflow as tf class Model(tf.keras.Model): # type: ignore def __init__(self) -> None: super().__init__() self.pool = tf.keras.layers.GlobalAveragePooling2D() def call(self, x: tf.Tensor) -> tf.Tensor: # type: ignore x = self.pool(x) return x model = Model() bounds = (0, 1) fmodel = fbn.TensorFlowModel(model, bounds=bounds) x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y
def pytorch_simple_model( device: Any = None, preprocessing: fbn.types.Preprocessing = None) -> ModelAndData: import torch class Model(torch.nn.Module): def forward(self, x: torch.Tensor) -> torch.Tensor: # type: ignore x = torch.mean(x, 3) x = torch.mean(x, 2) return x model = Model().eval() bounds = (0, 1) fmodel = fbn.PyTorchModel(model, bounds=bounds, device=device, preprocessing=preprocessing) x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y
def foolbox2_simple_model(channel_axis: int) -> ModelAndData: class Foolbox2DummyModel(foolbox.models.base.Model): # type: ignore def __init__(self) -> None: super().__init__(bounds=(0, 1), channel_axis=channel_axis, preprocessing=(0, 1)) def forward(self, inputs: Any) -> Any: if channel_axis == 1: return inputs.mean(axis=(2, 3)) elif channel_axis == 3: return inputs.mean(axis=(1, 2)) def num_classes(self) -> int: return 3 model = Foolbox2DummyModel() fmodel = fbn.Foolbox2Model(model) with pytest.warns(UserWarning): x, _ = fbn.samples(fmodel, dataset="imagenet", batchsize=16) x = ep.astensor(x) y = fmodel(x).argmax(axis=-1) return fmodel, x, y