Мне нужна помощь, чтобы понять, что здесь происходит.
Моя цель - создать сеть, которая получает sizeXsize
изображений и возвращает sizeXsize
двоичные матрицы.Выход сети должен представлять собой двоичную матрицу sizeXsize
, которая указывает, есть ли у пикселя функция или нет.
Например, представьте себе сеть обнаружения углов, где выходной слой сообщает, является ли пиксель точно вершиной угла.А именно, мы хотим обнаружить только пиксель этого угла:
![enter image description here](https://i.stack.imgur.com/N92Gp.png)
Первые слои в сети определены следующим образом:
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]]]]
Если я прочитал Плотная документация:
единицы: положительное целое число, размерность выходного пространства.
Итак, как получится, если я поставлю layers.Dense(1, activation='sigmoid')(b_out)
Я получу выходной слой sizeXsize
?