2015-12-01 3 views
3

В настоящее время я использую VGG-face-disccriptor от https://github.com/AKSHAYUBHAT/TensorFace.TensorFlow, как смотреть внутри «blob», ответ через CNN

VGG-лицо-дескриптор использует VGG16 и выходной вектор 2622, ряд классных знаменитостей. Что мне действительно нужно, это ответ второго последний полностью подключен слой, размер которого составляет 4096. Используя предоставленный код из репозитория я упоминал выше

import vggface 
from pprint import pprint 
import tensorflow as tf 
input_placeholder = tf.placeholder(tf.float32, shape=(1, 224, 224, 3)) 
network = vggface.VGGFace() 
ses = tf.InteractiveSession() 
network.load(ses,input_placeholder) 
output = network.eval(feed_dict={input_placeholder:vggface.load_image('test/ak.png')})[0] 
pprint(sorted([(v,network.names[k]) for k,v in enumerate(output)],reverse=True)[:10]) 

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

результат:

[(13.686731, 'Aamir_Khan'), 
(8.4711819, 'Adam_Driver'), 
(8.0207777, 'Manish_Dayal'), 
(7.2776313, 'John_Abraham'), 
(6.8999376, 'Jacob_Artist'), 
(6.5390964, 'Adam_Copeland'), 
(6.4980922, 'Adrian_Paul'), 
(6.4170547, 'Akshay_Kumar'), 
(6.3718734, 'D.B._Woodside'), 
(6.0774565, 'Ajay_Devgn')] 

Глядя на output Название переменной, я вижу 2622 Numpy ndarry. Но я действительно хочу второй последний вектор функции. Как я могу это достичь?

Я просмотрел все коды учебников TensorFlow, но не могу найти что-то вроде этого. С Caffe, я просто

out = net.forward() 
v = net.blobs['fc7'].data[0].copy() 

Простой было. Как я могу видеть через «blob» в TensorFlow? С цветным векторным элементом?

ответ

7

Вы можете использовать session.run для получения текущих значений элементов в вашем графике вычислений.

layer7_values = session.run(layer7_tf, feed_dict={<your inputs>}) 

В этом примере sessiontf.Session() является объектом. layer7_tf - это ссылка на выход слоя Tensor в модели TensorFlow, а layer7_values будет содержать значения уровня для данного входа в виде массива numpy.

Чтобы получить ручку layer7_tf, у вас есть пара вариантов. Вы можете изменить TensorFace/vggface/init.py, чтобы вернуть ссылку на соответствующий слой; или вы можете исследовать структуру session.graph_def, чтобы найти name узла, соответствующего этому тензору, и передать имя строки тензора (например, layer7_tf/foo/bar:0, где :0 соответствует 0-му выходному оператору с номером layer7_tf/foo/bar) вместо session.run().

+0

Thx для вашего ответа !! Это помогает – nelya9227

0

Ох .. Я думаю, что нашел решение.

Просто удалить некоторые строки в TensorFace/vggface/INIT .py

# (37): nn.ReLU 
# (38): nn.Dropout(0.500000) 
# (39): nn.Linear(4096 -> 2622) 
#self.layers.append(('linear','39',2622,False)) 
# (40): nn.SoftMax 
#self.layers.append(('softmax')) 

выглядит работает