Объект Tensor не вызывается при настройке входного слоя модели - PullRequest
0 голосов
/ 21 июня 2019

Я строю сиамскую сеть, чтобы получать 2 входных изображения, пройти через ту же сверточную сеть для извлечения объектов и затем вычислить расстояние изображения.

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

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

def siameseNet(input_shape):
    # Input tensors
    input1 = Input(input_shape)
    input2 = Input(input_shape)

    # Load the Xception model and freeze the layers
    xc = Xception(weights='imagenet', include_top=False, input_tensor=Input(shape=INPUT_SHAPE))
    for l in xc.layers:
        l.trainable = False

    # Create layer dict
    layers = dict([(l.name, l) for l in xc.layers])

    # I only want to use the first 3 conv blocks
    x = layers['block3_pool'].output

    # Add my custom top layer
    x = Flatten()(x)
    x = Dense(500, activation='sigmoid')(x)

    # Create two models, based on the same conv nets
    input_model_1 = x(input1)
    input_model_2 = x(input2)

    # Distance function tensor
    distance_func = Lambda(lambda t: K.abs(t[0]-t[1]))

    # Feed the distance function with the outputs
    distance_layer = distance_func([input_model_1, input_model_2])

    # Final prediction layer
    prediction = Dense(1,activation='sigmoid')(distance_layer)

    #Create the full siamese model
    network = Model(inputs=[input1,input2],outputs=prediction)

    return network

model = siameseNet((299,299,3))

Но когда я звоню siameseNet, я получаю сообщение об ошибке:

TypeError Traceback (последний вызов последним) в 38 39 --> 40 модель = siameseNet ((299,299,3))

в siameseNet (input_shape) 20 21 # Создать две модели на основе одинаковых контуров ---> 22 input_model_1 = x (input1) 23input_model_2 = x (input2) 24

TypeError: объект 'Tensor' не вызывается

Ранее я выполнял ту же задачу без предварительно обученной модели, разницаПоскольку вместо создания обычного тензора (x в данном случае) я использовал модель Sequential, созданную с нуля.

Что я должен изменить в своей модели, чтобы моя архитектура работала?

1 Ответ

1 голос
/ 21 июня 2019

Вы можете передать тензор только на модель или слой, но не напрямую на другой тензор.Для вашего случая вам нужно построить временную модель для сиамской ветви:

xc_input = Input(shape=INPUT_SHAPE)
xc = Xception(weights='imagenet', include_top=False, input_tensor=xc_input)
for l in xc.layers:
    l.trainable = False

# Create layer dict
layers = dict([(l.name, l) for l in xc.layers])

# I only want to use the first 3 conv blocks
x = layers['block3_pool'].output

# Add my custom top layer
x = Flatten()(x)
x = Dense(500, activation='sigmoid')(x)

xc_branch = Model(xc_input, x)

# Create two models, based on the same conv nets
input_model_1 = xc_branch(input1)
input_model_2 = xc_branch(input2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...