我试图在我自己的图像和标签上训练Tensorflow官方的resnet模型(link)。
我创建了imagenet_main.py
(my_data_main.py
)的副本,其中我更改了与数据集相关的硬编码值(我只是试图让它在目前很少有图像的情况下工作) ):
"""Runs a ResNet model on the ImageNet dataset."""
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import os
import sys
import tensorflow as tf # pylint: disable=g-bad-import-order
from official.resnet import imagenet_preprocessing
from official.resnet import resnet_model
from official.resnet import resnet_run_loop
_DEFAULT_IMAGE_SIZE = 299
_NUM_CHANNELS = 3
_NUM_CLASSES = 9
# TODO: generate dynamically:
_NUM_IMAGES = {
'train': 484,
'validation': 121,
}
_NUM_TRAIN_FILES = 2
_NUM_VAL_FILES = 2
_SHUFFLE_BUFFER = 200
###############################################################################
# Data processing
###############################################################################
def get_filenames(is_training, data_dir):
"""Return filenames for dataset."""
if is_training:
return [
os.path.join(data_dir, 'my_data_train_%05d-of-%05d.tfrecord' % (i, _NUM_TRAIN_FILES))
for i in range(_NUM_TRAIN_FILES)]
else:
return [
os.path.join(data_dir, 'my_data_validation_%05d-of-%05d.tfrecord' % (i, _NUM_VAL_FILES))
for i in range(_NUM_VAL_FILES)]
# rest of program unchanged
为了加载我的数据,我创建了TFRecords for train and eval,我将其添加到data_dir目录~/Projects/my_data/data/images/
。
然后我用:
python3 my_data_main.py \
--data_dir ~/Projects/my_data/data/images/ \
--model_dir /tmp/tests \
--export_dir /tmp/exports \
--train_epochs 10 \
--max_train_steps 200 \
--epochs_between_evals 1 \
--batch_size 256 \
--multi_gpu \
--hooks LoggingTensorHook \
--num_parallel_calls 12 \
--inter_op_parallelism_threads 0 \
--intra_op_parallelism_threads 0 \
--dtype fp32 \
--export_dir /tmp/resnet \
--version 1 \
--resnet_size 18
问题:正确加载图像以进行培训,但不进行评估。 resnet_run_loop.py
开头的def resnet_model_fn
中的以下行会在Tensorboard中加载图片:
# Generate a summary node for the images
tf.summary.image('images', features, max_outputs=6)
我可以看到火车运行的图像 但不适用于Tensorboard中的eval
我检查的内容:
我检查了我的TFRecords是否已成功读取。
我查看了estimator.py并打印了来自_get_features_and_labels_from_input_fn
的张量形状(在_evaluate_model
中调用)。我找不到任何错误。
我尚未完成的事:
我目前正在下载完整的imagenet数据,试图找到他们准备数据的方式上的差异。
在我写这篇文章之前,我尽力在网上找到答案。欣赏每个人的时间。
答案 0 :(得分:0)
@robieta on the github thread回答了这个问题。在此处复制答案以供将来参考:
我会承认这个人把我扔了。看起来这是TensorFlow中的活动功能请求。 (https://github.com/tensorflow/tensorflow/issues/15332)使用钩子可以破解它。 (Tensorflow Estimator API save image summary in eval mode)请注意马丁威克关于摘要在eval中的警告。这是一个简单的例子:
import tensorflow as tf
def input_fn(*args, **kwargs):
batch_size = 20
images = tf.zeros((batch_size, 10), tf.float32)
labels = tf.zeros((batch_size, 1), tf.int32)
return tf.data.Dataset.from_tensors((images, labels)).repeat(10)
def model_fn(features, labels, mode, params):
pred = tf.layers.dense(inputs=features, units=1)
if mode == tf.estimator.ModeKeys.TRAIN:
loss = tf.losses.absolute_difference(labels, pred)
tf.summary.scalar(name="train_scalar", tensor=1)
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
return tf.estimator.EstimatorSpec(
mode=tf.estimator.ModeKeys.TRAIN,
loss=loss,
train_op=optimizer.minimize(loss, tf.train.get_or_create_global_step()))
if mode == tf.estimator.ModeKeys.EVAL:
loss = tf.losses.absolute_difference(labels, pred)
tf.summary.scalar(name="eval_scalar", tensor=2)
# Use a hook to force evaluation. If commented out the scalar will not be saved.
eval_summary_hook = tf.train.SummarySaverHook(
save_steps=1,
output_dir= "/tmp/summary_test/eval_core",
summary_op=tf.summary.merge_all())
return tf.estimator.EstimatorSpec(
mode=tf.estimator.ModeKeys.EVAL,
loss=loss,
evaluation_hooks=[eval_summary_hook]
)
def main(_):
model_dir = "/tmp/summary_test"
if tf.gfile.Exists(model_dir):
tf.gfile.DeleteRecursively(model_dir)
run_config = tf.estimator.RunConfig(save_summary_steps=1)
estimator = tf.estimator.Estimator(
model_fn=model_fn,
model_dir=model_dir,
params={},
config=run_config
)
for _ in range(10):
estimator.train(input_fn=input_fn)
estimator.evaluate(input_fn=input_fn)
if __name__ == "__main__":
main([])
希望这会有所帮助,一旦评估得到更好的摘要支持,我肯定会默认保存更多的评估信息。