#python #tensorflow #keras #neural-network #autoencoder
#python #тензорный поток #keras #нейронная сеть #автоэнкодер
Вопрос:
Я использовал TensorFlow 2.0 для создания полностью подключенной нейронной сети, шумоподавляющего автоэнкодера. Структура сети составляет 128-64-32-64-128 (количество нейронов) с 1000 вводом данных и 1000 выводом данных после пяти уровней сетевой обработки.
Мои коды следующие (Model()):
# Denoising Autoencoder
input_size = 1000
hidden_size = 128
hidden_size_2 = 64
code_size = 32
output_size = 1000
x = Input(shape=(input_size, ))
hidden_1 = Dense(hidden_size,activation='relu')(x) # 128
hidden_2 = Dense(hidden_size_2, activation='relu')(hidden_1) # 64
hidden_3 = Dense(code_size, activation='relu')(hidden_2) # 32
hidden_4 = Dense(hidden_size_2,activation='relu')(hidden_3) # 64
hidden_5 = Dense(hidden_size, activation='relu')(hidden_4) # 128
r = Dense(output_size,activation='sigmoid')(hidden_5)
autoencoder = Model(inputs=x, outputs=r)
autoencoder.compile(optimizer='adam', loss='mse',metrics=["mse"])
и соответствующая model.summary() следующие:
Model: "model_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
input_1 (InputLayer) (None, 1000) 0
_________________________________________________________________
dense_1 (Dense) (None, 128) 128128
_________________________________________________________________
dense_2 (Dense) (None, 64) 8256
_________________________________________________________________
dense_3 (Dense) (None, 32) 2080
_________________________________________________________________
dense_4 (Dense) (None, 64) 2112
_________________________________________________________________
dense_5 (Dense) (None, 128) 8320
_________________________________________________________________
dense_6 (Dense) (None, 1000) 129000
=================================================================
Total params: 277,896
Trainable params: 277,896
Non-trainable params: 0
И я хочу переписать эту нейронную сеть, используя режим sequential() (потому что нужная мне библиотека Python должна использовать Sequential()). Мои коды следующие:
input_size_1000 = 1000
hidden_size_128 = 128
hidden_size_64 = 64
code_size_32 = 32
output_size_1000 = 1000
# using sequential()
model = tf.keras.models.Sequential()
# model.add(tf.keras.layers.Input(input_size_1000,))
model.add(tf.keras.layers.Dense(hidden_size_128,input_dim=1000,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(hidden_size_64,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(code_size_32,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(hidden_size_64,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(hidden_size_128,activation=tf.nn.relu))
model.add(tf.keras.layers.Dense(output_size_1000,activation=tf.nn.sigmoid))
model.compile(optimizer='adam', loss='mse', metrics=["mse"])
и соответствующая model.summary() следующие:
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense (Dense) (None, 128) 128128
_________________________________________________________________
dense_1 (Dense) (None, 64) 8256
_________________________________________________________________
dense_2 (Dense) (None, 32) 2080
_________________________________________________________________
dense_3 (Dense) (None, 64) 2112
_________________________________________________________________
dense_4 (Dense) (None, 128) 8320
_________________________________________________________________
dense_5 (Dense) (None, 1000) 129000
=================================================================
Total params: 277,896
Trainable params: 277,896
Non-trainable params: 0
_________________________________________________________________
None
Я задавался вопросом, почему в переписанном коде не было входного слоя (я добавил input_dim=1000). Сначала я добавил model.add(tf.keras.layers.Input(input_size_1000,))
, но это не сработало. Затем я ввожу эту строку и добавляю inpu_dim=1000, по-прежнему нет input_layer . Кстати, есть ли какие-либо проблемы с моей перезаписью? Поскольку библиотека, которую я собираюсь использовать, не имеет входного слоя, хотя она обеспечивает выравнивающий слой, есть ли какое-либо влияние, если входной слой будет удален? Что, если я использую выравнивающий слой вместо входного слоя (мои данные представляют собой одномерный список) (потому что образец в библиотеке плотный после выравнивания изображения MNIST)? Спасибо!
Комментарии:
1. Похоже, что входной слой закомментирован, так ли это в вашем коде?
2. Извините, я не объяснил это ясно. Строка, которую я прокомментировал, не оказала никакого влияния на model.summary() моего кода, поэтому я снова попытался добавить input_dim , но это все равно не сработало.
3. Я также добавил эту сноску к своему вопросу.
Ответ №1:
Необходимо указать размер ввода плотного слоя. В вашей последовательной модели это так input_dim
. С print(model.inputs)
помощью этого вы увидите входной тензор.
При использовании Flatten layer input_shape
необходимо указать Flatten layer, чтобы, например, было понятно входное измерение следующего слоя (плотного): tf.keras.layers.Flatten(input_shape=[24, 24])