Как я могу преобразовать нейронную сеть, установленную с помощью model(), в sequential()?

#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])