Подтвердить что ты не робот

Извлечь функции с помощью предварительно обученного (Tensorflow) CNN

Глубокое обучение успешно применяется в нескольких больших наборах данных для классификации нескольких классов (кошек, собак, автомобилей, самолетов и т.д.), причем выступления превосходят более простые дескрипторы, такие как Сумки функций над SIFT, цветные гистограммы и т.д..

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

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

Это приводит к набору функций для каждого изображения, которое можно было бы использовать для классического метода классификации, такого как SVM, логистическая регрессия, нейронные сети и т.д.

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

Я смотрел обучающие программы tenorflow, но у них всегда есть четкий этап обучения/тестирования. Я не смог найти файл рассола (или аналогичный) с предварительно сконфигурированным экстрактором функций CNN.

Мои вопросы: существуют ли такие предварительно подготовленные сети и где я могу их найти. Альтернативно: этот подход имеет смысл? Где я могу найти вес CNN +?

ИЗМЕНИТЬ W.r.t. @john comment Я попытался использовать 'DecodeJpeg:0' и 'DecodeJpeg/contents:0' и проверил выходы, которые отличаются (: S)

import cv2, requests, numpy
import tensorflow.python.platform
import tensorflow as tf


response = requests.get('https://i.stack.imgur.com/LIW6C.jpg?s=328&g=1')
data = numpy.asarray(bytearray(response.content), dtype=np.uint8)
image = cv2.imdecode(data,-1)

compression_worked, jpeg_data = cv2.imencode('.jpeg', image)
if not compression_worked:
    raise Exception("Failure when compressing image to jpeg format in opencv library")
jpeg_data = jpeg_data.tostring()

with open('./deep_learning_models/inception-v3/classify_image_graph_def.pb', 'rb') as graph_file:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(graph_file.read())
    tf.import_graph_def(graph_def, name='')

with tf.Session() as sess:
    softmax_tensor = sess.graph.get_tensor_by_name('pool_3:0')

    arr0 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg:0': image}
    ))

    arr1 = numpy.squeeze(sess.run(
        softmax_tensor,
        {'DecodeJpeg/contents:0': jpeg_data}
    ))

    print(numpy.abs(arr0 - arr1).max())

Таким образом, максимальная абсолютная разница 1.27649, и вообще все элементы различаются (тем более, что среднее значение самих arr0 и arr1 лежит между 0 - 0,5).

Я также ожидал бы, что для 'DecodeJpeg:0' нужна строка jpeg, а не массив numpy, почему другое имя содержит "Jpeg". @john: Не могли бы вы указать, как  что вы о своем комментарии?

Итак, я думаю, я не уверен, что это такое, поскольку я ожидал бы, что обученная нейронная сеть будет детерминированной (но хаотичной).

4b9b3361

Ответ 1

Недавно команда TensorFlow выпустила глубокий CNN, обученный набору данных ImageNet. Вы можете загрузить script, который извлекает данные (включая графику модели и обученные веса) из здесь. Связанный Урок по распознаванию изображений содержит более подробную информацию о модели.

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