Измерение канала найдено 'None', однако через tenor.get_shape () оно было определено - PullRequest
0 голосов
/ 28 мая 2018

Я сталкиваюсь с проблемой, когда пытаюсь объединить одну и ту же форму тензора вместе для обработки через некоторые операции (некоторый полностью связанный слой и т. Д.). Я объединяю их следующим образом:

x_con = KL.concatenate([x1, x2, x3, x4], axis=-1,name='P3_concatenate')
x=Squeeze_excitation(x_con, origin_x=x, out_dim=256 * 4, ratio=16, layer_name='x_con')

иSqueeze_exicitation - это функция, в которой я определил обработку с помощью тензора:

def Squeeze_excitation(input_x, origin_x, out_dim, ratio, layer_name):
    print("input shape:",input_x.get_shape().as_list())
    squeeze = KL.GlobalAveragePooling2D(name=layer_name+'_Squeeze_Layer')(input_x)

    excitation = KL.Dense(units=out_dim // ratio, name=layer_name + '_fully_connected1')(squeeze)

    excitation = KL.Activation('relu',name=layer_name+'_relu')(excitation)
    excitation = KL.Dense(units=out_dim, name=layer_name + '_fully_connected2')(excitation)

    excitation = KL.Activation('sigmoid', name=layer_name+'_sigmoid')(excitation)

    excitation = KL.Reshape((1, 1, out_dim))(excitation)
    print("exicitation shape:", excitation.get_shape().as_list())

    scale = KL.multiply([input_x,excitation], name=layer_name+'_multiply')
    print("scale shape:",scale.get_shape().as_list())

    index = K.constant(value=out_dim//4,dtype=tf.int32)
    scale = KL.add([scale[:, :, :, 0:index], scale[:, :, :, index:2 * index],
                    scale[:, :, :, 2 * index:3 * index], scale[:, :, :, 3 * index:]],name=layer_name+'_Add_n')
    print("scale shape:", scale.get_shape().as_list())

    return scale

После обработки тензора я пытаюсь добавить сверточный слой к этому тензору:

x = KL.Conv2D(256, (3, 3), padding="SAME")(x)

и возникла ошибка:

ValueError: The channel dimension of the inputs should be defined. Found `None`.

Чтобы проверить размеры тензора при обработке с ним, я добавляю некоторый вывод, чтобы следить за его размером, вот вывод в функции Squueze_excitation:

input shape: [None, 32, 32, 1024]
exicitation shape: [None, 1, 1, 1024]
scale shape: [None, 32, 32, 1024]
scale shape: [None, 32, 32, 256]

Понятия не имею, как справиться с этой проблемой, кто-нибудь может мне помочь отсюда?PS Если здесь нет ничего неясного в описании проблемы, пожалуйста, не стесняйтесь спрашивать.

1 Ответ

0 голосов
/ 28 мая 2018

Я исправил эту проблему, обнаружив, что она была вызвана переменной index, которая является keras.constant, и изменил ее на:

scale = KL.Lambda(lambda inputs: KL.Add()([inputs[:, :, :, 0:256], inputs[:, :, :, 256:512],
                    inputs[:, :, :, 512:768], inputs[:, :, :, 768:]]))(scale)

, что означает, что я обернул ее лямбда-слоем в Keras.И я удалил здесь индекс переменной.

...