簡體   English   中英

Keras順序密集輸入層 - 和MNIST:為什么需要重塑圖像?

[英]Keras Sequential Dense input layer - and MNIST: why do images need to be reshaped?

我問這個是因為我覺得我錯過了一些基本的東西。

到目前為止,大多數人都知道MNIST圖像是28X28像素。 關於密集的keras文檔告訴我這個:

輸入形狀nD張量與形狀:(b​​atch_size,...,input_dim)。 最常見的情況是具有形狀的2D輸入(batch_size,input_dim)。

所以像我這樣的新手會假設圖像可以作為28 * 28矩陣饋送到模型中。 然而,我找到的每個教程都經過各種旋轉技術將圖像轉換為單個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,)), ...),])

所以我的問題很簡單 - 為什么? 不能密集只是按原樣接受圖像,或者,如果有必要,只是“在幕后”處理它,就像它一樣? 如果,正如我懷疑的那樣,必須進行這種處理,這些方法(或其他方法)中的任何一種本身都是優選的嗎?

根據OP(即原版海報)的要求,我將在評論中提及答案,並詳細說明。

不能密集只是按原樣接受圖像,或者,如果有必要,只是“在幕后”處理它,就像它一樣?

根本沒有! 那是因為目前Dense圖層應用於最后一個軸 因此,如果您為其提供形狀(height, width)(height, width, channels) ,則密集層將僅應用於最后一個軸(即寬度或通道)。 然而,當圖像被展平時,Dense層中的所有單元將被應用於整個圖像,並且每個單元連接到具有不同權重的所有像素。 為了進一步澄清,請考慮以下模型:

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
_________________________________________________________________

如您所見,Dense層中有7850個參數:每個單元連接到所有像素(28 * 28 * 10 + 10 bias params = 7850)。 現在考慮這個模型:

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
_________________________________________________________________

在這種情況下,Dense層中只有290個參數。 這里Dense層中的每個單元也連接到所有像素,但不同之處在於權重在第一個軸上共享(28 * 10 + 10個偏差參數= 290)。 就像從在整個圖像中提取特征的先前模型相比,從圖像的每一行提取特征。 因此,這(即重量分配)可能對您的申請有用,也可能沒有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM