簡體   English   中英

Keras如何在具有CNN和密集層的網絡中設置尺寸?

[英]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層取回與輸入圖像相同大小的圖像。 是一個草圖(不過,您的案例不需要使用TimeDistributedLSTM層)。

暫無
暫無

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

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