gpt4 book ai didi

python - 神经网络在 Keras 上的前几个 epoch 中不进行学习

转载 作者:行者123 更新时间:2023-11-30 08:56:32 26 4
gpt4 key购买 nike

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

网络在前 5-10 个 epoch 中不进行学习,然后一切都很好。我尝试使用初始化器和正则化器,但这只会让情况变得更糟。

我这样使用网络:

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 个 epoch(每次都不同),然后损失迅速下降,我在 20 个 epoch 内达到了 0.9623 的准确率。

但是,如果我将激活从 sigmoid 更改为 relu,它会很好地工作,并且在第一个 epoch 中给我 0.5356 的准确度。

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

最佳答案

激活函数建议:

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

不使用sigmoid的原因:

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

关于python - 神经网络在 Keras 上的前几个 epoch 中不进行学习,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58608113/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com