代码之家  ›  专栏  ›  技术社区  ›  Jack Fleeting

Keras序列密集输入层和MNIST:为什么图像需要重塑?

  •  3
  • Jack Fleeting  · 技术社区  · 6 年前

    我问这个是因为我觉得我错过了一些基本的东西。

    keras documentation 告诉我关于Dense的事:

    用shape:(batch\u size,…,Input\u dim)输入shape-nD张量。最常见的情况是带有形状的2D输入(批量大小,输入尺寸)。

    所以像我这样的新手会假设图像可以作为一个28*28的矩阵输入模型。然而,我找到的每一个教程都会通过各种gymasntics将图像转换为一个784长的特征。

    有时

    num_pixels = X_train.shape[1] * X_train.shape[2]
    model.add(Dense(num_pixels, input_dim=num_pixels, activation='...'))
    

    num_pixels = np.prod(X_train.shape[1:])
    model.add(Dense(512, activation='...', input_shape=(num_pixels,)))
    

    model.add(Dense(units=10, input_dim=28*28, activation='...'))
    history = model.fit(X_train.reshape((-1,28*28)), ...)
    

    model = Sequential([Dense(32, input_shape=(784,)), ...),])
    

    所以我的问题很简单-为什么?你不能照原样接受一个图像吗?或者,如果有必要,就照原样在“幕后”处理它?如果,如我所怀疑的,这种处理必须要完成,那么这些方法(或其他方法)中有哪一种天生更可取呢?

    1 回复  |  直到 6 年前
        1
  •  3
  •   today    6 年前

    根据OP的要求(即原始海报),我将在我的评论中提及我给出的答案,并详细说明。

    是“幕后”吗?

    currently the Dense layer is applied on the last axis (height, width) (height, width, channels) ,密集层仅适用于最后一个轴(即宽度或通道)。然而,当图像被展平时,稠密层中的所有单元将被应用到整个图像上,每个单元以不同的权值连接到所有像素上。为了进一步阐明这一点,请考虑以下模型:

    model = models.Sequential()
    model.add(layers.Dense(10, input_shape=(28*28,)))
    model.summary()
    

    Layer (type)                 Output Shape              Param #   
    =================================================================
    dense_2 (Dense)              (None, 10)                7850      
    =================================================================
    Total params: 7,850
    Trainable params: 7,850
    Non-trainable params: 0
    _________________________________________________________________
    

    model = models.Sequential()
    model.add(layers.Dense(10, input_shape=(28,28)))
    model.summary()
    

    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    dense_3 (Dense)              (None, 28, 10)            290       
    =================================================================
    Total params: 290
    Trainable params: 290
    Non-trainable params: 0
    _________________________________________________________________
    

    在这种情况下,致密层中只有290个参数。这里,密集层中的每个单元也连接到所有像素,但是不同的是权重在第一轴上共享(28×10+10 bias params=290)。就好像是从图像的每一行中提取特征,而之前的模型是从整个图像中提取特征的。因此,这(即重量分担)可能对您的应用程序有用,也可能不有用。