Я тренировал реснет с tf.estimator, модель сохранялась в процессе обучения. Сохраненные файлы состоят из .data
, .index
и .meta
. Я хочу загрузить эту модель обратно и получить прогнозы для новых изображений. Данные были переданы модели во время обучения с использованием tf.data.Dataset
. Я внимательно следил за реализацией реснета, представленной здесь.
Я хотел бы восстановить модель и передать входные данные узлам с помощью feed_dict.
Первая попытка
#rebuild input pipeline
images, labels = input_fn(data_dir, batch_size=32, num_epochs=1)
#rebuild graph
prediction= imagenet_model_fn(images,labels,{'batch_size':32,'data_format':'channels_first','resnet_size':18},mode = tf.estimator.ModeKeys.EVAL).predictions
saver = tf.train.Saver()
with tf.Session() as sess:
ckpt = tf.train.get_checkpoint_state(r'./model')
saver.restore(sess, ckpt.model_checkpoint_path)
while True:
try:
pred,im= sess.run([prediction,images])
print(pred)
except tf.errors.OutOfRangeError:
break
Я передал набор данных, который был оценен на той же модели с использованием classifier.evaluate
, но описанный выше метод дает неверные прогнозы. Модель дает одинаковый класс и вероятность 1,0 для всех изображений.
Вторая попытка
saver = tf.train.import_meta_graph(r'.\resnet\model\model-3220.meta')
sess = tf.Session()
saver.restore(sess,tf.train.latest_checkpoint(r'.\resnet\model'))
graph = tf.get_default_graph()
inputImage = graph.get_tensor_by_name('image:0')
logits= graph.get_tensor_by_name('logits:0')
#Get prediction
print(sess.run(logits,feed_dict={inputImage:newimage}))
Это также дает неверные прогнозы по сравнению с classifier.evaluate
. Я даже могу запустить sess.run(logits)
без feed_dict
!
Третья попытка
def serving_input_fn():
receiver_tensor = {'feature': tf.placeholder(shape=[None, 384, 256, 3], dtype=tf.float32)}
features = {'feature': receiver_tensor['images']}
return tf.estimator.export.ServingInputReceiver(features, receiver_tensor)
Это терпит неудачу с
Traceback (most recent call last):
File "imagenet_main.py", line 213, in <module>
tf.app.run(argv=[sys.argv[0]] + unparsed)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\platform\app.py", line 124, in run
_sys.exit(main(argv))
File "imagenet_main.py", line 204, in main
resnet.resnet_main(FLAGS, imagenet_model_fn, input_fn)
File "C:\Users\Photogauge\Desktop\iprings_images\models-master\models-master\official\resnet\resnet.py", line 527, in resnet_main
classifier.export_savedmodel(export_dir_base=r"C:\Users\Photogauge\Desktop\iprings_images\models-master\models-master\official\resnet\export", serving_input_receiver_fn=serving_input_fn)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\estimator\estimator.py", line 528, in export_savedmodel
config=self.config)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\estimator\estimator.py", line 725, in _call_model_fn
model_fn_results = self._model_fn(features=features, **kwargs)
File "imagenet_main.py", line 200, in imagenet_model_fn
loss_filter_fn=None)
File "C:\Users\Photogauge\Desktop\iprings_images\models-master\models-master\official\resnet\resnet.py", line 433, in resnet_model_fn
tf.argmax(labels, axis=1), predictions['classes'])
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\util\deprecation.py", line 316, in new_func
return func(*args, **kwargs)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\ops\math_ops.py", line 208, in argmax
return gen_math_ops.arg_max(input, axis, name=name, output_type=output_type)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", line 508, in arg_max
name=name)
File "C:\Users\Photogauge\Anaconda3\envs\tensorflow\lib\site-packages\tensorflow\python\framework\op_def_library.py", line 528, in _apply_op_helper
(input_name, err))
ValueError: Tried to convert 'input' to a tensor and failed. Error: None values not supported.
Код, который я использовал для обучения и построения модели, выглядит следующим образом:
Спецификация для разбора набора данных:
def parse_record(raw_record, is_training):
keys_to_features = {
'image/encoded':
tf.FixedLenFeature((), tf.string, default_value=''),
'image/class/label':
tf.FixedLenFeature([], dtype=tf.int64, default_value=-1),
}
parsed = tf.parse_single_example(raw_record, keys_to_features)
image = tf.image.decode_image(
tf.reshape(parsed['image/encoded'], shape=[]),3)
image = tf.image.convert_image_dtype(image, dtype=tf.float32)
label = tf.cast(
tf.reshape(parsed['image/class/label'], shape=[]),
dtype=tf.int32)
return image, tf.one_hot(label,2)
Следующая функция анализирует данные и создает пакеты для обучения.
def input_fn(is_training, data_dir, batch_size, num_epochs=1):
dataset = tf.data.Dataset.from_tensor_slices(
filenames(is_training, data_dir))
if is_training:
dataset = dataset.shuffle(buffer_size=_FILE_SHUFFLE_BUFFER)
dataset = dataset.flat_map(tf.data.TFRecordDataset)
dataset = dataset.map(lambda value: parse_record(value, is_training),
num_parallel_calls=5)
dataset = dataset.prefetch(batch_size)
if is_training:
dataset = dataset.shuffle(buffer_size=_SHUFFLE_BUFFER)
dataset = dataset.repeat(num_epochs)
dataset = dataset.batch(batch_size)
iterator = dataset.make_one_shot_iterator()
images, labels = iterator.get_next()
return images, labels
Классификатор создается, как показано ниже, для обучения на наборе поездов и оценки на наборе проверки.
classifier = tf.estimator.Estimator(
model_fn=model_function, model_dir=flags.model_dir, config=run_config,
params={
'resnet_size': flags.resnet_size,
'data_format': flags.data_format,
'batch_size': flags.batch_size,
})
#Training cycle
classifier.train(
input_fn=lambda: input_function(
training_phase=True, flags.data_dir, flags.batch_size, flags.epochs_per_eval),
hooks=[logging_hook])
# Evaluate the model
eval_results = classifier.evaluate(input_fn=lambda: input_function(
training_phase=False, flags.data_dir, flags.batch_size))
Вот как я пытался загрузить и получить прогнозы от модели.
Как правильно восстановить сохраненную модель и сделать на ней вывод. Я хочу передавать изображения напрямую, не используя tf.data.Dataset
.
Обновить
Значение
ckpt
после запускаckpt = tf.train.get_checkpoint_state(r'./model')
равноmodel_checkpoint_path: "./model\model.ckpt-5980" all_model_checkpoint_paths: "./model\model.ckpt-5060" all_model_checkpoint_paths: "./model\model.ckpt-5061" all_model_checkpoint_paths: "./model\model.ckpt- 5520" all_model_checkpoint_paths: "./model\model.ckpt-5521" all_model_checkpoint_paths: "./model\model.ckpt-5980"
Вывод такой же, когда я пытаюсь `saver.restore(sess, tf.train.latest_checkpoint(r'.\resnet\model'))
Передача полного пути к
saver.restore
дает тот же результат Во всех случаях была восстановлена одна и та же модель,model.ckpt-5980
ckpt
послеckpt = tf.train.get_checkpoint_state(r'./model')
? Что произойдет, если вместо этого вы восстановите черезsaver.restore(sess, tf.train.latest_checkpoint(r'.\resnet\model'))
? А что если вместоrestore
передать строку с полным путем к контрольной точке? - person GPhilo   schedule 09.02.2018shuffle
. Ваши данные где-то перемешиваются? - person GPhilo   schedule 09.02.20185980
— это значениеglobal_step
при сохранении контрольной точки, поэтому, если я что-то не упустил, ваша сеть увидела в общей сложности32*5980 = 191360
семплов... этого вряд ли достаточно для обучения реснета. Вы уверены, что контрольная точка действительно содержит веса обученной сети? - person GPhilo   schedule 09.02.2018if is_training: dataset = dataset.shuffle(buffer_size=_FILE_SHUFFLE_BUFFER)
. Внутри классификатора есть методclassifier.evaluate
, который обычно принимает в качестве входных данных проверочный набор. Я попробовал набор тестов для этого метода после того, как модель была обучена и сохранена, т. Е. Я закомментировалclassifier.train
и указал каталог набора данных проверки на тестовый каталог. Я мог видеть, что восстанавливается та же модель,model.ckpt-5980
, и я получил точность84%
. - person Effective_cellist   schedule 09.02.2018shuffle
. Дело в том, что там вы только перетасовываете имена файлов, а не сами сэмплы в файлах. Если у вас нет одного сэмпла на файл tfrecord (что, как я предполагаю, не так), все сэмплы в каждом файле будут в одном и том же порядке в каждую эпоху. - person GPhilo   schedule 09.02.2018