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

Я пытаюсь классифицировать 3D-изображения с помощью CNN с Tensorflow и думаю, что что-то не так. После обучения и проверки я использую сохраненную модель для классификации одного изображения. Когда я классифицирую это изображение, при каждой попытке я получаю разные результаты.

Пример:

1st try:
   input: Picture of a 3D brain
   result of the classification: 1

2nd try:
   input: Same picture of 3D brain
   result of the classification: 2

Я хотел знать, нормально ли это или я что-то делаю неправильно. Модель, которую я использую, имеет точность 67%.

Вот код:

def conv3d(x, W):
    return tf.nn.conv3d(x, W, strides=[1, 1, 1, 1, 1], padding='SAME')


def maxpool3d(x):
    return tf.nn.max_pool3d(x, ksize=[1, 2, 2, 2, 1], strides=[1, 2, 2, 2, 1], padding='SAME')


def convolutional_neural_network(x):
    number = calc()

    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([number, 1024])),
               'out': tf.Variable(tf.random_normal([1024, 3]))}

    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([3]))}

    x = tf.reshape(x, shape=[-1, 50, 50, 30, 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, number])
    fc = tf.nn.relu(tf.matmul(fc, weights['W_fc']) + biases['b_fc'])
    fc = tf.nn.dropout(fc, 0.8)

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

    return output

Это основная функция:

def classification(path):
    x = tf.placeholder('float')

    new_path = extract(path + '.gz')
    X_new = process_data(path=new_path, apply_hist=True)

    pred = convolutional_neural_network(x)

    res = 0

    with tf.Session() as sess:
        saver = tf.train.import_meta_graph('modelo.meta')
        saver.restore(sess, 'modelo')

        sess.run(tf.initialize_all_variables())

        probabilities = tf.nn.softmax(pred)

        c = sess.run(probabilities, feed_dict={x: X_new})

        res = np.argmax(c)

    return res

Я делаю такая же обработка входных изображений.

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

EDIT:

Я попытался поменять местами эти строки, но результаты все равно разные .

    with tf.Session() as sess:
        sess.run(tf.initialize_all_variables())
        saver = tf.train.import_meta_graph('modelo.meta')
        saver.restore(sess, 'modelo')

1 Ответ

0 голосов
/ 06 мая 2020

Сначала вы восстанавливаете свои переменные, а затем после инициализации переменных случайными значениями:

saver.restore(sess, 'modelo')
sess.run(tf.initialize_all_variables())

Итак, у вас есть два разных прогноза, потому что вы дважды инициализируете свою модель со случайными величинами. Вам нужно поменять местами эти строки или опустить altogehter initialize_all_vars. Если честно, я точно не знаю, как это исправить, но, по крайней мере, это направляет вас на правильный путь. Надеюсь, это поможет!

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