Python 只有具有相同输出形状的层才能使用求和模式合并。层形状

Python 只有具有相同输出形状的层才能使用求和模式合并。层形状,python,keras,Python,Keras,我的模型是U-Net实现- from keras.layers import Input, merge, Convolution2D, MaxPooling2D, UpSampling2D from keras.optimizers import Adam from keras.callbacks import ModelCheckpoint, LearningRateScheduler from keras import backend as K from keras.models imp

我的模型是U-Net实现-

from keras.layers import Input, merge, Convolution2D, MaxPooling2D, 

UpSampling2D
from keras.optimizers import Adam
from keras.callbacks import ModelCheckpoint, LearningRateScheduler
from keras import backend as K
from keras.models import Model

def seg_score(y_true, y_pred):
    smooth = 1.0
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    true_sum = K.sum(y_true_f); pred_sum = K.sum(y_pred_f)
    if(true_sum > pred_sum):
        max_sum = true_sum
    else:
        max_sum = pred_sum
    return (intersection + smooth) / (max_sum + smooth)

def seg_score_loss(y_true, y_pred):
    return -seg_score(y_true, y_pred)

def dice_coef(y_true, y_pred):
    smooth = 1.
    y_true_f = K.flatten(y_true)
    y_pred_f = K.flatten(y_pred)
    intersection = K.sum(y_true_f * y_pred_f)
    return (2. * intersection + smooth) / (K.sum(y_true_f) + K.sum(y_pred_f) + smooth)

def dice_coef_loss(y_true, y_pred):
    return -dice_coef(y_true, y_pred)


def get_unet(num_color_component, dimension):

    img_rows = dimension; img_cols = dimension;
    inputs = Input((num_color_component, img_rows, img_cols))
    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(inputs)
    conv1 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(conv1)
    pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)

    conv2 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(pool1)
    conv2 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(conv2)
    pool2 = MaxPooling2D(pool_size=(2, 2))(conv2)

    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(pool2)
    conv3 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(conv3)
    pool3 = MaxPooling2D(pool_size=(2, 2))(conv3)

    conv4 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(pool3)
    conv4 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(conv4)
    pool4 = MaxPooling2D(pool_size=(2, 2))(conv4)

    conv5 = Convolution2D(512, 3, 3, activation='relu', border_mode='same')(pool4)
    conv5 = Convolution2D(512, 3, 3, activation='relu', border_mode='same')(conv5)

    up6 = merge([UpSampling2D(size=(2, 2))(conv5), conv4], mode='concat', concat_axis=1)

    conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(up6)
    conv6 = Convolution2D(256, 3, 3, activation='relu', border_mode='same')(conv6)

    up7 = merge([UpSampling2D(size=(2, 2))(conv6), conv3], mode='concat', concat_axis=1)
    conv7 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(up7)
    conv7 = Convolution2D(128, 3, 3, activation='relu', border_mode='same')(conv7)

    up8 = merge([UpSampling2D(size=(2, 2))(conv7), conv2], mode='concat', concat_axis=1)
    conv8 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(up8)
    conv8 = Convolution2D(64, 3, 3, activation='relu', border_mode='same')(conv8)

    up9 = merge([UpSampling2D(size=(2, 2))(conv8), conv1], mode='concat', concat_axis=1)
    conv9 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(up9)
    conv9 = Convolution2D(32, 3, 3, activation='relu', border_mode='same')(conv9)

    conv10 = Convolution2D(1, 1, 1, activation='sigmoid')(conv9)

    model = Model(input=inputs, output=conv10)

    #model.compile(optimizer=Adam(lr=1e-5), loss=seg_score_loss, metrics=[seg_score])
    model.compile(optimizer=Adam(lr=1e-5), loss=dice_coef_loss, metrics=[dice_coef])

    return model
我得到的错误如下-

回溯(最近一次呼叫最后一次): 文件“/home/zaverichintan/Chintan/PycharmProjects/CNN_wbc_identification/train.py”,第60行,in model=mo.get\u unet(num\u color\u component,filter\u size); 文件“/home/zaverichintan/Chintan/PycharmProjects/CNN_wbc_identification/models.py”,第63行,在get_unet中 up7=合并([UpSampling2D(大小=(2,2))(conv6),conv3],模式='concat',concat_轴=1) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第456行,合并 名称=名称) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第107行,在init 节点指数、张量指数) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第187行,在验证中 '图层形状:%s'(输入形状)) ValueError:“concat”模式只能合并具有匹配输出形状的层,concat轴除外。图层形状:[(无,0,16,256),(无,0,16,128)]

将Concat轴更改为3,然后我得到这个-

文件“/home/zaverichintan/Chintan/PycharmProjects/CNN_wbc_identification/train.py”,第60行,in model=mo.get\u unet(num\u color\u component,filter\u size); 文件“/home/zaverichintan/Chintan/PycharmProjects/CNN_wbc_identification/models.py”,第71行,在get_unet中 up8=keras.layers.merge([UpSampling2D(大小=(2,2))(conv7),conv2],mode='concat',concat_轴=1) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第456行,合并 名称=名称) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第107行,在init 节点指数、张量指数) 文件“/home/zaverichintan/anaconda2/lib/python2.7/site packages/keras/legacy/layers.py”,第187行,在验证中 '图层形状:%s'(输入形状)) ValueError:“concat”模式只能合并具有匹配输出形状的层,concat轴除外。图层形状:[(无,0,32,128),(无,1,32,64)]


这很直截了当:

ValueError:“concat”模式只能合并具有匹配输出形状的层,concat轴除外。图层形状:[(无,0,16,256),(无,0,16,128)]

你有:

up6 = merge([UpSampling2D(size=(2, 2))(conv5), conv4], mode='concat', concat_axis=1)
他们明确地说,除了concat轴之外,形状应该是相同的

形状不同的尺寸是第三个尺寸(一个是256,另一个是128)。因此,应该将concat轴设置为3而不是1。例如:

up6 = merge([UpSampling2D(size=(2, 2))(conv5), conv4], mode='concat', concat_axis=3)

我希望这有帮助:)

您必须设置
图像\u数据\u格式:“\u首先频道”
,如本文所述,或将输入更改为

 inputs = Input((img_rows, img_cols, num_color_component))
然后,
concat_轴
必须与数据格式相对应


下面是一个如何在Keras中实现U型网络的示例:

您需要将
conat_轴
更改为具有不同尺寸的轴,或者将不同的轴尺寸更改为相等。conat_轴将是?很抱歉,这是一个打字错误,
concat_轴
。好吧!那么它的值应该设置为什么?我不确定,我假设为t这个值应该根据卷积神经网络的结构来设置,或者它是特定于问题的。也许有更多知识的人可以根据卷积神经网络的结构来立即判断问题是什么,但就特定于问题而言,我不知道你想做什么。