Я долго копался в этом. Я нашел тонну статей; но ни один из них не показывает просто вывод о тензорном потоке как простой вывод. Его всегда "использовать обслуживающий двигатель" или использовать график, который предварительно закодирован/определен.
Вот проблема: у меня есть устройство, которое периодически проверяет наличие обновленных моделей. Затем необходимо загрузить эту модель и выполнить входные прогнозы через модель.
В Керасе это было просто: построить модель; обучаем модель и вызываем model.predict(). В скикит-учи то же самое.
Я могу взять новую модель и загрузить ее; Я могу распечатать все веса; но как в мире я делаю вывод против этого?
Код для загрузки модели и печати весов:
with tf.Session() as sess:
new_saver = tf.train.import_meta_graph(MODEL_PATH + '.meta', clear_devices=True)
new_saver.restore(sess, MODEL_PATH)
for var in tf.trainable_variables():
print(sess.run(var))
Я распечатал все свои коллекции, и у меня есть: ['queue_runners', 'variable', 'loss', 'summary', 'train_op', 'cond_context', 'trainable_variables']
Я пытался использовать sess.run(train_op)
; однако это только начало поднимать полную тренировку; это не то, что я хочу сделать. Я просто хочу провести вывод относительно другого набора входных данных, которые я предоставляю, которые не являются записями TF.
Еще немного подробнее:
Устройство может использовать C++ или Python; до тех пор, пока я могу произвести .exe. Я могу настроить подачу, если я хочу кормить систему. Я тренировался с TFRecords
; но в производстве я не собираюсь использовать TFRecords
; это система реального/почти реального времени.
Спасибо за любой вклад. Я отправляю пример кода в этот репозиторий: https://github.com/drcrook1/CIFAR10/TensorFlow, который выполняет весь процесс обучения и выборки.
Любые советы приветствуются!
------------ РЕДАКТИРОВАТЬ ----------------- Я перестроил модель так, как показано ниже:
def inference(images):
'''
Portion of the compute graph that takes an input and converts it into a Y output
'''
with tf.variable_scope('Conv1') as scope:
C_1_1 = ld.cnn_layer(images, (5, 5, 3, 32), (1, 1, 1, 1), scope, name_postfix='1')
C_1_2 = ld.cnn_layer(C_1_1, (5, 5, 32, 32), (1, 1, 1, 1), scope, name_postfix='2')
P_1 = ld.pool_layer(C_1_2, (1, 2, 2, 1), (1, 2, 2, 1), scope)
with tf.variable_scope('Dense1') as scope:
P_1 = tf.reshape(C_1_2, (CONSTANTS.BATCH_SIZE, -1))
dim = P_1.get_shape()[1].value
D_1 = ld.mlp_layer(P_1, dim, NUM_DENSE_NEURONS, scope, act_func=tf.nn.relu)
with tf.variable_scope('Dense2') as scope:
D_2 = ld.mlp_layer(D_1, NUM_DENSE_NEURONS, CONSTANTS.NUM_CLASSES, scope)
H = tf.nn.softmax(D_2, name='prediction')
return H
обратите внимание, что я добавляю имя 'prediction'
к операции TF, чтобы я мог получить его позже.
При обучении я использовал конвейер ввода для tfrecords
и очередей ввода.
GRAPH = tf.Graph()
with GRAPH.as_default():
examples, labels = Inputs.read_inputs(CONSTANTS.RecordPaths,
batch_size=CONSTANTS.BATCH_SIZE,
img_shape=CONSTANTS.IMAGE_SHAPE,
num_threads=CONSTANTS.INPUT_PIPELINE_THREADS)
examples = tf.reshape(examples, [CONSTANTS.BATCH_SIZE, CONSTANTS.IMAGE_SHAPE[0],
CONSTANTS.IMAGE_SHAPE[1], CONSTANTS.IMAGE_SHAPE[2]])
logits = Vgg3CIFAR10.inference(examples)
loss = Vgg3CIFAR10.loss(logits, labels)
OPTIMIZER = tf.train.AdamOptimizer(CONSTANTS.LEARNING_RATE)
Я feed_dict
использовать feed_dict
для загруженной операции в графе; однако сейчас это просто висит....
MODEL_PATH = 'models/' + CONSTANTS.MODEL_NAME + '.model'
images = tf.placeholder(tf.float32, shape=(1, 32, 32, 3))
def run_inference():
'''Runs inference against a loaded model'''
with tf.Session() as sess:
#sess.run(tf.global_variables_initializer())
new_saver = tf.train.import_meta_graph(MODEL_PATH + '.meta', clear_devices=True)
new_saver.restore(sess, MODEL_PATH)
pred = tf.get_default_graph().get_operation_by_name('prediction')
rand = np.random.rand(1, 32, 32, 3)
print(rand)
print(pred)
print(sess.run(pred, feed_dict={images: rand}))
print('done')
run_inference()
Я считаю, что это не работает, потому что исходная сеть была обучена с использованием TFRecords. В примере набора данных CIFAR данные невелики; наш реальный набор данных огромен, и, насколько я понимаю, TFRecords является лучшей практикой по умолчанию для обучения сети. feed_dict
имеет большой смысл с точки зрения производства; мы можем раскрутить несколько потоков и заполнить эту вещь из наших систем ввода.
Итак, я думаю, у меня есть обученная сеть, я могу получить прогнозируемую операцию; но как мне сказать ему прекратить использовать входные очереди и начать использовать feed_dict
? Помните, что с точки зрения производства у меня нет доступа к тому, что ученые сделали для этого. Они делают свое дело; и мы внедряем его в производство, используя любой согласованный стандарт.
-------INPUT OPS--------
tf.Operation 'input/input_producer/Const' type = Const, tf.Operation 'input/input_producer/Size' type = Const, tf.Operation 'input/input_producer/Greater/y' type = Const, tf.Operation 'input/input_producer/Greater 'type = Greater, tf.Operation' input/input_producer/Assert/Const 'type = Const, tf.Operation' input/input_producer/Assert/Assert/data_0 'type = Const, tf.Operation' input/input_producer/Assert/Assert 'type = Assert, tf.Operation' input/input_producer/Identity 'type = Identity, tf.Operation' input/input_producer/RandomShuffle 'type = RandomShuffle, tf.Operation' input/input_producer 'type = FIFOQueueV2, tf. Операция 'input/input_producer/input_producer_EnqueueMany' type = QueueEnqueueManyV2, tf.Operation 'input/input_producer/input_producer_Close' type = QueueCloseV2, tf.Operation 'input/input_producer/input_producer_ input/input_rodu_ input_rodu_ входной_свойства_точка_в_доставке_входной_входной/вводной/вводной_произведения_входной/вводной/вводной_перечисленной типовой операции type = QueueSizeV2, tf.Operation 'input/input_producer/Cast' type = Cast, tf.Operation 'input/input_produc er/mul/y 'type = Const, tf.Operation' input/input_producer/mul 'type = Mul, tf.Operation' input/input_producer/фракция_of_32_full/tags 'type = Const, tf.Operation' input/input_producer/fra_of_32_full ' type = ScalarSummary, tf.Operation 'input/TFRecordReaderV2' type = TFRecordReaderV2, tf.Operation 'input/ReaderReadV2' type = ReaderReadV2,
------END ВХОД OPS-----
----UPDATE 3----
Я считаю, что мне нужно сделать, чтобы убить секцию ввода графика, обученного с помощью TF Records, и перевести ввод с первого слоя на новый ввод. Это похоже на проведение операции; но это единственный способ сделать вывод, если я тренировался с использованием TFRecords настолько безумно, как это звучит...
Полный график:
Раздел, чтобы убить:
Поэтому я думаю, что возникает вопрос: как убить входной раздел графа и заменить его на feed_dict
?
Последующие меры могут быть следующими: действительно ли это правильный путь? Это кажется помешанным.
----END ОБНОВЛЕНИЕ 3----
---link до контрольной точки files---
--end ссылка на контрольно-пропускной пункт files---
- ----UPDATE 4 -----
Я сдался и просто попробовал "нормальный" способ выполнения логического вывода, предполагая, что я мог бы заставить ученых просто мариновать их модели, и мы могли бы захватить макет модели; распакуйте его и запустите на нем логический вывод. Поэтому, чтобы проверить, я попробовал нормальный способ, предполагая, что мы уже распаковали его... Это также не работает стоит бобов...
import tensorflow as tf
import CONSTANTS
import Vgg3CIFAR10
import numpy as np
from scipy import misc
import time
MODEL_PATH = 'models/' + CONSTANTS.MODEL_NAME + '.model'
imgs_bsdir = 'C:/data/cifar_10/train/'
images = tf.placeholder(tf.float32, shape=(1, 32, 32, 3))
logits = Vgg3CIFAR10.inference(images)
def run_inference():
'''Runs inference against a loaded model'''
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
new_saver = tf.train.import_meta_graph(MODEL_PATH + '.meta')#, import_scope='1', input_map={'input:0': images})
new_saver.restore(sess, MODEL_PATH)
pred = tf.get_default_graph().get_operation_by_name('prediction')
enq = sess.graph.get_operation_by_name(enqueue_op)
#tf.train.start_queue_runners(sess)
print(rand)
print(pred)
print(enq)
for i in range(1, 25):
img = misc.imread(imgs_bsdir + str(i) + '.png').astype(np.float32) / 255.0
img = img.reshape(1, 32, 32, 3)
print(sess.run(logits, feed_dict={images : img}))
time.sleep(3)
print('done')
run_inference()
Tensorflow завершает построение нового графа с функцией вывода из загруженной модели; затем он добавляет все остальные вещи из другого графа в конец. Итак, когда я заполняю feed_dict
ожидая получить выводы обратно; Я просто получаю кучу случайного мусора, как если бы это был первый проход по сети...
Снова; это кажется сумасшедшим; мне действительно нужно написать собственную структуру для сериализации и десериализации случайных сетей? Это должно было быть сделано раньше...
- ----UPDATE 4 -----
Снова; Спасибо!