Переобучите предварительно обученную модель ResNet-50 с помощью tf slim для целей классификации

Я хотел бы повторно обучить предварительно обученную модель ResNet-50 с помощью TensorFlow slim и использовать ее позже для целей классификации.

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

AnnualCrop735


person pnz    schedule 23.02.2018    source источник


Ответы (1)


Уровень resnet дает вам прогнозы, если вы предоставляете num_classes kwargs. Посмотрите документацию и код для resnet_v1

Вам нужно добавить функцию потерь и обучающие операции поверх нее, чтобы настроить 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)
person Vikas    schedule 06.03.2018
comment
Проблема в том, что у меня есть ошибки перед расчетом потери классификации. Например, это и многое другое: tensorflow.python.framework.errors_impl.InvalidArgumentError: Assign требует совпадения форм обоих тензоров. lhs shape= [10] rhs shape= [1000] [[Узел: save/Assign_265 = Assign[T=DT_FLOAT, _class=[loc:@resnet_v1_50/logits/biases], use_locking=true, validate_shape=true, _device=/ задание: локальный хост/реплика:0/задача:0/устройство:ЦП:0](resnet_v1_50/logits/biases, сохранить/RestoreV2_265)]] - person pnz; 19.03.2018