Автор оригинала: FreeCodeCapm Team.
Даниэль Дойч
- Что это о
- Что мы будем использовать
- Начать
- Команды оболочки для установки всего, что вам нужно
- Получить данные и нарисуйте сюжет
- Импортировать все, что вам нужно
- Создать и построить некоторые числа
- Построить модель Tensorflow
- Подготовьте данные
- Настройте переменные и операции для Tensorflow
- Начните расчеты с сеансом Tensorflow
- Визуализировать результат и процесс
Что это о
Как я изучаю 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()
Чтобы визуализировать процесс, полезно построить результат и, возможно, даже процесс оптимизации.
Проверьте это Плюсульский курс Что мне очень помогло начать.:)
Спасибо за чтение моей статьи! Не стесняйтесь оставить какие-либо отзывы!
Даниэль Л.М. Студент в бизнесе, работающий в качестве инженера-программного обеспечения и организатором технических мероприятий в Вене. Его нынешние индивидуальные усилия в обучении сосредоточены на машинном обучении.
Подключиться к: