keras - API высокого уровня, который заботится о многих абстракциях. Следующий пример может помочь вам лучше понять. Это наиболее близкий исходный эквивалент тензорного потока абстракции keras в вашем вопросе:
import tensorflow as tf
from pprint import pprint
for shape in [(None,784,), (None, 784,1), (None, 32,28), (None, 32,28,1)]:
shapes_list = []
input_layer_1 = tf.compat.v1.placeholder(dtype=tf.float32, shape=shape, name=None)
shapes_list.append(input_layer_1.shape)
d1 = tf.compat.v1.layers.dense(
inputs=input_layer_1, units=4, activation=None, use_bias=True, kernel_initializer=None,
bias_initializer=tf.zeros_initializer(), kernel_regularizer=None,
bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
bias_constraint=None, trainable=True, name=None, reuse=None
)
shapes_list.append(d1.shape)
d2 = tf.compat.v1.layers.dense(
inputs=d1, units=10, activation=tf.compat.v1.nn.softmax, use_bias=True, kernel_initializer=None,
bias_initializer=tf.zeros_initializer(), kernel_regularizer=None,
bias_regularizer=None, activity_regularizer=None, kernel_constraint=None,
bias_constraint=None, trainable=True, name=None, reuse=None
)
shapes_list.append(d2.shape)
print('++++++++++++++++++++++++++')
pprint(shapes_list)
print('++++++++++++++++++++++++++')
Функция Dense
используется для создания плотно связанного слоя или Perceptron .
Согласно вашему фрагменту кода, вы создали многослойный персептрон (с функцией линейной активации f (x) = x) со скрытым слоем 1, имеющим 4 нейрона, и выходным слоем, настроенным для 10 классов / метки должны быть предсказаны.
Количество нейронов в каждом слое определяется аргументом единиц . И форма каждого нейрона в layer_L определяется выходом предыдущего layer_L-1 .
, если вход для плотного слоя равен (BATCH_SIZE, N, l)
, тогда форма вывода будет (BATCH_SIZE, N, value_passed_to_argument_units_in_Dense)
, а если ввод (BATCH_SIZE, N, M, l)
, то вывод будет (BATCH_SIZE, N, M, value_passed_to_argument_units_in_Dense)
и т. д.
ПРИМЕЧАНИЕ:
это происходит только в случае Dense
нейрона, потому что он не изменяет промежуточные измерения между batch_size и last_channel.
однако в случае других нейронов, таких как Conv2D -> (Max / При объединении промежуточные измерения могут (в зависимости от переданных аргументов) также измениться, потому что эти нейроны также действуют на эти измерения.