Взгляд на классификацию с 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)
])

Давайте сломаем то, что происходит во фрагменте выше.

  1. tf.keras.layers.Flatten преобразует изображение из двумерного массива (28 на 28 пикселей) в одномерный массив (28 * 28 = 784 пикселей)
  2. Первый плотный слой tf.keras.layers.Dense — это линейный слой, который изучает представления/информацию из данных, которые мы объяснили в блоке выше. Он имеет 128 узлов (или нейронов) и относится к линейному слою.
  3. Второй слой — tf.keras.layers — плотный слой, возвращающий массив логитов длиной 10, который классифицирует входные данные по одному из десяти классов.

На этапе компиляции модель готова к обучению и добавляется еще несколько настроек.

  • Функция потерь — измеряет, насколько точна модель во время обучения. Вы хотите минимизировать эту функцию, чтобы «направить» модель в правильном направлении.
  • Оптимизатор — так модель обновляется на основе данных, которые она видит, и ее функции потерь.
  • Метрики — используются для отслеживания этапов обучения и тестирования. В следующем примере используется точность, доля правильно классифицированных изображений.
# compiling the model
model.compile(optimization='adam',
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True),metrics=['accuracy'])

Для обучения модели нейронной сети необходимо выполнить следующие шаги:

  1. Подайте обучающие данные к модели. В этом примере обучающие данные находятся в массивах train_images и train_labels.
  2. Модель учится связывать изображения и метки.
  3. Вы просите модель сделать прогноз относительно тестового набора — в этом примере это массив test_images.
  4. Убедитесь, что прогнозы соответствуют меткам из массива 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 для преобразования логитов в вероятности, которые легче интерпретировать.

Эта концепция лучше всего объясняется ниже

  1. Вход X проходит через линейный слой, и мы получаем 10 выходов.
  2. Выходные данные Z (10) проходят через уравнение softmax, и мы получаем вероятности изображения, принадлежащего классу.
  3. Мы вычисляем кросс-энтропийную потерю и получаем максимальную или максимальную вероятность того, что изображение принадлежит классу.

# 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 и изучая немецкую лингвистику.
Надеюсь многие выздоравливают, держу всех в молитвах :)