我需要一些帮助以了解此处的情况。
我的目标是要有一个接收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)
不仅是单个神经元吗?问题是,如果我训练:
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)