我正在使用TensorFlow后端在Keras上测试简单网络,但在使用S型激活功能时遇到了问题
在最初的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)
使用上面的代码,我收到如下结果:
第1/20版
-55秒-损失:2.3098-准确性:0.1036
时代2/20
-56秒-损失:2.3064-准确性:0.1038
时代3/20
-56秒-损失:2.3068-准确性:0.1025
时代4/20
-56秒-损失:2.3060-准确性:0.1079
...
对于7个纪元(每次不同),损耗迅速下降,在20个纪元中我达到0.9623的精度。
但是,如果我将激活从sigmoid
更改为relu
,那么效果很好,并且在第一个时期给了我0.5356的准确性
此问题使sigmoid
对我几乎不可用,我想知道,我可以为此做点工作。这是错误还是我做错了什么?
答案 0 :(得分:2)
在实践中,S形非线性最近已失宠,很少使用。 ReLU是最常见的选择,如果网络中有大量“死”单元,请尝试Leaky ReLU和tanh。切勿使用乙状结肠。
乙状神经元的一个非常不希望的特性是,当神经元的激活在0或1的尾部饱和时,这些区域的梯度几乎为零。此外,Sigmoid输出不是零中心的。