Я столкнулся с этой проблемой во время обучения нейронной сети автоэнкодера (многослойный персептрон).
Вот мой код
# AE encoding arch
model=Sequential()
model.add(Dense(units= 2000, activation= 'relu', input_shape= (784,)))
model.add(Dense(units= 1200, activation= 'relu'))
model.add(Dense(units= 500, activation= 'relu'))
# latent representation (lower dim representation)
model.add(Dense(units= 10, activation= 'sigmoid')) # mark this activation
# AE decoding arch
model.add(Dense(units= 500, activation= 'relu'))
model.add(Dense(units= 1200, activation= 'relu'))
model.add(Dense(units= 2000, activation= 'relu'))
model.add(Dense(units = 784))
Код выше работает отлично.
Ранее я использовал «softmax» в качестве активации в скрытом представлении плотного слоя:
model.add(Dense(units= 10, activation= 'softmax')) # mark this activation
Похоже, он застрял в локальных минимумах. Потеря не снижалась.
Train on 60000 samples, validate on 10000 samples
Epoch 1/20
60000/60000 [==============================] - 7s 123us/step - loss: 0.0901 - val_loss: 0.0874
Epoch 2/20
60000/60000 [==============================] - 6s 106us/step - loss: 0.0872 - val_loss: 0.0875
Epoch 3/20
60000/60000 [==============================] - 6s 106us/step - loss: 0.0872 - val_loss: 0.0882
Epoch 4/20
60000/60000 [==============================] - 6s 106us/step - loss: 0.0872 - val_loss: 0.0875
Epoch 5/20
60000/60000 [==============================] - 6s 105us/step - loss: 0.0871 - val_loss: 0.0875
Что здесь происходит? Почему sigmoid
работает, а не softmax
? Разве оба не служат одной и той же цели?