Извлечь функции с помощью предварительно обученного (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: Не могли бы вы указать, как
что вы о своем комментарии?
Итак, я думаю, я не уверен, что это такое, поскольку я ожидал бы, что обученная нейронная сеть будет детерминированной (но хаотичной).
Ответы
Ответ 1
Недавно команда TensorFlow выпустила глубокий CNN, обученный набору данных ImageNet. Вы можете загрузить script, который извлекает данные (включая графику модели и обученные веса) из здесь. Связанный Урок по распознаванию изображений содержит более подробную информацию о модели.
Пока текущая модель не специально упакована для последующего обучения, вы можете изучить модификацию script для повторного использования частей модели и тренированных весов в вашей собственной сети.