Классифицировать одиночное изображение на основе обученной модели тензорного потока - PullRequest
0 голосов
/ 09 апреля 2020

Я использую сверточные нейронные сети для классификации изображений по 3 меткам. Я сделал все обучение и тестирование и получил точность 60%. Затем я сохранил эту модель и хочу загрузить одно изображение и классифицировать его по одной из этих меток. Код, который я использую:

X_new = process_data() # That's my input image after some processing
pred = convolutional_neural_network(x) # That's my CNN

with tf.Session() as sess:
    # Here I restore the trained model
    saver = tf.train.import_meta_graph('modelo.meta')
    saver.restore(sess, 'modelo')
    print('Model loaded')

    sess.run(tf.initialize_all_variables())

    # Here I'm trying to predict the label of my image
    c = sess.run(pred, feed_dict={x: X_new})

    print(c)

Когда я печатаю c, он возвращает мне что-то вроде этого:

[[ 1.5495030e+07 -2.3345528e+08 -1.5847101e+08]]

Но я не мог выясни, что это значит и что мне с этим делать. В любом случае, я пытаюсь получить процент от того, насколько изображение принадлежит какому-либо ярлыку. Если кто-нибудь может мне помочь с этим, я буду очень благодарен! Я новичок в tenorflow и у меня возникли трудности.

Большое вам спасибо!

РЕДАКТИРОВАТЬ:

Метод convolutional_neural_network:

def convolutional_neural_network(x):
    weights = {'W_conv1': tf.Variable(tf.random_normal([3, 3, 3, 1, 32])), 
               'W_conv2': tf.Variable(tf.random_normal([3, 3, 3, 32, 64])),
               'W_fc': tf.Variable(tf.random_normal([54080, 1024])), 
               'out': tf.Variable(tf.random_normal([1024, n_classes]))}

    biases = {'b_conv1': tf.Variable(tf.random_normal([32])),
              'b_conv2': tf.Variable(tf.random_normal([64])),
              'b_fc': tf.Variable(tf.random_normal([1024])),
              'out': tf.Variable(tf.random_normal([n_classes]))}

    x = tf.reshape(x, shape=[-1, IMG_PX_SIZE, IMG_PX_SIZE, HM_SLICES, 1])

    conv1 = tf.nn.relu(conv3d(x, weights['W_conv1']) + biases['b_conv1'])
    conv1 = maxpool3d(conv1)

    conv2 = tf.nn.relu(conv3d(conv1, weights['W_conv2']) + biases['b_conv2'])
    conv2 = maxpool3d(conv2)

    fc = tf.reshape(conv2, [-1, 54080])
    fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
    fc = tf.nn.dropout(fc, keep_rate)

    output = tf.matmul(fc, weights['out']) + biases['out']

    return output

Ответы [ 2 ]

0 голосов
/ 10 апреля 2020

Прямо сейчас у вас, похоже, есть выходной слой линейной регрессии (или слой логитов), поэтому трудно интерпретировать выходные данные. Нам также понадобится увидеть вашу функцию потерь, чтобы понять, какие выходы вы видите.

Однако для классификации на одну из 3 меток вы, как правило, хотите завершить свою сеть слоем softmax, тогда выходы будут интерпретируемый как вероятности для каждой метки (умножьте на 100, если вам нужны проценты).

   probabilities = tf.nn.softmax(output)

Вы все равно обучили бы свой классификатор, используя свой слой output / logits с кросс-энтропийной потерей softmax с помощью grounth-true 'y 'значения.

losses = tf.nn.softmax_cross_entropy_with_logits(logits=output, labels=y)
0 голосов
/ 09 апреля 2020

Зависит от типа слоя активации, используемого на последнем слое модели. Я предполагаю softmax, поскольку есть 3 метки, чтобы предсказать. Основываясь на значениях, я думаю, что сеть не смогла предсказать метку с высокой степенью достоверности, следовательно, низкие значения. Если вы просто хотите узнать метку изображения, используйте функцию argmax библиотеки numpy вот так

import numpy as np
c=np.argmax(c)
print(c)

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...