|
-
-
- import tensorflow as tf
- from tensorflow import keras
- from tensorflow.keras import layers
-
-
- def parse_model_inputs(input_shape, input_tensor):
- if input_tensor is None:
- return layers.Input(shape=input_shape)
- else:
- if not keras.backend.is_keras_tensor(input_tensor):
- return layers.Input(tensor=input_tensor, shape=input_shape)
- else:
- return input_tensor
-
- def VGG11(
- *,
- include_rescaling = False,
- include_top = True,
- classes=1000,
- weights=None,
- input_shape=(224, 224, 3),
- input_tensor=None,
- pooling=None,
- classifier_activation="softmax",
- name="VGG11",
- **kwargs,
- ):
- """Instantiates the VGG16 architecture.
- Reference:
- - [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) (ICLR 2015)
- This function returns a Keras VGG16 model.
- Args:
- include_rescaling: whether or not to Rescale the inputs.If set to True,
- inputs will be passed through a `Rescaling(1/255.0)` layer.
- include_top: whether to include the 3 fully-connected
- layers at the top of the network. If provided, classes must be provided.
- classes: optional number of classes to classify images into, only to be
- specified if `include_top` is True.
- weights: one of `None` (random initialization), or a pretrained weight file path.
- input_shape: optional shape tuple, defaults to (224, 224, 3).
- input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
- to use as image input for the model.
- pooling: Optional pooling mode for feature extraction
- when `include_top` is `False`.
- - `None` means that the output of the model will be
- the 4D tensor output of the
- last convolutional block.
- - `avg` means that global average pooling
- will be applied to the output of the
- last convolutional block, and thus
- the output of the model will be a 2D tensor.
- - `max` means that global max pooling will
- be applied.
- classifier_activation: A `str` or callable. The activation function to use
- on the "top" layer. Ignored unless `include_top=True`. Set
- `classifier_activation=None` to return the logits of the "top" layer.
- When loading pretrained weights, `classifier_activation` can only
- be `None` or `"softmax"`.
- name: (Optional) name to pass to the model. Defaults to "VGG16".
- Returns:
- A `keras.Model` instance.
- """
- if weights and not tf.io.gfile.exists(weights):
- raise ValueError(
- "The `weights` argument should be either `None` or the path to the "
- "weights file to be loaded. Weights file not found at location: {weights}"
- )
-
- if include_top and not classes:
- raise ValueError(
- "If `include_top` is True, you should specify `classes`. "
- f"Received: classes={classes}"
- )
-
- inputs = parse_model_inputs(input_shape, input_tensor)
-
- x = inputs
- if include_rescaling:
- x = x * (1/ 255.)
-
- # Block 1
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv1"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block1_pool")(x)
-
- # Block 2
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv1"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block2_pool")(x)
-
- # Block 3
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv1"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block3_pool")(x)
-
- # Block 4
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block4_pool")(x)
-
- # Block 5
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block5_pool")(x)
-
- if include_top:
- x = layers.Flatten(name="flatten")(x)
- x = layers.Dense(4096, activation="relu", name="fc1")(x)
- x = layers.Dense(4096, activation="relu", name="fc2")(x)
- x = layers.Dense(
- classes, activation=classifier_activation, name="predictions"
- )(x)
- else:
- if pooling == "avg":
- x = layers.GlobalAveragePooling2D()(x)
- elif pooling == "max":
- x = layers.GlobalMaxPooling2D()(x)
-
- model = keras.Model(inputs, x, name=name, **kwargs)
-
- if weights is not None:
- model.load_weights(weights)
- return model
-
-
-
- def VGG13(
- *,
- include_rescaling = False,
- include_top = True,
- classes=1000,
- weights=None,
- input_shape=(224, 224, 3),
- input_tensor=None,
- pooling=None,
- classifier_activation="softmax",
- name="VGG13",
- **kwargs,
- ):
- """Instantiates the VGG16 architecture.
- Reference:
- - [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) (ICLR 2015)
- This function returns a Keras VGG16 model.
- Args:
- include_rescaling: whether or not to Rescale the inputs.If set to True,
- inputs will be passed through a `Rescaling(1/255.0)` layer.
- include_top: whether to include the 3 fully-connected
- layers at the top of the network. If provided, classes must be provided.
- classes: optional number of classes to classify images into, only to be
- specified if `include_top` is True.
- weights: one of `None` (random initialization), or a pretrained weight file path.
- input_shape: optional shape tuple, defaults to (224, 224, 3).
- input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
- to use as image input for the model.
- pooling: Optional pooling mode for feature extraction
- when `include_top` is `False`.
- - `None` means that the output of the model will be
- the 4D tensor output of the
- last convolutional block.
- - `avg` means that global average pooling
- will be applied to the output of the
- last convolutional block, and thus
- the output of the model will be a 2D tensor.
- - `max` means that global max pooling will
- be applied.
- classifier_activation: A `str` or callable. The activation function to use
- on the "top" layer. Ignored unless `include_top=True`. Set
- `classifier_activation=None` to return the logits of the "top" layer.
- When loading pretrained weights, `classifier_activation` can only
- be `None` or `"softmax"`.
- name: (Optional) name to pass to the model. Defaults to "VGG16".
- Returns:
- A `keras.Model` instance.
- """
- if weights and not tf.io.gfile.exists(weights):
- raise ValueError(
- "The `weights` argument should be either `None` or the path to the "
- "weights file to be loaded. Weights file not found at location: {weights}"
- )
-
- if include_top and not classes:
- raise ValueError(
- "If `include_top` is True, you should specify `classes`. "
- f"Received: classes={classes}"
- )
-
- inputs = parse_model_inputs(input_shape, input_tensor)
-
- x = inputs
- if include_rescaling:
- x = x * (1/ 255.)
-
- # Block 1
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv1"
- )(x)
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block1_pool")(x)
-
- # Block 2
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv1"
- )(x)
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block2_pool")(x)
-
- # Block 3
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv1"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block3_pool")(x)
-
- # Block 4
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block4_pool")(x)
-
- # Block 5
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block5_pool")(x)
-
- if include_top:
- x = layers.Flatten(name="flatten")(x)
- x = layers.Dense(4096, activation="relu", name="fc1")(x)
- x = layers.Dense(4096, activation="relu", name="fc2")(x)
- x = layers.Dense(
- classes, activation=classifier_activation, name="predictions"
- )(x)
- else:
- if pooling == "avg":
- x = layers.GlobalAveragePooling2D()(x)
- elif pooling == "max":
- x = layers.GlobalMaxPooling2D()(x)
-
- model = keras.Model(inputs, x, name=name, **kwargs)
-
- if weights is not None:
- model.load_weights(weights)
- return model
-
-
- def VGG16(
- *,
- include_rescaling = False,
- include_top = True,
- classes=1000,
- weights=None,
- input_shape=(224, 224, 3),
- input_tensor=None,
- pooling=None,
- classifier_activation="softmax",
- name="VGG16",
- **kwargs,
- ):
- """Instantiates the VGG16 architecture.
- Reference:
- - [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) (ICLR 2015)
- This function returns a Keras VGG16 model.
- Args:
- include_rescaling: whether or not to Rescale the inputs.If set to True,
- inputs will be passed through a `Rescaling(1/255.0)` layer.
- include_top: whether to include the 3 fully-connected
- layers at the top of the network. If provided, classes must be provided.
- classes: optional number of classes to classify images into, only to be
- specified if `include_top` is True.
- weights: one of `None` (random initialization), or a pretrained weight file path.
- input_shape: optional shape tuple, defaults to (224, 224, 3).
- input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
- to use as image input for the model.
- pooling: Optional pooling mode for feature extraction
- when `include_top` is `False`.
- - `None` means that the output of the model will be
- the 4D tensor output of the
- last convolutional block.
- - `avg` means that global average pooling
- will be applied to the output of the
- last convolutional block, and thus
- the output of the model will be a 2D tensor.
- - `max` means that global max pooling will
- be applied.
- classifier_activation: A `str` or callable. The activation function to use
- on the "top" layer. Ignored unless `include_top=True`. Set
- `classifier_activation=None` to return the logits of the "top" layer.
- When loading pretrained weights, `classifier_activation` can only
- be `None` or `"softmax"`.
- name: (Optional) name to pass to the model. Defaults to "VGG16".
- Returns:
- A `keras.Model` instance.
- """
- if weights and not tf.io.gfile.exists(weights):
- raise ValueError(
- "The `weights` argument should be either `None` or the path to the "
- "weights file to be loaded. Weights file not found at location: {weights}"
- )
-
- if include_top and not classes:
- raise ValueError(
- "If `include_top` is True, you should specify `classes`. "
- f"Received: classes={classes}"
- )
-
- inputs = parse_model_inputs(input_shape, input_tensor)
-
- x = inputs
- if include_rescaling:
- x = x * (1/ 255.)
-
- # Block 1
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv1"
- )(x)
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block1_pool")(x)
-
- # Block 2
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv1"
- )(x)
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block2_pool")(x)
-
- # Block 3
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv1"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv2"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv3"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block3_pool")(x)
-
- # Block 4
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv2"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv3"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block4_pool")(x)
-
- # Block 5
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv2"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv3"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block5_pool")(x)
-
- if include_top:
- x = layers.Flatten(name="flatten")(x)
- x = layers.Dense(4096, activation="relu", name="fc1")(x)
- x = layers.Dense(4096, activation="relu", name="fc2")(x)
- x = layers.Dense(
- classes, activation=classifier_activation, name="predictions"
- )(x)
- else:
- if pooling == "avg":
- x = layers.GlobalAveragePooling2D()(x)
- elif pooling == "max":
- x = layers.GlobalMaxPooling2D()(x)
-
- model = keras.Model(inputs, x, name=name, **kwargs)
-
- if weights is not None:
- model.load_weights(weights)
- return model
-
-
- def VGG19(
- *,
- include_rescaling = False,
- include_top = True,
- classes=1000,
- weights=None,
- input_shape=(224, 224, 3),
- input_tensor=None,
- pooling=None,
- classifier_activation="softmax",
- name="VGG19",
- **kwargs,
- ):
- """Instantiates the VGG19 architecture.
- Reference:
- - [Very Deep Convolutional Networks for Large-Scale Image Recognition](https://arxiv.org/abs/1409.1556) (ICLR 2015)
- This function returns a Keras VGG19 model.
- Args:
- include_rescaling: whether or not to Rescale the inputs.If set to True,
- inputs will be passed through a `Rescaling(1/255.0)` layer.
- include_top: whether to include the 3 fully-connected
- layers at the top of the network. If provided, classes must be provided.
- classes: optional number of classes to classify images into, only to be
- specified if `include_top` is True.
- weights: one of `None` (random initialization), or a pretrained weight file path.
- input_shape: optional shape tuple, defaults to (224, 224, 3).
- input_tensor: optional Keras tensor (i.e. output of `layers.Input()`)
- to use as image input for the model.
- pooling: Optional pooling mode for feature extraction
- when `include_top` is `False`.
- - `None` means that the output of the model will be
- the 4D tensor output of the
- last convolutional block.
- - `avg` means that global average pooling
- will be applied to the output of the
- last convolutional block, and thus
- the output of the model will be a 2D tensor.
- - `max` means that global max pooling will
- be applied.
- classifier_activation: A `str` or callable. The activation function to use
- on the "top" layer. Ignored unless `include_top=True`. Set
- `classifier_activation=None` to return the logits of the "top" layer.
- When loading pretrained weights, `classifier_activation` can only
- be `None` or `"softmax"`.
- name: (Optional) name to pass to the model. Defaults to "VGG19".
- Returns:
- A `keras.Model` instance.
- """
- if weights and not tf.io.gfile.exists(weights):
- raise ValueError(
- "The `weights` argument should be either `None` or the path to the "
- "weights file to be loaded. Weights file not found at location: {weights}"
- )
-
- if include_top and not classes:
- raise ValueError(
- "If `include_top` is True, you should specify `classes`. "
- f"Received: classes={classes}"
- )
-
- inputs = parse_model_inputs(input_shape, input_tensor)
-
- x = inputs
- if include_rescaling:
- x = x * (1 / 255.0)
-
- # Block 1
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv1"
- )(x)
- x = layers.Conv2D(
- 64, (3, 3), activation="relu", padding="same", name="block1_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block1_pool")(x)
-
- # Block 2
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv1"
- )(x)
- x = layers.Conv2D(
- 128, (3, 3), activation="relu", padding="same", name="block2_conv2"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block2_pool")(x)
-
- # Block 3
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv1"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv2"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv3"
- )(x)
- x = layers.Conv2D(
- 256, (3, 3), activation="relu", padding="same", name="block3_conv4"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block3_pool")(x)
-
- # Block 4
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv2"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv3"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block4_conv4"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block4_pool")(x)
-
- # Block 5
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv1"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv2"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv3"
- )(x)
- x = layers.Conv2D(
- 512, (3, 3), activation="relu", padding="same", name="block5_conv4"
- )(x)
- x = layers.MaxPooling2D((2, 2), strides=(2, 2), name="block5_pool")(x)
-
- if include_top:
- x = layers.Flatten(name="flatten")(x)
- x = layers.Dense(4096, activation="relu", name="fc1")(x)
- x = layers.Dense(4096, activation="relu", name="fc2")(x)
- x = layers.Dense(
- classes, activation=classifier_activation, name="predictions"
- )(x)
- else:
- if pooling == "avg":
- x = layers.GlobalAveragePooling2D()(x)
- elif pooling == "max":
- x = layers.GlobalMaxPooling2D()(x)
-
- model = keras.Model(inputs, x, name=name, **kwargs)
-
- if weights is not None:
- model.load_weights(weights)
- return model
|