Keras - слой UpSampling2D, похоже, возвращает 2D-тензор, а не 4D - PullRequest
0 голосов
/ 12 февраля 2019

Я подаю цветные фотографии 1080x1616 в сверточную нейронную сеть в Керасе.Данные передаются по сети очень хорошо, пока не дойдут до последнего сверточного уровня, выдав ошибку, сообщающую, что они ожидают 4-мерный тензор, но вместо этого получают (32,1) -тензор.Я не понимаю, где генерируется это число.

Это моя модель архитектуры:

model = keras.Sequential([
        Conv2D(32, (3,3), padding='same', activation='relu', data_format="channels_last", input_shape=(self.x_res,self.y_res,self.n_channels), kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2,2)),
        Conv2D(64, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2, 2)),
        Conv2D(128, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2, 2)),
        Conv2D(256, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),
        Conv2D(128, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),   
        Conv2D(64, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),
        Conv2D(self.n_channels, (1, 1), padding='same', activation='sigmoid', kernel_initializer=keras.initializers.he_normal())
    ])

И это из модели.summary ()

Layer (type)                 Output Shape              Param #
=================================================================
conv2d_1 (Conv2D)            (None, 1080, 1616, 32)    896
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 540, 808, 32)      0
_________________________________________________________________
conv2d_2 (Conv2D)            (None, 540, 808, 64)      18496
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 270, 404, 64)      0
_________________________________________________________________
conv2d_3 (Conv2D)            (None, 270, 404, 128)     73856
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 135, 202, 128)     0
_________________________________________________________________
conv2d_4 (Conv2D)            (None, 135, 202, 256)     295168
_________________________________________________________________
up_sampling2d_1 (UpSampling2 (None, 270, 404, 256)     0
_________________________________________________________________
conv2d_5 (Conv2D)            (None, 270, 404, 128)     295040
_________________________________________________________________
up_sampling2d_2 (UpSampling2 (None, 540, 808, 128)     0
_________________________________________________________________
conv2d_6 (Conv2D)            (None, 540, 808, 64)      73792
_________________________________________________________________
up_sampling2d_3 (UpSampling2 (None, 1080, 1616, 64)    0
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 1080, 1616, 3)     195
=================================================================
Total params: 757,443
Trainable params: 757,443
Non-trainable params: 0
_________________________________________________________________
None

Документация Keras для слоя UpSampling2D гласит:

Output shape

4D tensor

1 Ответ

0 голосов
/ 12 февраля 2019

Входные данные для вашей модели должны иметь форму (batch_size, x_res, y_res, n_channels), пожалуйста, проверьте это.

Ниже приведен простой тест:

import keras
from keras.layers import Conv2D, MaxPooling2D, UpSampling2D
import numpy as np

x_res = 1080
y_res = 1616
n_channels = 3

model = keras.Sequential([
        Conv2D(32, (3,3), padding='same', activation='relu', data_format="channels_last", input_shape=(x_res,y_res,n_channels), kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2,2)),
        Conv2D(64, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2, 2)),
        Conv2D(128, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        MaxPooling2D((2, 2)),
        Conv2D(256, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),
        Conv2D(128, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),   
        Conv2D(64, (3, 3), padding='same', activation='relu', kernel_initializer=keras.initializers.he_normal()),
        UpSampling2D((2, 2)),
        Conv2D(n_channels, (1, 1), padding='same', activation='sigmoid', kernel_initializer=keras.initializers.he_normal())
    ])

image = np.random.randn(1, x_res, y_res, n_channels)

model.predict(image)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...