Вывод модели Keras: float32 вместо uint8 ... несмотря на то, что метки данных являются uint8 - PullRequest
0 голосов
/ 26 марта 2019

Я тренирую модель для прогнозирования сегментации в медицинских изображениях.В обучающих данных входные данные имеют тип: numpy.float64, а метки наземных истин имеют тип: numpy.uint8.По какой-то причине моя модель создает выходной тип numpy.float32.

Изображение с изображением: пример типов данных

# Defining the model
segmenter = Model(input_img, segmenter(input_img))

# Training the model (type of train_ground is numpy.uint8)
segmenter_train = segmenter.fit(train_X, train_ground, batch_size=batch_size,epochs=epochs,verbose=1,validation_data=(valid_X, valid_ground))

Определение модели:

def segmenter(input_img):
    #encoder
    #input = 28 x 28 x 1 (wide and thin)
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img) #28 x 28 x 32
    conv1 = BatchNormalization()(conv1)
    conv1 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv1)
    conv1 = BatchNormalization()(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1) #14 x 14 x 32
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(pool1) #14 x 14 x 64
    conv2 = BatchNormalization()(conv2)
    conv2 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv2)
    conv2 = BatchNormalization()(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2) #7 x 7 x 64
    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(pool2) #7 x 7 x 128 (small and thick)
    conv3 = BatchNormalization()(conv3)
    conv3 = Conv2D(128, (3, 3), activation='relu', padding='same')(conv3)
    conv3 = BatchNormalization()(conv3)


    #decoder
    conv4 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv3) #7 x 7 x 128
    conv4 = BatchNormalization()(conv4)
    conv4 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv4)
    conv4 = BatchNormalization()(conv4)
    up1 = UpSampling2D((2,2))(conv4) # 14 x 14 x 128
    conv5 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1) # 14 x 14 x 64
    conv5 = BatchNormalization()(conv5)
    conv5 = Conv2D(32, (3, 3), activation='relu', padding='same')(conv5)
    conv5 = BatchNormalization()(conv5)
    up2 = UpSampling2D((2,2))(conv5) # 28 x 28 x 64

    conv6 = Conv2D(64, (3, 3), activation='relu', padding='same')(up2) #7 x 7 x 128
    conv6 = BatchNormalization()(conv6)
    conv6 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv6)
    conv6 = BatchNormalization()(conv6)
    up3 = UpSampling2D((2,2))(conv6) # 14 x 14 x 128

    conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(up3) #7 x 7 x 128
    conv7 = BatchNormalization()(conv7)
    conv7 = Conv2D(64, (3, 3), activation='relu', padding='same')(conv7)
    conv7 = BatchNormalization()(conv7)
    up4 = UpSampling2D((2,2))(conv7) # 14 x 14 x 128

    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(up4) # 28 x 28 x 1
    return decoded

Заранее спасибо за помощь по этому вопросу:)

1 Ответ

0 голосов
/ 26 марта 2019

Сигмоид возвращает действительное число

Последний слой - функция активации сигмоида.Он возвращает действительное число от 0 и 1, а не целое число.

Кроме того, важно, чтобы показатель ошибки, разница между правильным ответом и вычисленным значением, был непрерывным, а не дискретным, поскольку он дифференцируем ипозволяет правильно узнать вес нейронной сети с обратным распространением.

Просто конвертировать и округлить

Для обучения сети просто конвертируйте метки истинности в значения с плавающей запятой.

Как только выВы обучили сеть и хотите использовать ее выходные данные, просто округляя их, чтобы преобразовать их в целые числа - для этого хорошо подойдет сигмовидная активация.

...