我需要一些帮助以了解此处的情况。

我的目标是要有一个接收sizeXsize图像并返回sizeXsize二进制矩阵的网络。网络的输出应为二进制sizeXsize矩阵,该矩阵指示像素是否具有特征。

例如,考虑一个拐角检测网络,在该网络中,输出层会判断像素是否恰好是拐角的尖端。即,我们只想检测此角的像素:

python - Keras如何在具有CNN和密集层的网络中设置尺寸?-LMLPHP

网络中的第一层定义如下:

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)不仅是单个神经元吗?

问题是,如果我训练:

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]]]]




如果我阅读Dense文档:


  单位:正整数,输出空间的维数。


那么,如果我放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)

09-18 02:45