Как работает слой 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. Более подробную информацию вы можете найти в здесь.