Взгляд на классификацию с TensorFlow.
Давайте создадим простейшую форму модели классификации нейронной сети для классификации изображений одежды, например кроссовок и рубашек.
MNIST — это наиболее распространенный набор данных «hello world» в классификации изображений. Fashion MNIST — очень похожий набор данных в той же категории, содержащий изображения одежды. Давайте воспользуемся модным MNIST в этом посте, так как это немного более сложная задача, чем обычный MNIST.
Первым делом нужно загрузить данные. Tensorflow сделал модный туман доступным в своем наборе наборов данных. Мы можем напрямую импортировать и загружать данные из TensorFlow следующим образом:
fashion_mnist = tf.keras.datasets.fashion_mnist(train_images, train_labels), (test_images, test_labels) = fashion_mnist.load_data()
Набор данных Fashion MNIST содержит 70 000 изображений в градациях серого в 10 категориях предметов одежды в низком разрешении 28 на 28 пикселей. Поскольку имена классов не включены в набор данных, мы добавим их для удобства чтения, как показано ниже.
class_names = ['T-shirt/top', 'Trouser', 'Pullover', 'Dress', 'Coat', 'Sandal', 'Shirt', 'Sneaker', 'Bag', 'Ankle boot']
При ближайшем рассмотрении первого изображения в обучающем наборе видно, что значения пикселей попадают в диапазон от 0 до 255:
plt.figure() plt.imshow(train_images[0]) plt.colorbar() plt.grid(False) plt.show()
Данные для обучения сети масштабируются в диапазоне 0–1. Это предварительная обработка, которую мы применим к нашей модели классификации. Следующий фрагмент кода разделит значение пикселя в диапазоне от 0 до 255 на 255 и уменьшит его до диапазона от 0 до 1.
train_images = train_images / 255.0 test_images = test_images / 255.0 plt.figure(figsize=(10,10)) for i in range(25): plt.subplot(5,5,i+1) plt.xticks([]) plt.yticks([]) plt.grid(False) plt.imshow(train_images[i], cmap=plt.cm.binary) plt.xlabel(class_names[train_labels[i]]) plt.show()
Приступим к созданию нашей модели. Базовым компонентом нейронной сети является слой нейронной сети. Руководство для непрофессионалов по нейронной сети описано ниже.
Нейронная сеть требует настройки слоев модели, а затем компиляции модели. Слои извлекают представления/информацию из данных, поступающих в них при обучении, и эти представления могут использоваться в последнем слое для нашей цели классификации (если вы знакомы с традиционным ML, этот шаг подобен созданию функций для обучения модели) .
# Building the model model = tf.keras.Sequential([ tf.keras.layers.Flatten(input_shape=(28,28)), tf.keras.layers.Dense(128, activation='relu'), tf.keras.layers.Dense(10) ])
Давайте сломаем то, что происходит во фрагменте выше.
- tf.keras.layers.Flatten преобразует изображение из двумерного массива (28 на 28 пикселей) в одномерный массив (28 * 28 = 784 пикселей)
- Первый плотный слой tf.keras.layers.Dense — это линейный слой, который изучает представления/информацию из данных, которые мы объяснили в блоке выше. Он имеет 128 узлов (или нейронов) и относится к линейному слою.
- Второй слой — tf.keras.layers — плотный слой, возвращающий массив логитов длиной 10, который классифицирует входные данные по одному из десяти классов.
На этапе компиляции модель готова к обучению и добавляется еще несколько настроек.
- Функция потерь — измеряет, насколько точна модель во время обучения. Вы хотите минимизировать эту функцию, чтобы «направить» модель в правильном направлении.
- Оптимизатор — так модель обновляется на основе данных, которые она видит, и ее функции потерь.
- Метрики — используются для отслеживания этапов обучения и тестирования. В следующем примере используется точность, доля правильно классифицированных изображений.
# compiling the model model.compile(optimization='adam', loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])
Для обучения модели нейронной сети необходимо выполнить следующие шаги:
- Подайте обучающие данные к модели. В этом примере обучающие данные находятся в массивах
train_images
иtrain_labels
. - Модель учится связывать изображения и метки.
- Вы просите модель сделать прогноз относительно тестового набора — в этом примере это массив
test_images
. - Убедитесь, что прогнозы соответствуют меткам из массива
test_labels
.
По мере обучения модели отображаются показатели потерь и точности.
# Training the model model.fit(train_images, train_labels, epochs=10) Train on 60000 samples Epoch 1/10 60000/60000 [==============================] - 11s 188us/sample - loss: 1.1414 - accuracy: 0.6460 ... ... Epoch 10/10 60000/60000 [==============================] - 11s 179us/sample - loss: 0.4311 - accuracy: 0.8487
Точность оценки сравнивает работу модели с тестовым набором данных:
# Evaluating accuracy test_loss, test_acc = model.evaluate(test_images, test_labels, verbose=2) print('\nTest accuracy: ',test_acc) 10000/1 - 3s - loss: 0.3563 - accuracy: 0.8345 Test accuracy: 0.8345
Обучение модели можно использовать для прогнозирования новых изображений. Линейные выходы модели, логиты. Прикрепите слой softmax для преобразования логитов в вероятности, которые легче интерпретировать.
Эта концепция лучше всего объясняется ниже
- Вход X проходит через линейный слой, и мы получаем 10 выходов.
- Выходные данные Z (10) проходят через уравнение softmax, и мы получаем вероятности изображения, принадлежащего классу.
- Мы вычисляем кросс-энтропийную потерю и получаем максимальную или максимальную вероятность того, что изображение принадлежит классу.
# Making prediction probability_model = tf.keras.Sequential([model, tf.keras.layers.Softmax()]) predictions = probability_model.predict(test_images) def plot_image(i, predictions_array, true_label, img): true_label, img = true_label[i], img[i] plt.grid(False) plt.xticks([]) plt.yticks([]) plt.imshow(img, cmap=plt.cm.binary) predicted_label = np.argmax(predictions_array) if predicted_label == true_label: color = 'blue' else: color = 'red' plt.xlabel("{} {:2.0f}% ({})".format(class_names[predicted_label], 100*np.max(predictions_array), class_names[true_label]), color=color) def plot_value_array(i, predictions_array, true_label): true_label = true_label[i] plt.grid(False) plt.xticks(range(10)) plt.yticks([]) thisplot = plt.bar(range(10), predictions_array, color="#777777") plt.ylim([0, 1]) predicted_label = np.argmax(predictions_array) thisplot[predicted_label].set_color('red') thisplot[true_label].set_color('blue') # Verifying predictions # Plot the first X test images, their predicted labels, and the true labels. # Color correct predictions in blue and incorrect predictions in red. num_rows = 5 num_cols = 3 num_images = num_rows*num_cols plt.figure(figsize=(2*2*num_cols, 2*num_rows)) for i in range(num_images): plt.subplot(num_rows, 2*num_cols, 2*i+1) plot_image(i, predictions[i], test_labels, test_images) plt.subplot(num_rows, 2*num_cols, 2*i+2) plot_value_array(i, predictions[i], test_labels) plt.tight_layout() plt.show()
# Using the trained model # Grab an imag from the test dataset img = test_images[1] print(img.shape) #=> (28, 28) # Adding the image to a batch where it's the only member. img = (np.expand_dims(img,0)) print(img.shape) #=>(1, 28, 28) predictions_single = probability_model.predict(img) print(predictions_single) plot_value_array(1, predictions_single[0], test_labels) _ = plt.xticks(range(10), class_names, rotation=45) np.argmax(predictions_single[0]) #=> 2
Весь код можно скачать ниже.
Кредиты:
Вдохновение:
Глубокие сети в моем мозгу были повреждены, когда я пережил COVID-19, что привело к туману в голове, краткосрочной потере памяти, спутанности сознания, неспособности сосредоточиться и просто чувствовать себя по-другому.
Затем я решил строить новые сети, изучая сети в Tensorflow и изучая немецкую лингвистику.
Надеюсь многие выздоравливают, держу всех в молитвах :)