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
Machine learning “的作用是什么?”;“展平”;在凯拉斯?_Machine Learning_Tensorflow_Neural Network_Deep Learning_Keras - Fatal编程技术网

Machine learning “的作用是什么?”;“展平”;在凯拉斯?

Machine learning “的作用是什么?”;“展平”;在凯拉斯?,machine-learning,tensorflow,neural-network,deep-learning,keras,Machine Learning,Tensorflow,Neural Network,Deep Learning,Keras,我正在试图理解flant函数在Keras中的作用。下面是我的代码,这是一个简单的两层网络。它接收形状(3,2)的二维数据,并输出形状(1,4)的一维数据: 这将打印出y具有形状(1,4)。但是,如果我删除展平行,它将打印出y具有形状(1、3、4) 我不明白。根据我对神经网络的理解,model.add(稠密(16,input_shape=(3,2))函数正在创建一个隐藏的完全连接层,包含16个节点。每个节点都连接到每个3x2输入元素。因此,第一层输出端的16个节点已经“平坦”。因此,第一层的输出形

我正在试图理解
flant
函数在Keras中的作用。下面是我的代码,这是一个简单的两层网络。它接收形状(3,2)的二维数据,并输出形状(1,4)的一维数据:

这将打印出
y
具有形状(1,4)。但是,如果我删除
展平
行,它将打印出
y
具有形状(1、3、4)

我不明白。根据我对神经网络的理解,
model.add(稠密(16,input_shape=(3,2))
函数正在创建一个隐藏的完全连接层,包含16个节点。每个节点都连接到每个3x2输入元素。因此,第一层输出端的16个节点已经“平坦”。因此,第一层的输出形状应该是(1,16)。然后,第二层将其作为输入,并输出形状(1,4)的数据


因此,如果第一层的输出已经是“平坦的”并且是形状(1,16),为什么我需要进一步平坦它?

如果您阅读了的Keras文档条目,您将看到此调用:

Dense(16, input_shape=(5,3))
这将形成一个密集的网络,有3个输入和16个输出,分别应用于5个步骤中的每个步骤。因此,如果
D(x)
将三维向量转换为16-D向量,那么从层中输出的将是一系列向量:
[D(x[0,:])、D(x[1,:])、…、D(x[4,:])]
和形状
(5,16)
。为了获得指定的行为,您可以首先将输入展平到15-d向量,然后应用密集的:

model = Sequential()
model.add(Flatten(input_shape=(3, 2)))
model.add(Dense(16))
model.add(Activation('relu'))
model.add(Dense(4))
model.compile(loss='mean_squared_error', optimizer='SGD')
编辑: 正如一些人难以理解的那样,这里有一个解释性的图像:

简短阅读:

展平张量意味着除去除一个维度之外的所有维度。这正是展平层所做的

长读:

如果我们考虑创建的原始模型(带有展平层),我们可以得到以下模型摘要:

Layer (type)                 Output Shape              Param #   
=================================================================
D16 (Dense)                  (None, 3, 16)             48        
_________________________________________________________________
A (Activation)               (None, 3, 16)             0         
_________________________________________________________________
F (Flatten)                  (None, 48)                0         
_________________________________________________________________
D4 (Dense)                   (None, 4)                 196       
=================================================================
Total params: 244
Trainable params: 244
Non-trainable params: 0
对于这个总结,下一张图片有望提供更多关于每个层的输入和输出大小的信息

您可以看到展平层的输出形状是
(无,48)
。这是提示。您应该阅读它
(1,48)
(2,48)
或。。。或
(16,48)
。。。或
(32,48)

事实上,该位置上的
None
表示任何批量大小。对于要调用的输入,第一个维度表示批量大小,第二个维度表示输入特征的数量

整平层在Keras中的作用非常简单:

对张量进行展平操作会重塑张量,使其形状等于张量中包含的元素数,不包括批次维度


注意:我使用了
model.summary()
方法来提供输出形状和参数详细信息。


这就是展平如何将矩阵转换为单个数组。

展平明确说明如何序列化多维张量(尤其是输入张量)。这允许在(展平的)输入张量和第一个隐藏层之间进行映射。如果第一个隐藏层是“密集”的,(序列化的)输入张量的每个元素都将与隐藏数组的每个元素相连接。
如果不使用“展平”,输入张量映射到第一个隐藏层的方式将是不明确的。

我最近遇到了这个问题,它肯定帮助我理解:


因此有一个输入,一个Conv2D,一个MaxPooling2D等等,展平层在末尾,它精确地显示了它们是如何形成的,以及它们如何定义最终的分类(0-9)。

这里我想介绍展平函数的另一种替代方法。这可能有助于理解内部正在发生的事情。另一种方法是再添加三行代码。 而不是使用

#==========================================Build a Model
model = tf.keras.models.Sequential()

model.add(keras.layers.Flatten(input_shape=(28, 28, 3)))#reshapes to (2352)=28x28x3
model.add(layers.experimental.preprocessing.Rescaling(1./255))#normalize
model.add(keras.layers.Dense(128,activation=tf.nn.relu))
model.add(keras.layers.Dense(2,activation=tf.nn.softmax))

model.build()
model.summary()# summary of the model
我们可以使用

    #==========================================Build a Model
    tensor = tf.keras.backend.placeholder(dtype=tf.float32, shape=(None, 28, 28, 3))
    
    model = tf.keras.models.Sequential()
    
    model.add(keras.layers.InputLayer(input_tensor=tensor))
    model.add(keras.layers.Reshape([2352]))
model.add(layers.experimental.preprocessing.Rescaling(1./255))#normalize
    model.add(keras.layers.Dense(128,activation=tf.nn.relu))
    model.add(keras.layers.Dense(2,activation=tf.nn.softmax))
    
    model.build()
    model.summary()# summary of the model
在第二种情况下,我们首先创建一个张量(使用占位符) 然后创建一个输入层。之后,我们将张量重塑为平面形式。所以基本上

Create tensor->Create InputLayer->Reshape == Flatten

展平是一个方便的功能,可以自动完成所有这些操作。当然,这两种方法都有其特定的用例。Keras提供了足够的灵活性来操作您想要创建模型的方式。

根据经验,网络中的第一层应与数据的形状相同。例如,我们的数据是28x28个图像,28层28个神经元是不可行的,因此将28,28“展平”为784x1更有意义。我们不需要自己编写所有代码来处理,而是在开始时添加flatte()层,当阵列稍后加载到模型中时,它们将自动为我们展平。

感谢您的解释。只是想澄清一下:如果密度为
Dense(16,input_shape=(5,3)
,那么16组中的每个输出神经元(以及,对于所有5组神经元)是否都连接到所有(3 x 5=15)输入神经元?或者第一组16个神经元中的每个神经元只与第一组5个输入神经元中的3个神经元相连,然后第二组16个神经元中的每个神经元只与第二组5个输入神经元中的3个神经元相连,等等……我搞不清它是哪一个!你有一个密集的层,其中有3个神经元,输出16 w它适用于5组3个神经元中的每一组。啊,好的。我想做的是把5个彩色像素的列表作为输入,我想让它们通过一个完全连接的层。所以
input\u shape=(5,3)
意味着有5个像素,每个像素有三个通道(R,G,B)但是根据你所说的,每个通道将被单独处理,而我希望所有三个通道都由第一层的所有神经元处理。那么,在开始时立即应用
展平
层会给我带来我想要的吗?一个带和不带
展平
的小图可能有助于理解
Create tensor->Create InputLayer->Reshape == Flatten