22

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

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

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

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

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

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

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

EDIT W.r.t. комментарий @ Джонсе я попытался с помощью '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: Не могли бы вы указать, как уверены, что вы про комментарий?

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

+0

Резиновая утка: когда googleing на «CNN, обученном на ImageNet», я нашел это: http://www.vlfeat.org/matconvnet/pretrained/ – Herbert

+1

Я мог бы скомпилировать и запустить эту сеть на своем ноутбуке - и использовать веб-камера для определения/классификации изображений github.com/sermanet/OverFeat –

ответ

18

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

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

+0

Это кажется удивительным, когда у меня есть работа, я соглашусь :) classify_image предполагает, что это приводит к метке. Я хочу вектор-функцию, так как мои метки не те, что из ImageNet. – Herbert

+4

Использование этих комментариев как в журнале: предполагается использовать 'softmax_tensor = sess.graph.get_tensor_by_name ('pool_3: 0')' вместо 'softmax_tensor = sess.graph.get_tensor_by_name ('softmax: 0')' для получения функций. – Herbert

+0

Я заметил, что 'feed_dict' этой конкретной сети имеет' 'DecodeJpeg/contents: 0'' (я думаю, что это определено в файле' classify_image_graph_def.pb'), знаете ли вы, как определить, какие возможные конфигурации feed_dict возможны? Могу ли я также создать массив numpy с изображением? – Herbert

Смежные вопросы