Dieser Artikel beschreibt Folgendes und implementiert die Maxout-Funktion in Python-Code.
In diesem Artikel wird die Maxout-Funktion implementiert, damit sie als Keras-Ebene verwendet werden kann. Der Code und die Beschreibung sind am Ende.
Die Maxout-Funktion wird als Schichtaktivierungsfunktion in Deep Learning-Modellen wie CNN und DNN verwendet. Der Hauptvorteil der Verwendung der Maxout-Funktion als Aktivierungsfunktion besteht darin, dass Sie Daten an die nächste Ebene übergeben können, ohne die Größe der von der vorherigen Ebene angegebenen Daten zu ändern.
Um dies zu erklären, verwenden CNNs und DNNs im Allgemeinen häufig eine Pooling-Schicht, um die Datengröße zu verringern, während die Maxout-Funktion die Anzahl der Dimensionen entsprechend der Anzahl der Kanäle verringert, anstatt die Größe zu verringern. Ich mache. Dies macht die Verwendung der Pooling-Ebene unnötig und wird verwendet, wenn Sie die Größe der Daten in der Ebene so weit wie möglich beibehalten möchten. (Tatsächlich wird es in der CNN-Schicht verwendet und häufig in Kombination mit der Pooling-Schicht verwendet.)
Die Maxout-Funktion kann wie folgt ausgedrückt werden, wenn sie in eine mathematische Formel geschrieben wird.
Was die Maxout-Funktion tatsächlich tut, ist, das Maximum der Pixel zu nehmen, die sich in jeder Dimension (Kanal, Feature-Map) an derselben Stelle befinden, und dieses als Pixel der Ausgabedaten zu verwenden. Das Bild unten sieht aus wie in der Abbildung unten.
Reference https://www.google.com/url?sa=i&url=https%3A%2F%2Flink.springer.com%2Farticle%2F10.1186%2Fs40537-019-0233-0&psig=AOvVaw2-jjWv_TTq3t2bz_Py6_S0&ust=1592137921627000&source=images&cd=vfe&ved=0CA0QjhxqFwoTCOiAvJDm_ukCFQAAAAAdAAAAABAD
Wenn Sie es tatsächlich als Code implementieren, können Sie die Anzahl der Dimensionen nach der Ausgabe angeben. Beispielsweise sei die Anzahl der Ausgangsdimensionen 2 und die Anzahl der Eingangsdimensionen N. In diesem Fall werden die Eingabedaten in zwei n / 2-dimensionale Blöcke unterteilt, und für jeden wird Maxout ausgeführt.
Implementieren Sie wie folgt. Es wurde bestätigt, dass es sowohl mit Tensorflow 2 als auch mit Tensorflow 2 funktioniert.
Maxout.py
import tensorflow as tf
from typeguard import typechecked
import keras
class Maxout(keras.layers.Layer):
#num_Geben Sie die Anzahl der Dimensionen nach der Ausgabe mit dem Gerät an
#Geben Sie die Achse an, für die Sie Max mit Achse nehmen möchten (normalerweise der Standardwert. Geben Sie für Kanal zuerst 1 an.)
@typechecked
def __init__(self, num_units: int, axis: int = -1, **kwargs):
super().__init__(**kwargs)
self.num_units = num_units
self.axis = axis
def call(self, inputs):
inputs = tf.convert_to_tensor(inputs)
shape = inputs.get_shape().as_list()
# Dealing with batches with arbitrary sizes
for i in range(len(shape)):
if shape[i] is None:
shape[i] = tf.shape(inputs)[i]
num_channels = shape[self.axis]
if not isinstance(num_channels, tf.Tensor) and num_channels % self.num_units:
raise ValueError(
"number of features({}) is not "
"a multiple of num_units({})".format(num_channels, self.num_units)
)
if self.axis < 0:
axis = self.axis + len(shape)
else:
axis = self.axis
assert axis >= 0, "Find invalid axis: {}".format(self.axis)
expand_shape = shape[:]
expand_shape[axis] = self.num_units
k = num_channels // self.num_units
expand_shape.insert(axis, k)
outputs = tf.math.reduce_max(
tf.reshape(inputs, expand_shape), axis, keepdims=False
)
return outputs
def compute_output_shape(self, input_shape):
input_shape = tf.TensorShape(input_shape).as_list()
input_shape[self.axis] = self.num_units
return tf.TensorShape(input_shape)
def get_config(self):
config = {"num_units": self.num_units, "axis": self.axis}
base_config = super().get_config()
return {**base_config, **config}
Ein Anwendungsbeispiel ist unten dargestellt. Wenn Sie es so nennen, wird es funktionieren.
example.py
from Maxout import Maxout
conv2d = Conv2D(64, kernel_size, strides, padding)(input)
maxout = Maxout(n_units)(conv2d)
Dieses Mal habe ich die Maxout-Funktion erklärt. Maxout wird in neueren Studien häufig als Aktivierungsfunktion für LCNN usw. verwendet. Ich hoffe, Sie finden diesen Artikel hilfreich.
Reference Maxout Networks (https://arxiv.org/pdf/1302.4389.pdf) A Light CNN for Deep Face Representation with Noisy Labels (https://arxiv.org/pdf/1511.02683.pdf)
Recommended Posts