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

时间:2019-10-29 13:10:01

标签: python machine-learning keras neural-network deep-learning

我正在使用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对我几乎不可用,我想知道,我可以为此做点工作。这是错误还是我做错了什么?

1 个答案:

答案 0 :(得分:2)

激活功能建议:

在实践中,S形非线性最近已失宠,很少使用。 ReLU是最常见的选择,如果网络中有大量“死”单元,请尝试Leaky ReLU和tanh。切勿使用乙状结肠。

不使用S形的原因:

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