Краткое руководство по TensorFlow 2 для начинающих
Оптимизируйте свои подборки Сохраняйте и классифицируйте контент в соответствии со своими настройками.
Это краткое введение использует Keras для:
- Загрузите готовый набор данных.
- Создайте модель машинного обучения нейронной сети, которая классифицирует изображения.
- Обучите эту нейронную сеть.
- Оцените точность модели.
Это руководство представляет собой записную книжку Google Colaboratory . Программы на Python запускаются непосредственно в браузере — отличный способ изучить и использовать TensorFlow. Чтобы следовать этому руководству, запустите блокнот в Google Colab, нажав кнопку в верхней части этой страницы.
- В Colab подключитесь к среде выполнения Python: в правом верхнем углу строки меню выберите ПОДКЛЮЧИТЬСЯ .
- Запустите все ячейки кода записной книжки. Выберите « Среда выполнения » > « Выполнить все» .
Настроить TensorFlow.
Импортируйте TensorFlow в свою программу, чтобы начать:
import tensorflow as tf print("TensorFlow version:", tf.__version__)
TensorFlow version: 2.8.0-rc1
Если вы используете собственную среду разработки, а не Colab , см. руководство по установке для настройки TensorFlow для разработки.
Примечание. Убедитесь, что вы выполнили обновление до последней версии пакета pip 2, если вы используете собственную среду разработки. Подробнее см. в руководстве по установке .
Загрузите набор данных
Загрузите и подготовьте набор данных MNIST . Преобразуйте данные выборки из целых чисел в числа с плавающей запятой:
mnist = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = mnist.load_data() x_train, x_test = x_train / 255.0, x_test / 255.0
Построить модель машинного обучения
Создайте модель tf.keras.Sequential путем наложения слоев.
model = tf.keras.models.Sequential([ tf.keras.layers.Flatten(input_shape=(28, 28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10) ])
Для каждого примера модель возвращает вектор оценок логитов или логарифмических шансов , по одному для каждого класса.
predictions = model(x_train[:1]).numpy() predictions
array([[ 0.2760778 , -0.39324787, -0.17098302, 1.2016621 , -0.03416392, 0.5461229 , -0.7203061 , -0.41886678, -0.59480035, -0.7580608 ]], dtype=float32)
Функция tf.nn.softmax преобразует эти логиты в вероятности для каждого класса:
tf.nn.softmax(predictions).numpy()
array([[0.11960829, 0.06124588, 0.0764901 , 0.30181262, 0.08770514, 0.15668967, 0.04416083, 0.05969675, 0.05006609, 0.04252464]], dtype=float32)
Примечание. Можно встроить функцию tf.nn.softmax в функцию активации для последнего уровня сети. Хотя это может сделать выходные данные модели более интерпретируемыми, этот подход не рекомендуется, поскольку невозможно обеспечить точный и численно стабильный расчет потерь для всех моделей при использовании выходных данных softmax.
Определите функцию потерь для обучения с использованием losses.SparseCategoricalCrossentropy , которая принимает вектор логитов и индекс True и возвращает скалярную потерю для каждого примера.
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
Эта потеря равна отрицательной логарифмической вероятности истинного класса: потеря равна нулю, если модель уверена в правильном классе.
Эта необученная модель дает вероятности, близкие к случайным (1/10 для каждого класса), поэтому начальная потеря должна быть близка к -tf.math.log(1/10) ~= 2.3 .
loss_fn(y_train[:1], predictions).numpy()
Перед началом обучения настройте и скомпилируйте модель с помощью Model.compile . Установите класс optimizer на adam , установите loss на функцию loss_fn , которую вы определили ранее, и укажите метрику, которая будет оцениваться для модели, установив параметр metrics на accuracy .
model.compile(optimizer='adam', loss=loss_fn, metrics=['accuracy'])
Обучите и оцените свою модель
Используйте метод Model.fit , чтобы настроить параметры модели и минимизировать потери:
model.fit(x_train, y_train, epochs=5)
Epoch 1/5 1875/1875 [==============================] — 4s 2ms/step — loss: 0.2950 — accuracy: 0.9143 Epoch 2/5 1875/1875 [==============================] — 3s 2ms/step — loss: 0.1451 — accuracy: 0.9567 Epoch 3/5 1875/1875 [==============================] — 4s 2ms/step — loss: 0.1080 — accuracy: 0.9668 Epoch 4/5 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0906 — accuracy: 0.9717 Epoch 5/5 1875/1875 [==============================] — 4s 2ms/step — loss: 0.0749 — accuracy: 0.9761
Метод Model.evaluate проверяет производительность моделей, обычно на » Validation-set » или » Test-set «.
model.evaluate(x_test, y_test, verbose=2)
313/313 - 1s - loss: 0.0783 - accuracy: 0.9755 - 588ms/epoch - 2ms/step [0.07825208455324173, 0.9754999876022339]
Классификатор изображений теперь обучен с точностью ~ 98% на этом наборе данных. Чтобы узнать больше, прочитайте туториалы по TensorFlow .
Если вы хотите, чтобы ваша модель возвращала вероятность, вы можете обернуть обученную модель и прикрепить к ней softmax:
probability_model = tf.keras.Sequential([ model, tf.keras.layers.Softmax() ])
Вывод
Поздравляем! Вы обучили модель машинного обучения, используя готовый набор данных с помощью API Keras .
Дополнительные примеры использования Keras см. в туториалах . Чтобы узнать больше о построении моделей с помощью Keras, прочитайте руководства . Если вы хотите узнать больше о загрузке и подготовке данных, см. руководства по загрузке данных изображения или загрузке данных CSV .
Если не указано иное, контент на этой странице предоставляется по лицензии Creative Commons «С указанием авторства 4.0», а примеры кода – по лицензии Apache 2.0. Подробнее об этом написано в правилах сайта. Java – это зарегистрированный товарный знак корпорации Oracle и ее аффилированных лиц.
Последнее обновление: 2022-01-26 UTC.
Python. TensorFlow для чайников. Часть 1.
TensorFlow — это мощная библиотека для создания нейронных сетей. На уроке Пишем нейросеть на Python. Часть 1 я уже писал, как сделать нейросеть на Python. Поскольку вторая часть пока в работе, решил написать статью про TensorFlow, ибо это поистине великолепный инструмент. Если раньше нам надо было создавать свои классы, чтобы хранить информацию о весах нейрона, объединять их в слои и еще добавлять туда алгоритмы обучения, то теперь все это есть в TensorFlow.
Как его установить? Сначала скачиваем whl файл, затем устанавливаем его, примерно вот так:
C:\Users\user\AppData\Local\Programs\Python\Python36\python.exe -m pip install tensorflow-1.2.0rc2-cp36-cp36m-win_amd64.whl
Итак, сначала попробуем создать простой нейрон с одним входом и выходом, который реализует линеную функцию:
import tensorflow as tf #Создадим граф graph = tf.get_default_graph() #Создадим входное значение input_value = tf.constant(1.0) #Создадим переменную weight = tf.Variable(0.8) #Создаим выходное значение output_value = weight * input_value
Мы создали простой нейрон со входом, выходом, и одним входным весовых коэффициентом. Чтобы попользоваться им, нам нужно создать сессию:
#создаим сессию sess = tf.Session()
Затем инициализировать переменные:
init=tf.global_variables_initializer() sess.run(init)
После этого мы можем вывести значение на экран:
У нас выведет 0.8 — результат умножения входного значения 1 на весовой коэффициент 0.8.
Теперь попробуем его обучить. Допустим, мы желаем получить на выходе не 0.8, а к примеру 2. В этом случае нам надо задать желаемое значение, функцию ошибки и оптимизатор:
#Создаем оптимизиатор desired_output_value = tf.constant(2.0) loss = (output_value - desired_output_value)**2 #Функция ошибки optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор grads_and_vars = optim.compute_gradients(loss)
А потом еще надо итерационно, много раз применить оптимизацию (в цикле), вот так:
#Обучаем train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss) for i in range(100): sess.run(train_step)
А вот весь код нашего примера:
import tensorflow as tf #Создадим граф graph = tf.get_default_graph() #Создадим входное значение input_value = tf.constant(1.0) #Создадим переменную weight = tf.Variable(0.8) #Создаим выходное значение output_value = weight * input_value #создаим сессию sess = tf.Session() #Создаем оптимизиатор desired_output_value = tf.constant(2.0) loss = (output_value - desired_output_value)**2 #Функция ошибки optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор grads_and_vars = optim.compute_gradients(loss) #Инициализируем переменные init=tf.global_variables_initializer() sess.run(init) #Обучаем train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss) for i in range(100): sess.run(train_step) print(sess.run(output_value))
В результате мы получим число, близкое к 2 (к нашему желаемому выходу), например 1.9929.
Часто для оцени процесса обучения смотрят график обучения, на котором, как правило, отображается ошибка обучения (как она уменьшается со временем). Давайте и мы так же сделаем, воспользовавшись питоновской библиотекой научной графики.
Для этого нам надо импортунть саму библиотеку, в цикл обучения вставать код, который будет выводить значение ошибки на каждой итерации в список или массив, и отобразить этот список или массив на графике. Вот полный код программы с данными изменениями:
import tensorflow as tf import matplotlib.pyplot as plt #Создадим граф graph = tf.get_default_graph() #Создадим входное значение input_value = tf.constant(1.0) #Создадим переменную weight = tf.Variable(0.8) #Создаим выходное значение output_value = weight * input_value #создаим сессию sess = tf.Session() #Создаем оптимизиатор desired_output_value = tf.constant(2.0) loss = (output_value - desired_output_value)**2 #Функция ошибки optim = tf.train.GradientDescentOptimizer(learning_rate=0.025) #Оптимизатор grads_and_vars = optim.compute_gradients(loss) #Инициализируем переменные init=tf.global_variables_initializer() sess.run(init) #задаем начальные массивы x=[] y=[] #Обучаем train_step = tf.train.GradientDescentOptimizer(0.025).minimize(loss) for i in range(100): sess.run(train_step) x.append(i) y.append(sess.run(loss)) print(sess.run(output_value)) #Строим график fig = plt.figure() plt.plot(x, y) #Отображаем заголовки и подписи осей plt.title('График функции') plt.ylabel('Ось Y') plt.xlabel('Ось X') plt.grid(True) plt.show()
А вот сам график обучения: