Этот пост является частью 12-месячного проекта ускоренного обучения Month to Master. На октябрь моя цель - победить чемпиона мира Магнуса Карлсена в шахматной партии.
Сегодня я закончил писать небольшой скрипт Python, который преобразует шахматные партии, загруженные из Интернета, в правильно отформатированные данные, необходимые для обучения моей модели машинного обучения.
Таким образом, сегодня пришло время приступить к построению самой модели машинного обучения.
Вместо того, чтобы начинать с нуля, я поискал уже закодированную модель на Github. В частности, мне нужно было найти модель, достаточно хорошо аналогичную шахматам.
Мне не пришлось особо искать: версия Hello World для машинного обучения называется MNIST, и она идеально подходит для моих целей.
MNIST - это набор данных, который состоит из изображений рукописных цифр размером 28 x 28 пикселей, таких как:
Набор данных также включает десять меток, указывающих, какая цифра представлена на каждом изображении (т.е. метки для приведенных выше изображений будут 5, 0, 4, 1).
Цель состоит в том, чтобы создать модель, которая, учитывая набор из 28 x 28 = 784 значений, может точно предсказать правильную числовую цифру.
Точно так же цель моей шахматной модели, учитывая набор из 8 x 8 = 64 значений (где каждое значение представлено с использованием 12-значного горячего кодирования), состоит в том, чтобы точно предсказать, является ли шахматный ход правильным. хороший ход или плохой ход.
Итак, все, что мне нужно сделать, это загрузить пример кода с Github, изменить его для моих целей и дать ему поработать. Конечно, с этим подходом все еще есть сложности (например, получение данных в правильном формате, оптимизация модели для моих целей и т. Д.), Но я должен иметь возможность использовать уже существующий код в качестве прочной основы.
Вот код, который я нашел:
from __future__ import absolute_import from __future__ import division from __future__ import print_function import argparse import sys from tensorflow.examples.tutorials.mnist import input_data import tensorflow as tf FLAGS = None def main(_): # Import data mnist = input_data.read_data_sets(FLAGS.data_dir, one_hot=True) # Create the model x = tf.placeholder(tf.float32, [None, 784]) W = tf.Variable(tf.zeros([784, 10])) b = tf.Variable(tf.zeros([10])) y = tf.matmul(x, W) + b # Define loss and optimizer y_ = tf.placeholder(tf.float32, [None, 10]) # The raw formulation of cross-entropy, cross_entropy = tf.reduce_mean( tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)) train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy) sess = tf.InteractiveSession() tf.global_variables_initializer().run() # Train for _ in range(1000): batch_xs, batch_ys = mnist.train.next_batch(100) sess.run(train_step, feed_dict={x: batch_xs, y_: batch_ys}) # Test trained model correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1)) accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) print(sess.run(accuracy, feed_dict={x: mnist.test.images, y_: mnist.test.labels})) if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('--data_dir', type=str, default='/tmp/tensorflow/mnist/input_data', help='Directory for storing input data') FLAGS, unparsed = parser.parse_known_args() tf.app.run(main=main, argv=[sys.argv[0]] + unparsed)
Завтра я попробую изменить этот код и посмотрю, смогу ли я заставить что-нибудь работать.
Прочтите следующий пост. Прочтите предыдущий пост.