我想用TensorFlow slim重新训练一个预先训练过的ResNet-50模型,并在以后用于分类目的。
ResNet-50被设计为1000个类,但我只希望10个类(土地覆盖类型)作为输出。
首先,我试着只为一个图像编写代码,这是我以后可以概括的。
这是我的代码:
from tensorflow.contrib.slim.nets import resnet_v1
import tensorflow as tf
import tensorflow.contrib.slim as slim
import numpy as np
batch_size = 1
height, width, channels = 224, 224, 3
# Create graph
inputs = tf.placeholder(tf.float32, shape=[batch_size, height, width, channels])
with slim.arg_scope(resnet_v1.resnet_arg_scope()):
logits, end_points = resnet_v1.resnet_v1_50(inputs, is_training=False)
saver = tf.train.Saver()
with tf.Session() as sess:
saver.restore(sess, 'd:/bitbucket/cnn-lcm/data/ckpt/resnet_v1_50.ckpt')
representation_tensor = sess.graph.get_tensor_by_name('resnet_v1_50/pool5:0')
# list of files to read
filename_queue = tf.train.string_input_producer(['d:/bitbucket/cnn-lcm/data/train/AnnualCrop/AnnualCrop_735.jpg'])
reader = tf.WholeFileReader()
key, value = reader.read(filename_queue)
img = tf.image.decode_jpeg(value, channels=3)
im = np.array(img)
im = im.reshape(1,224,224,3)
predict_values, logit_values = sess.run([end_points, logits], feed_dict= {inputs: im})
print (np.max(predict_values), np.max(logit_values))
print (np.argmax(predict_values), np.argmax(logit_values))
#img = ... #load image here with size [1, 224,224, 3]
#features = sess.run(representation_tensor, {'Placeholder:0': img})
我有点困惑接下来会发生什么(我应该打开一个图,或者我应该加载网络结构并加载权重,或者加载批处理)。图像形状也有问题。有很多多功能的文档,不容易理解:/
为了达到我的目的,有什么建议可以修改代码吗?
测试图像:AnnualCrop735
最佳答案
如果您提供num_classes
kwargs,resnet层将为您提供预测。查看resnet_v1的文档和代码
您需要在其上添加一个loss函数和培训操作,以便通过重用来微调resnet_v1
...
with slim.arg_scope(resnet_v1.resnet_arg_scope()):
logits, end_points = resnet_v1.resnet_v1_50(
inputs,
num_classes=10,
is_training=True,
reuse=tf.AUTO_REUSE)
...
...
classification_loss = slim.losses.softmax_cross_entropy(
predict_values, im_label)
regularization_loss = tf.add_n(slim.losses.get_regularization_losses())
total_loss = classification_loss + regularization_loss
train_op = slim.learning.create_train_op(classification_loss, optimizer)
optimizer = tf.train.GradientDescentOptimizer(learning_rate)
slim.learning.train(
train_op,
logdir='/tmp/',
number_of_steps=1000,
save_summaries_secs=300,
save_interval_secs=600)
关于python - 使用tf slim重新训练经过预训练的ResNet-50模型以进行分类,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48947083/