Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 神经网络是';在凯拉斯的最初几个时代里,我没有学习_Python_Machine Learning_Keras_Neural Network_Deep Learning - Fatal编程技术网

Python 神经网络是';在凯拉斯的最初几个时代里,我没有学习

Python 神经网络是';在凯拉斯的最初几个时代里,我没有学习,python,machine-learning,keras,neural-network,deep-learning,Python,Machine Learning,Keras,Neural Network,Deep Learning,我正在使用TensorFlow后端测试Keras上的简单网络,但在使用sigmoid激活函数时遇到了一个问题 网络在最初的5-10个时期没有学习,然后一切都很好。 我尝试使用初始化器和正则化器,但那只会使情况变得更糟 我是这样使用网络的: 将numpy导入为np 进口干酪 从numpy导入展开\u dims 从keras.preprocessing.image导入ImageDataGenerator 从matplotlib导入pyplot #加载图像 (x_列,y_列),(x_val,y_val

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

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

我是这样使用网络的:

将numpy导入为np
进口干酪
从numpy导入展开\u dims
从keras.preprocessing.image导入ImageDataGenerator
从matplotlib导入pyplot
#加载图像
(x_列,y_列),(x_val,y_val),(x_测试,y_测试)=网络工作2加载数据共享()
#将维度展开为一个示例
x_列=扩展_dims(x_列,2)
x_列=np.重塑(x_列,(50000,28,28))
x_列=扩展_dims(x_列,3)
y_-train=keras.utils.to_-categorical(y_-train,10)
y_检验=keras.utils.to_分类(y_检验,10)
datagen=ImageDataGenerator(
重新缩放=1./255,
宽度\u移位\u范围=[-1,0,1],
高度偏移范围=[-1,0,1],
旋转(范围=10)
纪元=20
批量大小=50
num_类=10
模型=keras.Sequential()
model.add(keras.layers.Conv2D)(64,(3,3),padding='same',
输入_shape=x_train.shape[1:],
激活(='sigmoid'))
添加(keras.layers.MaxPoolig2D(池大小=(2,2)))
模型添加(keras.layers.Conv2D(100,(3,3),
激活(='sigmoid'))
添加(keras.layers.MaxPoolig2D(池大小=(2,2)))
model.add(keras.layers.flatte())
模型.添加(keras.层.致密(100,
激活(='sigmoid'))
#模型。添加(keras。层。辍学(0.5))
添加(keras.layers.Dense)(num_类,
激活(='softmax'))
model.compile(loss='classifical_crossentropy',
优化器='adam',
指标=[‘准确度’])
模型拟合生成器(数据生成流(x列、y列、批次大小=批次大小),
每个历元的步长=长度(x列)/批量大小,历元=历元,
详细=2,随机=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
对我来说几乎无法使用,我想知道,我可以做些什么。这是一个bug还是我做错了什么?

激活功能建议: 在实践中,乙状结肠非线性最近已不受欢迎,很少使用。ReLU是最常见的选择,如果网络中有很大一部分“死亡”单元,请尝试泄漏的ReLU和tanh。永远不要使用乙状结肠

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

激活功能建议: 在实践中,乙状结肠非线性最近已不受欢迎,很少使用。ReLU是最常见的选择,如果网络中有很大一部分“死亡”单元,请尝试泄漏的ReLU和tanh。永远不要使用乙状结肠

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

这正是为什么不应该将Sigmoid用作隐藏激活的原因。神经元很可能在开始时“饱和”,梯度接近0,因此(几乎)没有学习发生。一旦网络最终摆脱了饱和状态,学习就会很快。Relu不会饱和,这就是它通常工作得更好的原因。现代神经网络不使用sigmoid激活,你为什么要使用它?这不是一个bug,你确实做错了什么,即在隐藏层中使用
sigmoid
。这正是你不应该使用sigmoid作为隐藏激活的原因。神经元很可能在开始时“饱和”,梯度接近0,因此(几乎)没有学习发生。一旦网络最终摆脱了饱和状态,学习就会很快。Relu不会饱和,这就是为什么它通常工作得更好。现代神经网络不使用s形激活,你为什么要使用它?这不是一个bug,你确实做错了什么,也就是说,在隐藏层中使用
sigmoid
时,您遇到的问题是练习神经网络时的常见问题。下面是一些关于激活函数选择的建议,以及为什么sigmoid性能较差。我同意你的观点,并感谢你的回答,ReLU通常在我的测试中显示出更好的结果。然而,我认为优化器保证每一个时代的损失都会越来越小,所以我不知道它是如何上升的。我从来没有遇到过手动创建网络的问题,我无法从您的评论中理解您的观点“然而,我认为优化器保证每一个时代的损失都会越来越小,所以我对它如何上升感到困惑”。为什么你会期望交叉熵随着年代的增加而增加。您应该知道分类任务中损失函数的定义始终是为了解决使损失函数最小化的优化问题。@БМцццццаааааа,您在练习神经网络时遇到的问题是一个常见问题。下面是一些关于激活函数选择的建议,以及为什么sigmoid性能较差。我同意你的观点,并感谢你的回答,ReLU通常在我的测试中显示出更好的结果。然而,我认为优化器可以保证