Я пытаюсь сгенерировать сиамскую модель и добавляю окончательный плотный слой, который вычисляет попарные расстояния между набором пар входных изображений для более легкого расчета потерь позже. Результатом должен быть массив, который имеет отдельные выходы для каждой пары изображений по вертикали.
Код:
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
Как изменить плотность слой, чтобы он работал?