Понимание изображения - потеря тройки CNN - PullRequest
0 голосов
/ 01 декабря 2018

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

Я пытался использовать метод потери триплета, но продолжал получать ошибки, из-за которых я думал, что мне не хватает какой-то фундаментальной концепции.

Мой код:

def triplet_loss(x):
  anchor, positive, negative = tf.split(x, 3)

  pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), 1)
  neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), 1)

  basic_loss = tf.add(tf.subtract(pos_dist, neg_dist), ALPHA)
  loss = tf.reduce_mean(tf.maximum(basic_loss, 0.0), 0)

  return loss


def build_model(input_shape):
  K.set_image_data_format('channels_last')

  positive_example = Input(shape=input_shape)
  negative_example = Input(shape=input_shape)
  anchor_example = Input(shape=input_shape)

  embedding_network = create_embedding_network(input_shape)

  positive_embedding = embedding_network(positive_example)
  negative_embedding = embedding_network(negative_example)
  anchor_embedding = embedding_network(anchor_example)

  merged_output = concatenate([anchor_embedding, positive_embedding, negative_embedding])
  loss = Lambda(triplet_loss, (1,))(merged_output)

  model = Model(inputs=[anchor_example, positive_example, negative_example],
              outputs=loss)
  model.compile(loss='mean_absolute_error', optimizer=Adam())

  return model



def create_embedding_network(input_shape):
  input_shape = Input(input_shape)
  x = Conv2D(32, (3, 3))(input_shape)
  x = PReLU()(x)
  x = Conv2D(64, (3, 3))(x)
  x = PReLU()(x)

  x = Flatten()(x)
  x = Dense(10, activation='softmax')(x)
  model = Model(inputs=input_shape, outputs=x)
  return model

Каждое изображение читается с использованием:

imageio.imread(imagePath, pilmode="RGB")

И форма каждого изображения:

(1024, 1024, 3)

Затем я использую свой собственный метод триплета (просто создаю 3 набора якоря, положительного и отрицательного)

triplets = get_triplets(data)
triplets.shape

Форма: (количество примеров, триплет, x_image, y_image, количество каналов (RGB)):

(20, 3, 1024, 1024, 3)

Затем я использую функцию build_model:

model = build_model((1024, 1024, 3))

И проблема начинается здесь:

model.fit(triplets, y=np.zeros(len(triplets)), batch_size=1)

Для этой строки кода, когда я пытаюсьпри обучении моей модели я получаю эту ошибку:

error

Для получения более подробной информации, мой код находится в этом сборном блокноте

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

Мой диск / Colab Notebooks / images /

1 Ответ

0 голосов
/ 02 декабря 2018

Для всех, кто тоже борется

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

(?, 1024, 1024, 3)

Блокнот Colab обновлен решением

Ps - я также изменил размер картинок на 256 * 256, чтобы кодработать на моем компьютере намного быстрее.

...