Как работает слой Flatten в Керасе?

Я использую серверную часть TensorFlow.

Я применяю свертку, максимальный пул, выравниваю и плотный слой последовательно. Свертка требует трехмерного ввода (высота, ширина, color_channels_depth).

После свертки это становится (высота, ширина, Number_of_filters).

После применения максимальных пулов высота и ширина меняются. Но после нанесения сплющенного слоя, что именно происходит? Например, если вход перед сглаживанием равен (24, 24, 32), то как он сглаживает его?

Это последовательно, как (24 * 24) для роста, веса для каждого номера фильтра последовательно, или каким-либо другим способом? Пример будет оценен с фактическими значениями.

Ответ 1

Оператор Flatten() разворачивает значения, начиная с последнего измерения (по крайней мере для Theano, который является "каналом первым", а не "последним каналом", например TF. Я не могу запустить TensorFlow в своей среде). Это эквивалентно numpy.reshape с порядком "C":

'C означает чтение/запись элементов с использованием порядка индекса C-like, с индекс последней оси меняется быстрее, назад к индексу первой оси медленнее.

Вот отдельный пример, иллюстрирующий оператор Flatten с функциональным API Keras. Вы должны легко адаптироваться к своей среде.

import numpy as np
from keras.layers import Input, Flatten
from keras.models import Model
inputs = Input(shape=(3,2,4))

# Define a model consisting only of the Flatten operation
prediction = Flatten()(inputs)
model = Model(inputs=inputs, outputs=prediction)

X = np.arange(0,24).reshape(1,3,2,4)
print(X)
#[[[[ 0  1  2  3]
#   [ 4  5  6  7]]
#
#  [[ 8  9 10 11]
#   [12 13 14 15]]
#
#  [[16 17 18 19]
#   [20 21 22 23]]]]
model.predict(X)
#array([[  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,
#         11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,
#         22.,  23.]], dtype=float32)

Ответ 2

Он последователен, как 24 * 24 * 32, и преобразует его, как показано в следующем коде.

def batch_flatten(x):
    """Turn a nD tensor into a 2D tensor with same 0th dimension.
    In other words, it flattens each data samples of a batch.
    # Arguments
        x: A tensor or variable.
    # Returns
        A tensor.
    """
    x = tf.reshape(x, tf.stack([-1, prod(shape(x)[1:])]))
    return x

Ответ 3

Выравнивание тензора означает удаление всех измерений, кроме одного.

Слой Flatten в Keras изменяет форму тензора, чтобы иметь форму, равную количеству элементов, содержащихся в тензоре.

Это то же самое, что и создание 1d-массива элементов.

Например, в модели VGG16 вам может быть легко понять:

>>> model.summary()
Layer (type)                     Output Shape          Param #
================================================================
vgg16 (Model)                    (None, 4, 4, 512)     14714688
________________________________________________________________
flatten_1 (Flatten)              (None, 8192)          0
________________________________________________________________
dense_1 (Dense)                  (None, 256)           2097408
________________________________________________________________
dense_2 (Dense)                  (None, 1)             257
===============================================================

Обратите внимание, какова форма слоя flatten_1 (Нет, 8192), где 8192 - это фактически 4 * 4 * 512.


PS, None означает какое-либо измерение (или динамическое измерение), но вы обычно можете прочитать его как 1. Более подробную информацию вы можете найти в здесь.