├── README.md └── mnist.py /README.md: -------------------------------------------------------------------------------- 1 | ## MNIST классификатор на tensorflow 2 | 3 | Код относится к youtube ролику "Как заставить tensorflow сделать хоть что то полезное" 4 | 5 | *Ссылка на ролик появится, когда он будет залит* 6 | 7 | Чтобы запустить код, надо 8 | - Поставить питон налокальную машину. Рекомендую качать отсюда https://www.anaconda.com/download/ 9 | - Поставить tensorflow 10 | ``` 11 | pip install tensorflow 12 | ``` 13 | - Запустить пример командой 14 | ``` 15 | python mnist.py 16 | ``` 17 | -------------------------------------------------------------------------------- /mnist.py: -------------------------------------------------------------------------------- 1 | # coding=utf-8 2 | import tensorflow as tf 3 | from tensorflow.examples.tutorials.mnist import input_data 4 | 5 | if __name__ == "__main__": 6 | # Загружаем MNIST датасет - числа, написанные от руки 7 | mnist = input_data.read_data_sets("MNIST_data", one_hot=True) 8 | 9 | # Задаем граф вычислений в тензорфлоу 10 | # Плейсхолдеры - те места, куда будут подставляться значения входных-выходных переменных 11 | x = tf.placeholder("float", [None, 784]) 12 | y = tf.placeholder("float", [None, 10]) 13 | 14 | # Переменные - это веса нашего единственного слоя сети 15 | W = tf.Variable(tf.zeros([784, 10])) 16 | b = tf.Variable(tf.zeros([10])) 17 | 18 | # Предсказание это линейное преобразование входного вектора.
19 | # До преобразования размерность 784 20 | # После преобразования - 10 21 | linear_prediction = tf.matmul(x, W) + b 22 | scaled_prediction = tf.nn.softmax(linear_prediction) # Softmax 23 | 24 | # Функция потерь - кросс энтропия. В двух словах не объясню почему так. 25 | # Почитайте лучше википедию. Но она работает 26 | loss_function = tf.losses.softmax_cross_entropy(y, linear_prediction) 27 | 28 | # Оптимизатор у нас простой градиентный спуск 29 | learning_rate = 0.01 30 | optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss_function) 31 | 32 | # Инициализируем сессию, с которой будем работать 33 | init = tf.global_variables_initializer() 34 | sess = tf.InteractiveSession() 35 | sess.run(init) 36 | 37 | # Цикл обучения. Учимся на минибатчах, каждые 5 шагов печатаем ошибку 38 | batch_size = 100 39 | 40 | for iteration in range(30000): 41 | batch_x, batch_y = mnist.train.next_batch(batch_size) 42 | sess.run(optimizer, 43 | feed_dict={x: batch_x, y: batch_y}) 44 | if iteration % 5000 == 0: 45 | loss = loss_function.eval( 46 | {x: mnist.test.images, 47 | y: mnist.test.labels}) 48 | print ("#{}, loss={:.4f}".format(iteration, loss)) 49 | 50 | # Задаем граф вычислений, выдающий точность предсказания 51 | predicted_label = tf.argmax(scaled_prediction, 1) 52 | actual_label = tf.argmax(y, 1) 53 | is_equal_labels = tf.equal(actual_label, predicted_label) 54 | accuracy = tf.reduce_mean(tf.cast(is_equal_labels, "float")) 55 | 56 | # Вычисляем точность 57 | accracy_value = accuracy.eval({x: mnist.test.images, y: mnist.test.labels}) 58 | print ("Accuracy:", accracy_value) 59 | 60 | # Предсказываем лейбы для тествого датасета 61 | predicted_label = tf.argmax(scaled_prediction, 1) 62 | predicted_test_values = predicted_label.eval( 63 | {x: mnist.test.images}) 64 | print ("Predictions: {}".format(predicted_test_values)) 65 | --------------------------------------------------------------------------------