Начните работу с TensorFlow по праву и статистике

nachnite rabotu s tensorflow po pravu i statistike?v=1656584413

Даниэль Дойч

-SPJACPQCt76VzkpQM2tTCIxp4jTRn50R9WY
Фото Стива Роу на Unsplash — https://unsplash.com/photos/bD5lzOBx-Cs

О чем идет речь

Когда я исследую TensorFlow, я хотел создать пример для начинающих и задокументировать его. Это очень простой пример, использующий оптимизацию градиентного спуска для обучения параметрам с помощью TensorFlow. Ключевыми переменными являются доказательства и убеждение. Он проиллюстрирует:

  • как количество обвинительных приговоров зависит от количества улик
  • как предусмотреть количество судимостей с помощью регрессионной модели

Файл Python находится в моем хранилище GitHub.

Смотрите статью в лучшем форматировании на GitHub.

Что мы будем использовать

1. TensorFlow (как tf)

Тензоры

  • tf.placeholders
  • tf.Сменные

Вспомогательная функция

  • tf.global_variables_initializer

Математические операции

  • tf.add
  • tf.умножить
  • tf.reduce_sum
  • tf.pow

Построение графика

  • tf.train.GradientDescentOptimizer

Сессия

2. Numpy (как np)

  • np.random.seed
  • np.random.zeros
  • np.random.randint
  • np.random.randn
  • np.random.asanyarray

3. Matplotlib

4. Математика

Начинаем

Установите TensorFlow из virtualenv. См. руководство на веб-сайте TF.

Команды оболочки для установки всего необходимого

sudo easy_install pip
pip3 install --upgrade virtualenv
virtualenv --system-site-packages <targetDirectory>
cd <targetDirectory>
source ./bin/activate
easy_install -U pip3
pip3 install tensorflow
pip3 install matplotlib

Получите данные и нарисуйте график

Импортируйте все, что вам нужно

import tensorflow as tfimport numpy as npimport mathimport matplotlibmatplotlib.use('TkAgg')import matplotlib.pyplot as pltimport matplotlib.animation as animation

Как видите, я использую бэкенд TkAgg с matplotlib. Это позволяет мне отлаживать настройки vsCode и macOS без каких-либо дополнительных сложных рассрочок.

Создайте и постройте несколько чисел

# Generate evidence numbers between 10 and 20# Generate a number of convictions from the evidence with a random noise addednp.random.seed(42)sampleSize = 200numEvid = np.random.randint(low=10, high=50, size=sampleSize)numConvict = numEvid * 10 + np.random.randint(low=200, high=400, size=sampleSize)
# Plot the data to get a feelingplt.title("Number of convictions based on evidence")plt.plot(numEvid, numConvict, "bx")plt.xlabel("Number of Evidence")plt.ylabel("Number of Convictions")plt.show(block=False)  # Use the keyword 'block' to override the blocking behavior

Я создаю случайные значения для улик. Количество судимостей зависит от количества (количества) доказательств со случайным шумом. Конечно, эти цифры придуманы, но они используются только для подтверждения.

Постройте модель TensorFlow

Чтобы построить базовую модель машинного обучения нам нужно подготовить данные. Затем мы делаем прогнозы, измеряем потери и оптимизируем, минимизируя потери.

Подготовьте данные

# create a function for normalizing values# use 70% of the data for training (the remaining 30% shall be used for testing)def normalize(array):    return (array - array.mean()) / array.std()
numTrain = math.floor(sampleSize * 0.7)
# convert list to an array and normalize arraystrainEvid = np.asanyarray(numEvid[:numTrain])trainConvict = np.asanyarray(numConvict[:numTrain])trainEvidNorm = normalize(trainEvid)trainConvictdNorm = normalize(trainConvict)
testEvid = np.asanyarray(numEvid[numTrain:])testConvict = np.asanyarray(numConvict[numTrain:])testEvidNorm = normalize(testEvid)testConvictdNorm = normalize(testConvict)

Мы разделяем данные на обучающие и тестовые части. После этого мы нормализуем значение, поскольку это необходимо для проектов машинного обучения. (См. также «Масштабирование функций».)

Настройте переменные и операции для TensorFlow

# define placeholders  and variablestfEvid = tf.placeholder(tf.float32, name="Evid")tfConvict = tf.placeholder(tf.float32, name="Convict")tfEvidFactor = tf.Variable(np.random.randn(), name="EvidFactor")tfConvictOffset = tf.Variable(np.random.randn(), name="ConvictOffset")
# define the operation for predicting the conviction based on evidence by adding both values# define a loss function (mean squared error)tfPredict = tf.add(tf.multiply(tfEvidFactor, tfEvid), tfConvictOffset)tfCost = tf.reduce_sum(tf.pow(tfPredict - tfConvict, 2)) / (2 * numTrain)
# set a learning rate and a gradient descent optimizerlearningRate = 0.1gradDesc = tf.train.GradientDescentOptimizer(learningRate).minimize(tfCost)

Прагматические различия между tf.placeholder и tf.Variable есть:

  • Заполнители предназначены для хранения данных, а начальные значения не требуются
  • переменные используются для изучения параметров, а начальные значения обязательны. Ценности можно получить из учебы.

Я использую операторы TensorFlow именно как tf.add(…), потому что достаточно понятно, какая библиотека используется для вычисления. Это вместо использования + оператор.

Начните вычисление с сеанса TensorFlow

# initialize variablesinit = tf.global_variables_initializer()
with tf.Session() as sess:    sess.run(init)
    # set up iteration parameters    displayEvery = 2    numTrainingSteps = 50
    # Calculate the number of lines to animation    # define variables for updating during animation    numPlotsAnim = math.floor(numTrainingSteps / displayEvery)    evidFactorAnim = np.zeros(numPlotsAnim)    convictOffsetAnim = np.zeros(numPlotsAnim)    plotIndex = 0
    # iterate through the training data    for i in range(numTrainingSteps):
        # ======== Start training by running the session and feeding the gradDesc        for (x, y) in zip(trainEvidNorm, trainConvictdNorm):            sess.run(gradDesc, feed_dict={tfEvid: x, tfConvict: y})
        # Print status of learning        if (i + 1) % displayEvery == 0:            cost = sess.run(                tfCost, feed_dict={tfEvid: trainEvidNorm, tfConvict: trainConvictdNorm}            )            print(                "iteration #:",                "%04d" % (i + 1),                "cost=",                "{:.9f}".format(cost),                "evidFactor=",                sess.run(tfEvidFactor),                "convictOffset=",                sess.run(tfConvictOffset),            )
            # store the result of each step in the animation variables            evidFactorAnim[plotIndex] = sess.run(tfEvidFactor)            convictOffsetAnim[plotIndex] = sess.run(tfConvictOffset)            plotIndex += 1
    # log the optimized result    print("Optimized!")    trainingCost = sess.run(        tfCost, feed_dict={tfEvid: trainEvidNorm, tfConvict: trainConvictdNorm}    )    print(        "Trained cost=",        trainingCost,        "evidFactor=",        sess.run(tfEvidFactor),        "convictOffset=",        sess.run(tfConvictOffset),        "\n",    )

Теперь мы подошли к самому тренингу и самой интересной части.

Теперь график выполняется в a tf.Session. Я использую «подачу», поскольку это позволяет вводить данные в любой тензор на графике вычислений. Вы можете увидеть больше о чтении данных здесь.

tf.Session() используется для создания сеанса, автоматически закрывающегося при выходе из контекста. Сеанс также закрывается, когда возникает неперехваченное исключение.

The tf.Session.run метод является основным механизмом выполнения а tf.Operation или оценивая а tf.Tensor. Вы можете передать один или несколько tf.Operation или tf.Tensor возражает к tf.Session.runTensorFlow выполнит операции, необходимые для вычисления результата.

Во-первых, мы запускаем обучение градиентному спуску, предоставляя ему нормализованные учебные данные. После этого мы рассчитываем ущерб.

Мы повторяем этот процесс до тех пор, пока улучшения в шаге не станут очень малыми. Имейте в виду, что tf.Variables (параметры) полностью адаптированы и теперь отображают оптимум.

Визуализируйте результат и процесс

# de-normalize variables to be plotable again    trainEvidMean = trainEvid.mean()    trainEvidStd = trainEvid.std()    trainConvictMean = trainConvict.mean()    trainConvictStd = trainConvict.std()    xNorm = trainEvidNorm * trainEvidStd + trainEvidMean    yNorm = (        sess.run(tfEvidFactor) * trainEvidNorm + sess.run(tfConvictOffset)    ) * trainConvictStd + trainConvictMean
    # Plot the result graph    plt.figure()
    plt.xlabel("Number of Evidence")    plt.ylabel("Number of Convictions")
    plt.plot(trainEvid, trainConvict, "go", label="Training data")    plt.plot(testEvid, testConvict, "mo", label="Testing data")    plt.plot(xNorm, yNorm, label="Learned Regression")    plt.legend(loc="upper left")
    plt.show()
    # Plot an animated graph that shows the process of optimization    fig, ax = plt.subplots()    line, = ax.plot(numEvid, numConvict)
    plt.rcParams["figure.figsize"] = (10, 8) # adding fixed size parameters to keep animation in scale    plt.title("Gradient Descent Fitting Regression Line")    plt.xlabel("Number of Evidence")    plt.ylabel("Number of Convictions")    plt.plot(trainEvid, trainConvict, "go", label="Training data")    plt.plot(testEvid, testConvict, "mo", label="Testing data")
    # define an animation function that changes the ydata    def animate(i):        line.set_xdata(xNorm)        line.set_ydata(            (evidFactorAnim[i] * trainEvidNorm + convictOffsetAnim[i]) * trainConvictStd            + trainConvictMean        )        return (line,)
    # Initialize the animation with zeros for y    def initAnim():        line.set_ydata(np.zeros(shape=numConvict.shape[0]))        return (line,)
    # call the animation    ani = animation.FuncAnimation(        fig,        animate,        frames=np.arange(0, plotIndex),        init_func=initAnim,        interval=200,        blit=True,    )
    plt.show()

Для визуализации процесса полезно определить результат и, возможно, даже процесс оптимизации.

w31dQ19xkDhfLzWpeqqUkvmXVtsNeK-JkWDg

Просмотрите этот курс Pluralsight, который очень помог мне приступить к работе. 🙂

Спасибо, что прочли мою статью! Не стесняйтесь оставлять любой отзыв!

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

Подключиться на:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *