Рубрики
Без рубрики

Начните с Tensorflow по закону и статистике

Автор оригинала: FreeCodeCapm Team.

Даниэль Дойч

Что это о

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

  • Как количество убеждений зависит от количества доказательств доказательств
  • Как предсказать количество убеждений с использованием регрессионной модели

Файл Python находится в моем Репозиторий на Github Отказ

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

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

1. Tensorflow (как TF)

Тензоры

  • TF
  • TF.Variables.

Функция помощника

  • tf.global_variables_initializer.

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

  • tf.add.
  • tf.multiply.multiply.
  • tf.reduce_sum.
  • TF.POW

Создание графика

  • tf.train.gradientdsentscentsoptimizer.

Сессия

  • tf.session.

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 
cd 
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 Setup без каких-либо дополнительных сложных платежей.

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

# 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.PaceHolder и 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",    )

Теперь мы приходим на фактическое обучение и самую интересную часть.

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

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

tf.session.run Метод является основным механизмом для работы TF.Operation или оценка tf.tensor Отказ Вы можете пройти один или несколько TF.Operation или tf.tensor объекты к tf.session.run и Tensorflow выполнит операции, которые необходимы для вычисления результата.

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

Мы повторяем этот процесс, пока улучшения на шаг не очень мало. Имейте в виду, что 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()

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

Проверьте это Плюсульский курс Что мне очень помогло начать.:)

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

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

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