Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.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
Tensorflow 为什么我们需要多放一层,softmax激活功能在哪里?_Tensorflow_Deep Learning_Cnn - Fatal编程技术网

Tensorflow 为什么我们需要多放一层,softmax激活功能在哪里?

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

我正在阅读和测试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'))
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'])