Модель Keras, получая те же потери даже после смены веса - PullRequest
0 голосов
/ 02 марта 2020

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

Вот код:

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 absolute difference between the encodings
#     L1_layer = Lambda(lambda tensors:K.abs(tensors[0] - tensors[1]))
#     L1_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)(L1_distance)

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

    # return the model
    return siamese_net

def forward(model, x1, x2):

    return model.call([x1,x2]) 

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

test_loss = tf.convert_to_tensor(0.0)

with tf.GradientTape() as test_tape:
    test_tape.watch(model.trainable_weights)
    test_tape.watch(test_loss)

    x, y = get_batch(32)
    x1 = tf.cast(tf.convert_to_tensor(x[0]), dtype=tf.float32)
    x2 = tf.cast(tf.convert_to_tensor(x[1]), dtype=tf.float32)
    y1 = tf.cast(tf.convert_to_tensor(y), dtype=tf.float32)
    train_loss = tf.convert_to_tensor(0.0)

    with tf.GradientTape() as train_tape:
        train_tape.watch(model.trainable_weights)
        train_tape.watch(train_loss)

        train_loss = contrastive_loss(forward(model, x1, x2), y1)

    gradients = train_tape.gradient(train_loss, model.trainable_weights)
    old_weights = model.get_weights()

    model.set_weights([w - 0.01 * g for w, g in zip(model.trainable_weights, gradients)])

    test_loss = contrastive_loss(forward(model, x1, x2), y1)

    model.set_weights(old_weights)    

print(train_loss)
print(test_loss)

Результаты:

tf.Tensor(8.294627, shape=(), dtype=float32)
tf.Tensor(8.294627, shape=(), dtype=float32)

Почему я получаю такую ​​же потерю? Как вы можете видеть, веса меняются, но результат такой же. Изменение весов должно привести к другому выходу, который должен привести к другой потере? Может быть, вперед снова меняет вес?

1 Ответ

0 голосов
/ 02 марта 2020

Я предполагаю, что вы используете функцию потери кроссентропии. Потеря, которую вы видите (8.2 ...), по сути, является максимально возможной потерей, что означает переполнение в расчете потерь. Обычно это может происходить, например, если ваши прогнозы выходят за пределы диапазона 0-1 или если ваши прогнозы предсказывают точно 0.

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