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
Python 张量流,CNNs中的重塑_Python_Tensorflow_Machine Learning_Keras_Conv Neural Network - Fatal编程技术网

Python 张量流,CNNs中的重塑

Python 张量流,CNNs中的重塑,python,tensorflow,machine-learning,keras,conv-neural-network,Python,Tensorflow,Machine Learning,Keras,Conv Neural Network,我已经多次看到这种怀疑,但还没有得到任何答案,至少我对重塑工作是如何进行的以及为什么有必要这样做感到困惑。我会尽量简明扼要 所以,我在TensorFlow文档中读到,当你在实现CNN时,在将数据输入到卷积层之前,有必要对数据进行整形,因为卷积层采用4D张量,而不仅仅是下载的训练数据的元素列表 卷积池过程的输出也是4D张量。它被送入扁平层。现在…扁平层,用于接收相同的列表元素,在将其传递到卷积之前,需要对其进行重塑。但是,为什么这两种方法都适用于扁平层呢?它收到了一个不能直接输入卷积的项目列表,现

我已经多次看到这种怀疑,但还没有得到任何答案,至少我对重塑工作是如何进行的以及为什么有必要这样做感到困惑。我会尽量简明扼要

所以,我在TensorFlow文档中读到,当你在实现CNN时,在将数据输入到卷积层之前,有必要对数据进行整形,因为卷积层采用4D张量,而不仅仅是下载的训练数据的元素列表

卷积池过程的输出也是4D张量。它被送入扁平层。现在…扁平层,用于接收相同的列表元素,在将其传递到卷积之前,需要对其进行重塑。但是,为什么这两种方法都适用于扁平层呢?它收到了一个不能直接输入卷积的项目列表,现在收到了一个4D张量

所以,如果没有卷积,扁平层接收到的不是重塑的数据,如果有卷积池,它接收到4D张量,然后输出相同的东西

我希望我清楚地知道我的困惑是什么,并希望有人能够花一些时间来澄清我的疑虑


干杯

卷积神经网络CNN的输入数据如下图所示。我们假设我们的数据是一组图像

您必须始终向CNN提供4D阵列作为输入。因此,输入数据具有批量大小、高度、宽度和通道的形状。在RGB图像的情况下,通道为3,灰度图像的通道为1

CNN的输出也是一个4D阵列。其中,批处理大小与输入批处理大小相同,但图像的其他3个维度可能会根据我们使用的过滤器、内核大小和填充值而变化

让我们看看下面的代码

import tensorflow as tf
from tensorflow.keras.layers import Conv2D, MaxPool2D, Dense, Flatten

model=tf.keras.models.Sequential()
model.add(Conv2D(filters=64, kernel_size=1, input_shape=(10,10,3)))
model.add(MaxPool2D(pool_size=(2,2), strides=(2,2)))
model.add(Flatten())
model.add(Dense(10))
model.summary()
输出:

Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d (Conv2D)              (None, 10, 10, 64)        256       
_________________________________________________________________
max_pooling2d (MaxPooling2D) (None, 5, 5, 64)          0         
_________________________________________________________________
flatten (Flatten)            (None, 1600)              0         
_________________________________________________________________
dense (Dense)                (None, 10)                16010     
=================================================================
Total params: 16,266
Trainable params: 16,266
Non-trainable params: 0
_________________________________________________________________
虽然看起来输入形状是3D的,但在拟合数据时必须传递一个4D数组,该数组的大小应类似于批次大小10、10、3。由于input_shape参数中没有批大小值,因此在拟合数据时,我们可以使用任何批大小

Conv2D和MaxPool2D的输出形状分别为None、10、10、64、None、5、5、64。第一个维度表示批次大小,目前没有。因为网络事先不知道批量大小。拟合数据后,拟合数据时给出的批大小将不会替换任何数据

我们可以简单地在另一个卷积层的顶部添加一个卷积层,因为卷积的输出维度与其输入维度相同

我们通常在卷积层的顶部添加稠密层来对图像进行分类。但是,将数据输入到形状批次大小(单位)的密集层2D数组中。卷积层的输出为4D阵列

因此,我们必须将从卷积层接收到的输出的维数更改为2D数组。我们可以通过在卷积层的顶部插入一个展平层来实现这一点。展平层将图像的3个维度压缩为单个维度。现在我们只有一个二维数组,形状为批处理大小,挤压大小,这对于致密层来说是可以接受的

注意:我们应该始终在网络中的密集层之前添加展平层

在简单网络的情况下,您可以使用扁平层启动网络,因为不需要卷积

model = tf.keras.models.Sequential([
  tf.keras.layers.Flatten(input_shape=(28, 28)),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10)
])

非常感谢您的全面回复!有些事我还不太清楚。例如:对于一个简单的网络,展平层的输入形状应该是[批次大小、高度、宽度],对吗?在CNN的例子中,平坦层得到一个[批次大小,高度,宽度,卷积数]…这是正确的吗?