Как я могу извлечь прогнозы из слоя Softmax на Tensorflow - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь извлечь прогнозы, использовать прогнозы при расчете точности / точности / отзыва / F1 и вероятности прогноза.Я знаю, что у меня есть 10 выходных классов, поэтому я не могу рассчитать точность на единицу, но я буду делать все это в других моделях, более того, я хотел бы иметь возможность извлекать вероятности прогнозирования.Моя модель выглядит следующим образом.Я проверил GitHub и StackOverflow, но мне еще предстоит найти способ извлечь эти свойства.Большинство ответов подходят близко, но никогда не отвечают тому, что мне нужно.Я использовал некоторые низкие числа эпох, чтобы быстро проверить модель и сделать экран вывода менее насыщенным.

import tensorflow as tf
from tensorflow.contrib.layers import fully_connected

from sklearn.datasets import fetch_mldata
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

mnist = fetch_mldata('MNIST original', data_home="data/mnist/")
lb = LabelBinarizer().fit(mnist.target)
X_train, X_test, y_train, y_test = train_test_split(mnist.data, lb.transform(mnist.target), train_size=0.9, test_size=0.1)

X = tf.placeholder(tf.float32, shape=(None, 784))
y = tf.placeholder(tf.int64, shape=(None, 10))

lOne = fully_connected(inputs=X, num_outputs=100, activation_fn=tf.nn.elu)
logits = fully_connected(inputs=lOne, num_outputs=10, activation_fn=tf.nn.softmax)

pred = logits
acc = tf.metrics.accuracy(labels=y, predictions=pred)

loss = tf.losses.softmax_cross_entropy(logits=logits, onehot_labels=y)
trainOP = tf.train.AdamOptimizer(0.001).minimize(loss)

import numpy as np
bSize = 100
batches = int(np.floor(X_train.shape[0]/bSize)+1)
def batcher(dSet, bNum):
    return(dSet[bSize*(bNum-1):bSize*(bNum)])

epochs = 2
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    for epoch in range(0, epochs):
        for batch in range(1, batches):
            X_batch = batcher(X_train, batch)
            y_batch = batcher(y_train, batch)
            sess.run(trainOP, feed_dict={X: X_batch, y: y_batch})
        lossVal = sess.run([loss], feed_dict={X: X_test, y: y_test})
        print(lossVal)


    sess.close()

Ответы [ 2 ]

0 голосов
/ 27 мая 2018

Я пишу на случай, если кто-нибудь может наткнуться на этот конкретный случай.Я построил сеть, следуя базовым примерам MNIST, я использовал tf.nn.softmax на последнем уровне и ожидал получить результаты от этого уровня.Похоже, мне нужно снова использовать функцию softmax, чтобы получить результаты от слоя, такого как yPred = tf.nn.softmax(logits), где logits является именем выходного слоя.Я добавляю фиксированный код ниже.

Я могу добавить строку, чтобы сохранить модель, загрузить ее позже и сделать прогнозы для сохраненной модели.Так как это всего лишь пример для меня построения модели, я опустил часть сохранения.

import tensorflow as tf
from tensorflow.contrib.layers import fully_connected

from sklearn.datasets import fetch_mldata
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

mnist = fetch_mldata('MNIST original', data_home="data/mnist/")
lb = LabelBinarizer().fit(mnist.target)
X_train, X_test, y_train, y_test = train_test_split(mnist.data, lb.transform(mnist.target), train_size=0.9, test_size=0.1, stratify = mnist.target, random_state=42)

X = tf.placeholder(tf.float32, shape=(None, 784))
y = tf.placeholder(tf.int64, shape=(None, 10))


lOne = fully_connected(inputs=X, num_outputs=100, activation_fn=tf.nn.elu)
lTwo = fully_connected(inputs=lOne, num_outputs=100, activation_fn=tf.nn.elu)
logits = fully_connected(inputs=lTwo, num_outputs=10, activation_fn=tf.nn.softmax)

pred = tf.nn.softmax(logits)
acc_bool = tf.equal(tf.argmax(logits, 1), tf.argmax(y, 1))
acc_Num = tf.cast(acc_bool, tf.float32)
acc_Mean = tf.reduce_mean(acc_Num)

loss = tf.losses.softmax_cross_entropy(logits=logits, onehot_labels=y)
trainOP = tf.train.AdamOptimizer(0.001).minimize(loss)


import numpy as np
bSize = 1024
batches = int(np.floor(X_train.shape[0]/bSize)+1)
def batcher(dSet, bNum):
    return(dSet[bSize*(bNum-1):bSize*(bNum)])



epochs = 250
init = tf.global_variables_initializer()
trainA = []
testA = []

with tf.Session() as sess:
sess.run(init)
for epoch in range(0, epochs):
    for batch in range(1, batches):
        X_batch = batcher(X_train, batch)
        y_batch = batcher(y_train, batch)
        sess.run(trainOP, feed_dict={X: X_batch, y: y_batch})
    if epoch % 25 == 1:
        trainLoss, trainAcc = sess.run([loss, acc_Mean], feed_dict={X: X_train, y: y_train})
        testLoss, testAcc = sess.run([loss, acc_Mean], feed_dict={X: X_test, y: y_test})
        yPred = sess.run(pred, feed_dict={X: X_test[0].reshape(1,-1), y: y_test[0].reshape(1,-1)})
        print(yPred)

sess.close()
0 голосов
/ 26 мая 2018

Код, представленный в вопросе, охватывает обучение, но не «использование» (вывод) с полученной моделью.

Два вопроса:

  • Обученная модель не сериализуется,поэтому будущие прогоны будут выполняться на неподготовленной модели и предсказывать, что им скажет их инициализация.Отсюда комментарий к вопросу , предлагающий сохранить обученную модель и восстановить ее при прогнозировании.
  • Логиты являются результатом функции SoftMax.Обычный способ получить класс из логитов - это выбрать наибольшее значение в тензоре (здесь вектор).

С TensorFlow последняя точка может быть выполнена с помощью tf.argmax («Возвращает индекс с наибольшим значением по осям тензора.»):

tf.argmax(input=logits, axis=1)

В целом, код вопроса лишь частично охватывает учебник MNIST изКоманда TensorFlow.Возможно, там больше указателей, если вы застряли с этим кодом.

...