神经网络在 Keras 上的前几个时代没有学习



我正在使用TensorFlow后端在Keras上测试简单的网络,我遇到了使用sigmoid激活函数的问题

网络在最初的5-10个时代都没有学习,然后一切都很好。我尝试使用初始化器和正则化器,但这只会使情况变得更糟。

我这样使用网络:

import numpy as np
import keras
from numpy import expand_dims
from keras.preprocessing.image import ImageDataGenerator
from matplotlib import pyplot

# load the image
(x_train, y_train), (x_val, y_val), (x_test, y_test) = netowork2_ker.load_data_shared()
# expand dimension to one sample
x_train = expand_dims(x_train, 2)
x_train = np.reshape(x_train, (50000, 28, 28))
x_train = expand_dims(x_train, 3)
y_train = keras.utils.to_categorical(y_train, 10)
y_test = keras.utils.to_categorical(y_test, 10)
datagen = ImageDataGenerator(
rescale=1./255,
width_shift_range=[-1, 0, 1],
height_shift_range=[-1, 0, 1],
rotation_range=10)
epochs = 20
batch_size = 50
num_classes = 10
model = keras.Sequential()
model.add(keras.layers.Conv2D(64, (3, 3), padding='same',
input_shape=x_train.shape[1:],
activation='sigmoid'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Conv2D(100, (3, 3),
activation='sigmoid'))
model.add(keras.layers.MaxPooling2D(pool_size=(2, 2)))
model.add(keras.layers.Flatten())
model.add(keras.layers.Dense(100,
activation='sigmoid'))
#model.add(keras.layers.Dropout(0.5))
model.add(keras.layers.Dense(num_classes,
activation='softmax'))
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit_generator(datagen.flow(x_train, y_train, batch_size=batch_size),
steps_per_epoch=len(x_train) / batch_size, epochs=epochs,
verbose=2, shuffle=True)

使用上面的代码,我得到的结果如下:

Epoch 1/20 
- 55s - loss: 2.3098 - accuracy: 0.1036 
Epoch 2/20 
- 56s - loss: 2.3064 - accuracy: 0.1038
Epoch 3/20 
- 56s - loss: 2.3068 - accuracy: 0.1025
Epoch 4/20 
- 56s - loss: 2.3060 - accuracy: 0.1079
...

对于7个时期(每次都不同(,然后损失迅速下降,我在20个时期中达到了0.9623的准确率。

但如果我将激活从sigmoid更改为relu,效果会很好,在第一个历元中的准确率为0.5356。

这个问题使sigmoid对我来说几乎不可用,我想知道,我可以对此做点什么。这是一个错误还是我做错了什么?

激活功能建议:

在实践中,S形非线性最近已经失宠,而且很少使用。ReLU是最常见的选择,如果网络中有很大一部分"死"单元,请尝试Leaky ReLU和tanh。千万不要使用乙状结肠。

不使用sigmoid的原因:

s形神经元的一个非常不理想的特性是,当神经元的激活在0或1的尾部饱和时,这些区域的梯度几乎为零。此外,Sigmoid输出不是以零为中心的。

最新更新