TypeError: при построении модели keras - PullRequest
1 голос
/ 03 марта 2020

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

Код:

def pairwise_dist (A, B):  
    ''' Computes pairwise distances between each elements of A and each elements of B.

      Args:
        A,    [m,d] matrix
        B,    [m,d] matrix
      Returns:
        D,    [m] matrix of pairwise distances between each separate vertical pairs  pair of A and B
    '''

    output_list = []

    for i in range(A.shape[0]):


        # return pairwise euclidead difference matrix
        output_list.append(tf.sqrt(tf.maximum(tf.reduce_sum(tf.square(A[i] - B[i])), 0.0)))

    return tf.reshape(tf.stack(output_list),[1,len(output_list)])

def get_siamese_model(input_shape):
    """
        Model architecture based on the one provided in: http://www.cs.utoronto.ca/~gkoch/files/msc-thesis.pdf
    """

    # Define the tensors for the two input images
    left_input = Input(input_shape)
    right_input = Input(input_shape)

    # Convolutional Neural Network
    model = Sequential()
    model.add(Conv2D(64, (10,10), activation='relu', input_shape=input_shape,
                   kernel_initializer=initialize_weights, kernel_regularizer=l2(2e-4)))
    model.add(MaxPooling2D())
    model.add(Conv2D(128, (7,7), activation='relu',
                     kernel_initializer=initialize_weights,
                     bias_initializer=initialize_bias, kernel_regularizer=l2(2e-4)))
    model.add(MaxPooling2D())
    model.add(Conv2D(128, (4,4), activation='relu', kernel_initializer=initialize_weights,
                     bias_initializer=initialize_bias, kernel_regularizer=l2(2e-4)))
    model.add(MaxPooling2D())
    model.add(Conv2D(256, (4,4), activation='relu', kernel_initializer=initialize_weights,
                     bias_initializer=initialize_bias, kernel_regularizer=l2(2e-4)))
    model.add(Flatten())
    model.add(Dense(4096, activation='sigmoid',
                   kernel_regularizer=l2(1e-3),
                   kernel_initializer=initialize_weights,bias_initializer=initialize_bias))

    # Generate the encodings (feature vectors) for the two images
    encoded_l = model(left_input)
    encoded_r = model(right_input)

    # Add a customized layer to compute the pairwise distance between the encodings
    L1_layer = Lambda(lambda tensors:pairwise_dist(tensors[0], tensors[1]))
    pw_distance = L1_layer([encoded_l, encoded_r])

    # Add a dense layer with a sigmoid unit to generate the similarity score
    prediction = Dense(1,activation='sigmoid',bias_initializer=initialize_bias)(pw_distance)

    # Connect the inputs with the outputs
    siamese_net = Model(inputs=[left_input,right_input],outputs=prediction)

    # return the model
    return siamese_net

model = get_siamese_model((105, 105, 1))

Ошибка:

TypeError                                 Traceback (most recent call last)
<ipython-input-85-9ba3e962b271> in <module>
     44     return siamese_net
     45 
---> 46 model = get_siamese_model((105, 105, 1))
     47 model.summary()

<ipython-input-85-9ba3e962b271> in get_siamese_model(input_shape)
     33     # Add a customized layer to compute the pairwise distance between the encodings
     34     L1_layer = Lambda(lambda tensors:pairwise_dist(tensors[0], tensors[1]))
---> 35     pw_distance = L1_layer([encoded_l, encoded_r])
     36 
     37     # Add a dense layer with a sigmoid unit to generate the similarity score

C:\ProgramData\Anaconda3\lib\site-packages\keras\backend\tensorflow_backend.py in symbolic_fn_wrapper(*args, **kwargs)
     73         if _SYMBOLIC_SCOPE.value:
     74             with get_graph().as_default():
---> 75                 return func(*args, **kwargs)
     76         else:
     77             return func(*args, **kwargs)

C:\ProgramData\Anaconda3\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
    487             # Actually call the layer,
    488             # collecting output(s), mask(s), and shape(s).
--> 489             output = self.call(inputs, **kwargs)
    490             output_mask = self.compute_mask(inputs, previous_mask)
    491 

C:\ProgramData\Anaconda3\lib\site-packages\keras\layers\core.py in call(self, inputs, mask)
    714         else:
    715             self._input_dtypes = K.dtype(inputs)
--> 716         return self.function(inputs, **arguments)
    717 
    718     def compute_mask(self, inputs, mask=None):

<ipython-input-85-9ba3e962b271> in <lambda>(tensors)
     32 
     33     # Add a customized layer to compute the pairwise distance between the encodings
---> 34     L1_layer = Lambda(lambda tensors:pairwise_dist(tensors[0], tensors[1]))
     35     pw_distance = L1_layer([encoded_l, encoded_r])
     36 

<ipython-input-84-45055088321b> in pairwise_dist(A, B)
     11     output_list = []
     12 
---> 13     for i in range(A.shape[0]):
     14 
     15         # squared norms of each row in A and B

TypeError: 'NoneType' object cannot be interpreted as an integer

Как изменить плотность слой, чтобы он работал?

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