Tensorflow 为什么我们需要多放一层,softmax激活功能在哪里?
我正在阅读和测试TensorFlow教程网站上的CNN基本示例: 教程中的模型如下所示:Tensorflow 为什么我们需要多放一层,softmax激活功能在哪里?,tensorflow,deep-learning,cnn,Tensorflow,Deep Learning,Cnn,我正在阅读和测试TensorFlow教程网站上的CNN基本示例: 教程中的模型如下所示: model = models.Sequential() model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3))) model.add(layers.MaxPooling2D((2, 2))) model.add(layers.Conv2D(64, (3, 3), activation='relu')) m
model = models.Sequential()
model.add(layers.Conv2D(32, (3, 3), activation='relu', input_shape=(32, 32, 3)))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu'))
model.add(layers.MaxPooling2D((2, 2)))
model.add(layers.Conv2D(64, (3, 3), activation='relu')
model.add(layers.Flatten())
# 1.why do we need the next line ?
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(10))
两个基本问题:
我们正在建设CNN网络。
为什么我们需要最后一层model.addlayers.Dense64,activation='relu'?
它不是CNN网络的一部分,从我的测试中,无论有没有最后一层,我都能得到相同的结果
在教程中,他们写道,他们在最后一层中使用了softmax:
CIFAR有10个输出类,因此您使用具有10个输出和softmax激活的最终密集层
但他们的代码中没有使用softmax
我查看了文档,默认激活函数是None,而不是softmax。那么tutrial有一个错误,它没有与softmax一起使用
在最终密集层之前,密集层或完全连接层的目的是在最终层中进行选择之前,为选择最合适的标签提供权重或投票。在下图中,添加几个神经元以选择标签cat
查看此链接可更深入地了解fc层:
softmax层通常将predictionslogits映射为更容易理解的格式,其中张量中的每个值加起来可以变成1
注:使用预测的典型方法是使用张量获得最大值
将numpy作为np导入
preds=模型.predictbatch\U数据
最高值=np.argmaxpreds返回一个索引,在本例中为0
CNN由conv pooln Flatte或globalpool Densem组成,其中conv pooln部分从2D信号中提取特征,Densem从之前的层中选择特征。
最后一层的输出是4,4,64,它们是大小为4×4 2D信号的64个特征图。然后我们将它们展平,得到一个4×4×64=1024的dim向量,我们也可以使用全局max/avg池来得到一个64 dim向量。如果您使用的是flatte,那么它将产生一个1024维的向量,我们有10个类。这将大大降低尺寸,导致重要功能的丢失。这被称为“表示瓶颈”。为了避免这种情况,你可以插入一个密集的层,比如说64个神经元,它将首先投射1024个小向量→ 64维向量,然后从64维→ 10维向量。如果使用全局最大/平均扫毛,则可以跳过附加的密集层。在您的案例中,似乎避免了代表性瓶颈
本教程正在使用
Tensorflow具有高效的logits计算实现。这样,您就不需要在层中使用softmax。它将自动优化它,就像您使用softmax一样
但如果您仍希望在密集层中使用softmax,则可以使用它。但是在编译中使用from_logits=False。然而,后一种方法效率较低,因为它需要双重工作
[1.6e-7, 1.6e-8, 1.6e-9, 1.6e-10] # Before applying softmax
[0.6, 0.1, 0.2, 0.1] # After applying softmax
model.compile(optimizer='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),
metrics=['accuracy'])