Может ли кто-нибудь помочь мне с написанием фрагмента кода на Python, касающегося нейронных сетей и набора данных MNIST? - PullRequest
0 голосов
/ 03 декабря 2018

Для школьного проекта я проанализировал приведенный ниже код, но хочу добавить к нему особенность: я хочу дать нейронной сети, когда она закончится с обучением, изображение рукописной цифры из MNIST (скажем, 8), чтобы он мог попытаться определить число 8. Поскольку я совершенно новичок в кодировании и машинном обучении, хотя мне это очень нравится и я хочу больше узнать, я сам не мог понять, как должен выглядеть такой код.Кто-нибудь может мне помочь?

Код написан на Python:

import tensorflow as tf
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data", one_hot=True)

learning_rate = 0.0001
batch_size = 100
update_step = 10

layer_1_nodes = 500
layer_2_nodes = 500
layer_3_nodes = 500
output_nodes = 10

network_input = tf.placeholder(tf.float32, [None, 784])
target_output = tf.placeholder(tf.float32, [None, output_nodes])

layer_1 = tf.Variable(tf.random_normal([784, layer_1_nodes]))
layer_1_bias = tf.Variable(tf.random_normal([layer_1_nodes]))
layer_2 = tf.Variable(tf.random_normal([layer_1_nodes, layer_2_nodes]))
layer_2_bias = tf.Variable(tf.random_normal([layer_2_nodes]))
layer_3 = tf.Variable(tf.random_normal([layer_2_nodes, layer_3_nodes]))
layer_3_bias = tf.Variable(tf.random_normal([layer_3_nodes]))
out_layer = tf.Variable(tf.random_normal([layer_3_nodes, output_nodes]))
out_layer_bias = tf.Variable(tf.random_normal([output_nodes]))

l1_output = tf.nn.relu(tf.matmul(network_input, layer_1) + layer_1_bias)
l2_output = tf.nn.relu(tf.matmul(l1_output, layer_2) + layer_2_bias)
l3_output = tf.nn.relu(tf.matmul(l2_output, layer_3) + layer_3_bias)
ntwk_output_1 = tf.matmul(l3_output, out_layer) + out_layer_bias
ntwk_output_2 = tf.nn.softmax(ntwk_output_1)
cf =   
tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=ntwk_output_1, 
labels=target_output))
ts = tf.train.GradientDescentOptimizer(learning_rate).minimize(cf)
cp = tf.equal(tf.argmax(ntwk_output_2, 1), tf.argmax(target_output, 1))
acc = tf.reduce_mean(tf.cast(cp, tf.float32))


with tf.Session() as sess:
sess.run(tf.global_variables_initializer())

num_epochs = 10
for epoch in range(num_epochs):
    total_cost = 0
    for _ in range(int(mnist.train.num_examples / batch_size)):
        batch_x, batch_y = mnist.train.next_batch(batch_size)
        t, c = sess.run([ts, cf], feed_dict={network_input: batch_x, target_output: batch_y})       
        total_cost += c
    print('Epoch', epoch, 'completed out of', num_epochs, 'loss:', total_cost)
print('Accuracy:', acc.eval({network_input: mnist.test.images,target_output: mnist.test.labels}))

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Проблема в том, что вы не сохраняете свою модель в любой момент времени в процессе обучения.

Вы можете сделать это во время тренировки:

ckpt_path = path_to_save_model
saver = tf.train.saver()
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())

num_epochs = 10
for epoch in range(num_epochs):
    total_cost = 0
    for _ in range(int(mnist.train.num_examples / batch_size)):
        batch_x, batch_y = 
mnist.train.next_batch(batch_size)
        t, c = sess.run([ts, cf], feed_dict= 
   {network_input: batch_x, target_output: batch_y})       
        total_cost += c
    print('Epoch', epoch, 'completed out of', 
num_epochs, 'loss:', total_cost)
    if (epoch+1)%10 == 0:
        saver.saver(sess, ckpt_path)
print('Accuracy:', acc.eval({network_input: 
mnist.test.images,target_output: 
mnist.test.labels}))

Для запуска обученной модели выможно сделать следующее:

with tf.Session() as sess:
    meta_graph = [ i for i in os.listdir(ckpt_path) if i.endswith('.meta')]
    tf.train.import_meta_graph(os.path.join(checkpoint_path, meta_graph_path[0]))
    saver = tf.train.Saver()
    saver.restore(sess, ckpt_path)
     #img = read your image here
    pred = sess.run(ntwk_output_2, feed_dict={network_input: img}
    output = np.argmax(pred)

Для получения дополнительной информации вы можете перейти по этой ссылке

0 голосов
/ 03 декабря 2018
    with tf.Session() as sess:
         number_prediction = tf.argmax(ntwk_output_2 , 1)
         number_prediction = sess.run(number_prediction , feed_dict={network_input : 
                              yourImageNdArray } )
         print("your prediction : ",number_prediction)

Что вам нужно знать:

  • ntwk_ouput_2 - это выход нейронной сети, который дает вам 10 вероятностей - - вы берете самую большую с tf.argmax (tf argmax не делаетверните максимальное значение, но его положение)
  • sess.run отвечает за запуск графика вашего тензорного потока и оценку тензора, указанного в первом параметре
  • , который вам также необходим для подачи вашегосеть с изображением, которое вы хотите предсказать в feed_dict

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

...