我正在使用以下代码在InceptionV1上训练花朵数据集。提供此代码Here
import os
from datasets import flowers
from nets import inception
from preprocessing import inception_preprocessing
slim = tf.contrib.slim
image_size = inception.inception_v1.default_image_size
def get_init_fn():
"""Returns a function run by the chief worker to warm-start the training."""
checkpoint_exclude_scopes=["InceptionV1/Logits", "InceptionV1/AuxLogits"]
exclusions = [scope.strip() for scope in checkpoint_exclude_scopes]
variables_to_restore = []
for var in slim.get_model_variables():
excluded = False
for exclusion in exclusions:
if var.op.name.startswith(exclusion):
excluded = True
break
if not excluded:
variables_to_restore.append(var)
return slim.assign_from_checkpoint_fn(
os.path.join(checkpoints_dir, 'inception_v1.ckpt'),
variables_to_restore)
train_dir = '/tmp/inception_finetuned/'
with tf.Graph().as_default():
tf.logging.set_verbosity(tf.logging.INFO)
dataset = flowers.get_split('train', flowers_data_dir)
images, _, labels = load_batch(dataset, height=image_size, width=image_size)
# Create the model, use the default arg scope to configure the batch norm parameters.
with slim.arg_scope(inception.inception_v1_arg_scope()):
logits, _ = inception.inception_v1(images, num_classes=dataset.num_classes, is_training=True)
# Specify the loss function:
one_hot_labels = slim.one_hot_encoding(labels, dataset.num_classes)
slim.losses.softmax_cross_entropy(logits, one_hot_labels)
total_loss = slim.losses.get_total_loss()
# Create some summaries to visualize the training process:
tf.scalar_summary('losses/Total Loss', total_loss)
# Specify the optimizer and create the train op:
optimizer = tf.train.AdamOptimizer(learning_rate=0.01)
train_op = slim.learning.create_train_op(total_loss, optimizer)
# Run the training:
final_loss = slim.learning.train(
train_op,
logdir=train_dir,
init_fn=get_init_fn(),
number_of_steps=2)
print('Finished training. Last batch loss %f' % final_loss)
我使用以下代码评估了模型,并获得了58.34%的准确性
import numpy as np
import tensorflow as tf
from datasets import flowers
from nets import inception
slim = tf.contrib.slim
image_size = inception.inception_v1.default_image_size
batch_size = 3
with tf.Graph().as_default():
tf.logging.set_verbosity(tf.logging.INFO)
dataset = flowers.get_split('train', flowers_data_dir)
images, images_raw, labels = load_batch(dataset, height=image_size, width=image_size)
# Create the model, use the default arg scope to configure the batch norm parameters.
with slim.arg_scope(inception.inception_v1_arg_scope()):
logits, _ = inception.inception_v1(images, num_classes=dataset.num_classes, is_training=True)
predictions = tf.argmax(logits, 1)
checkpoint_path = tf.train.latest_checkpoint(train_dir)
init_fn = slim.assign_from_checkpoint_fn(
checkpoint_path,
slim.get_variables_to_restore())
names_to_values, names_to_updates = slim.metrics.aggregate_metric_map({
'eval/Accuracy': slim.metrics.streaming_accuracy(predictions, labels),
'eval/Recall@5': slim.metrics.streaming_recall_at_k(logits, labels, 5),
})
# Define the streaming summaries to write:
for metric_name, metric_value in names_to_values.items():
tf.summary.scalar(metric_name, metric_value)
print('Running evaluation Loop...')
# Load the most recent checkpoint of variables saved
checkpoint_path = tf.train.latest_checkpoint(train_dir)
# Evaluates the model at the given checkpoint path
metric_values = slim.evaluation.evaluate_once(
master='',
checkpoint_path=checkpoint_path,
logdir=train_dir,
num_evals=100,
eval_op=list(names_to_updates.values()),
final_op=list(names_to_values.values()),
summary_op=tf.summary.merge_all())
names_to_values = dict(zip(names_to_values.keys(), metric_values))
for name in names_to_values:
print('%s: %f' % (name, names_to_values[name]))
除了配置检查点和训练目录之外,我仅将代码中的“ V1”替换为“ V2”和“ V4”并训练了模型。
首先,对于所有100次迭代,“ V2”和“ V4”的训练损失在整个过程中都是恒定的,约为4%。
其次,“ V2”和“ V4”的评估准确性均约为25%
我是TF的新手,所以这里肯定有我缺少的东西,我在做什么错?
最佳答案
微调一个相当大的卷积网络(例如Inception V3)时,可能会出错。以下是一些您可以用来改进模型的指标:
您上面发布的培训代码将InceptionV1/Logits
和InceptionV1/AuxLogits
排除在加载到tf.Graph
之外。这些张量是卷积基础之上的完全连接的层。本质上,这允许您训练自己的InceptionV1/Logits
和InceptionV1/AuxLogits
。但是,此代码不会“冻结”卷积基数,这意味着卷积滤波器是可训练的。这是一个坏主意,因为从随机初始化的完全连接的层中流出的大梯度可能会破坏卷积基础中的学习权重。这对较大的网络具有更大的灾难性影响,这可以解释为什么V2和V4的性能比V1差。您可以了解有关微调网络here的更多信息。
0.01的学习率对于微调网络似乎异常高。通常,经过预训练的模型会学到较低级别的过滤器,例如线条和边缘检测,因此您不希望对其权重进行太多更改。 但是,从您的描述来看,该模型似乎没有收敛,因为它在100次迭代中停留在0.04的水平,这建议提高学习率。我对此仍然不确定。也许代码只是一个例子,并不适合其他模型。
Tensorflow的文档更详细地介绍了如何对不同模型here进行微调。它还使用slim
,它是Tensorflow的更友好和简洁的包装器。也许您可以尝试一下。祝好运。
关于python - InceptionV4和V2在“花朵数据集”上的准确性低于InceptionV1,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42965670/