[英]How does Keras set the dimensions in this network which has CNN and dense layers?
我需要一些幫助以了解此處的情況。
我的目標是擁有一個接收sizeXsize
圖像並返回sizeXsize
二進制矩陣的網絡。 網絡的輸出應為二進制sizeXsize
矩陣,該矩陣指示像素是否具有特征。
例如,考慮一個拐角檢測網絡,其中輸出層會判斷像素是否正好位於拐角的尖端。 即,我們只想檢測此角的像素:
網絡中的第一層定義如下:
from keras import models, layers
import numpy as np
size=5
input_image = layers.Input(shape=(size, size, 1))
b = layers.Conv2D(5, (3,3), activation='relu', padding='same')(input_image)
b = layers.MaxPooling2D((2,2), strides=1, padding='same')(b)
b = layers.Conv2D(5, (3,3), activation='relu', padding='same')(b)
b_out = layers.MaxPooling2D((2,2),strides=1 ,padding='same')(b)
直到現在,我仍保留原始輸入層的尺寸( sizeXsize
)。
現在,我想將密集層作為具有sizeXsize
像素的輸出層。
如果我使用output = layers.Dense(size, activation='sigmoid')(b_out)
則構建的圖層為sizeXsizeXsize
,如果我使用output = layers.Dense(1, activation='sigmoid')(b_out)
則尺寸為sizeXsize
,怎么來的?
這是代碼的構建和編譯部分:
model = models.Model(input_image, output)
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
我在這里想念什么? output = layers.Dense(1, activation='sigmoid')(b_out)
不是output = layers.Dense(1, activation='sigmoid')(b_out)
只是單個神經元嗎?
問題是,如果我訓練:
n_images=100
data = np.random.randint(0,2,(n_images,size,size,1))
labels = np.random.randint(0,2,(n_images,size,size,1))
labels = data
model.fit(data, labels, verbose=1, batch_size=4, epochs=20)
如果我測試它:
data1 = np.random.randint(0,2,(n_images,size,size,1))
score, acc = model.evaluate(data1,data1, verbose=1)
print('Test score:', score)
print('Test accuracy:', acc)
a=np.random.randint(0,2,(1,size,size,1))
prediction = model.predict(a)
print(a==np.round(prediction))
我得到了很好的准確性,並且看來輸出層的大小是正確的:
100/100 [==============================] - 0s 349us/step
Test score: 0.187119951248
Test accuracy: 0.926799981594
[[[[ True]
[ True]
[ True]
[ True]
[ True]]
[[ True]
[ True]
[ True]
[ True]
[ True]]
[[ True]
[ True]
[ True]
[ True]
[ True]]
[[ True]
[ True]
[ True]
[ True]
[ True]]
[[ True]
[ True]
[ True]
[ True]
[ True]]]]
如果我閱讀密集文檔:
單位:正整數,輸出空間的維數。
所以,如果我把怎么弄layers.Dense(1, activation='sigmoid')(b_out)
我得到的輸出層sizeXsize
?
訣竅不是使用常規的Dense
層,而是使用內核大小為(1,1)
的卷積層,即您需要以下內容:
b = layers.Conv2D(5, (3,3), activation='relu', padding='same')(input_image)
b = layers.MaxPooling2D((2,2), strides=1, padding='same')(b)
b = layers.Conv2D(5, (3,3), activation='relu', padding='same')(b)
b = layers.MaxPooling2D((2,2),strides=1 ,padding='same')(b)
# not use Dense, but Conv2D
binary_out = layers.Conv2D(1, (1,1), activation='sigmoid', padding='same')(b)
造成混淆的原因是,當前已實現了Dense
層,以便將其應用於輸入數據的最后一個軸 。 這就是為什么將具有形狀(size, size, 5)
的MaxPooling層的輸出(即b_out
)饋送到具有一個單位的Dense層時會得到形狀(size, size, 1)
的輸出的原因。 在這種情況下,雖然具有相同的權重,但Dense層中的單個神經元連接到輸出數組中的5個元素中的每一個(這就是為什么如果您查看summary()
輸出,您會看到Dense層有6個參數,5個權重和一個偏置參數)。
您可以將Dense層(帶有一個單元)或Conv2D層(帶有一個濾鏡)用作最后一層。 如果您問哪個更好,答案是:它取決於您正在處理的特定問題和所擁有的數據。 但是,您可以從圖像分割網絡中獲取一些想法,在這種網絡中,首先使用Conv2D和MaxPooling2D層的組合來處理圖像(隨着模型的進行,其尺寸會減小),然后使用一些上采樣層和Conv2D層取回與輸入圖像相同大小的圖像。 這是一個草圖(不過,您的案例不需要使用TimeDistributed
和LSTM
層)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.