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