Учебники

TensorFlow – сверточные нейронные сети

После понимания концепций машинного обучения мы можем переключить наше внимание на концепции глубокого обучения. Глубокое обучение является разделом машинного обучения и считается решающим шагом, предпринятым исследователями в последние десятилетия. Примеры реализации глубокого обучения включают в себя такие приложения, как распознавание изображений и распознавание речи.

Ниже приведены два важных типа глубоких нейронных сетей –

  • Сверточные нейронные сети
  • Рекуррентные нейронные сети

В этой главе мы сосредоточимся на CNN, сверточных нейронных сетях.

Сверточные нейронные сети

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

Доминирующий подход CNN включает в себя решения проблем распознавания. Ведущие компании, такие как Google и Facebook, вложили средства в исследования и разработки для реализации проектов по распознаванию, чтобы ускорить процесс.

Сверточная нейронная сеть использует три основных идеи –

  • Местные соответствующие поля
  • свертка
  • объединение

Позвольте нам понять эти идеи в деталях.

CNN использует пространственные корреляции, которые существуют во входных данных. Каждый параллельный слой нейронной сети соединяет несколько входных нейронов. Этот конкретный регион называется локальным рецептивным полем. Местное рецептивное поле фокусируется на скрытых нейронах. Скрытые нейроны обрабатывают входные данные внутри упомянутого поля, не осознавая изменений за пределами определенной границы.

Ниже приведено схематическое представление генерации соответствующих полей:

Сверточные нейронные сети

Если мы наблюдаем вышеупомянутое представление, каждое соединение узнает вес скрытого нейрона с ассоциированной связью с перемещением от одного слоя к другому. Здесь отдельные нейроны время от времени выполняют сдвиг. Этот процесс называется «свертка».

Отображение соединений от входного слоя к карте скрытых объектов определяется как «общие веса», а включенное смещение называется «общим смещением».

CNN или сверточные нейронные сети используют уровни объединения, которые являются уровнями, расположенными сразу после объявления CNN. Он принимает входные данные пользователя в виде карты объектов, которая выходит из сверточных сетей и подготавливает сжатую карту объектов. Объединение слоев помогает в создании слоев с нейронами предыдущих слоев.

Внедрение TensorFlow CNN

В этом разделе мы узнаем о реализации CNN TensorFlow. Шаги, которые требуют выполнения и правильного измерения всей сети, как показано ниже –

Шаг 1 – Включите необходимые модули для TensorFlow и модули набора данных, которые необходимы для вычисления модели CNN.

import tensorflow as tf
import numpy as np
from tensorflow.examples.tutorials.mnist import input_data

Шаг 2Объявите функцию run_cnn () , которая включает в себя различные параметры и переменные оптимизации с объявлением заполнителей данных. Эти переменные оптимизации объявят схему обучения.

def run_cnn():
   mnist = input_data.read_data_sets("MNIST_data/", one_hot = True)
   learning_rate = 0.0001
   epochs = 10
   batch_size = 50

Шаг 3 – На этом шаге мы объявим заполнители обучающих данных с входными параметрами – для 28 x 28 пикселей = 784. Это сглаженные данные изображения, которые извлекаются из mnist.train.nextbatch () .

Мы можем изменить форму тензора в соответствии с нашими требованиями. Первое значение (-1) указывает функции динамически формировать это измерение на основе объема данных, переданных ему. Два средних размера установлены на размер изображения (то есть 28 х 28).

x = tf.placeholder(tf.float32, [None, 784])
x_shaped = tf.reshape(x, [-1, 28, 28, 1])
y = tf.placeholder(tf.float32, [None, 10])

Шаг 4 – Теперь важно создать несколько сверточных слоев –

layer1 = create_new_conv_layer(x_shaped, 1, 32, [5, 5], [2, 2], name = 'layer1')
layer2 = create_new_conv_layer(layer1, 32, 64, [5, 5], [2, 2], name = 'layer2')

Шаг 5 – Давайте сгладим выход, готовый для полностью подключенного выходного каскада – после объединения двух слоев шага 2 с размерами 28 x 28, до размера 14 x 14 или минимум 7 x 7 x, y координаты, но с 64 выходными каналами. Чтобы создать полностью связанный с «плотным» слоем, новая форма должна быть [-1, 7 х 7 х 64]. Мы можем установить некоторые веса и значения смещения для этого слоя, а затем активировать с помощью ReLU.

flattened = tf.reshape(layer2, [-1, 7 * 7 * 64])

wd1 = tf.Variable(tf.truncated_normal([7 * 7 * 64, 1000], stddev = 0.03), name = 'wd1')
bd1 = tf.Variable(tf.truncated_normal([1000], stddev = 0.01), name = 'bd1')

dense_layer1 = tf.matmul(flattened, wd1) + bd1
dense_layer1 = tf.nn.relu(dense_layer1)

Шаг 6 – Другой уровень с определенными активациями softmax с требуемым оптимизатором определяет оценку точности, которая выполняет настройку оператора инициализации.

wd2 = tf.Variable(tf.truncated_normal([1000, 10], stddev = 0.03), name = 'wd2')
bd2 = tf.Variable(tf.truncated_normal([10], stddev = 0.01), name = 'bd2')

dense_layer2 = tf.matmul(dense_layer1, wd2) + bd2
y_ = tf.nn.softmax(dense_layer2)

cross_entropy = tf.reduce_mean(
   tf.nn.softmax_cross_entropy_with_logits(logits = dense_layer2, labels = y))

optimiser = tf.train.AdamOptimizer(learning_rate = learning_rate).minimize(cross_entropy)

correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

init_op = tf.global_variables_initializer()

Шаг 7 – Мы должны установить переменные записи. Это добавляет сводку для хранения точности данных.

tf.summary.scalar('accuracy', accuracy)
   merged = tf.summary.merge_all()
   writer = tf.summary.FileWriter('E:\TensorFlowProject')
   
   with tf.Session() as sess:
      sess.run(init_op)
      total_batch = int(len(mnist.train.labels) / batch_size)
      
      for epoch in range(epochs):
         avg_cost = 0
      for i in range(total_batch):
         batch_x, batch_y = mnist.train.next_batch(batch_size = batch_size)
            _, c = sess.run([optimiser, cross_entropy], feed_dict = {
            x:batch_x, y: batch_y})
            avg_cost += c / total_batch
         test_acc = sess.run(accuracy, feed_dict = {x: mnist.test.images, y:
            mnist.test.labels})
            summary = sess.run(merged, feed_dict = {x: mnist.test.images, y:
            mnist.test.labels})
         writer.add_summary(summary, epoch)

   print("\nTraining complete!")
   writer.add_graph(sess.graph)
   print(sess.run(accuracy, feed_dict = {x: mnist.test.images, y:
      mnist.test.labels}))

def create_new_conv_layer(
   input_data, num_input_channels, num_filters,filter_shape, pool_shape, name):

   conv_filt_shape = [
      filter_shape[0], filter_shape[1], num_input_channels, num_filters]

   weights = tf.Variable(
      tf.truncated_normal(conv_filt_shape, stddev = 0.03), name = name+'_W')
   bias = tf.Variable(tf.truncated_normal([num_filters]), name = name+'_b')

#Out layer defines the output
   out_layer =
      tf.nn.conv2d(input_data, weights, [1, 1, 1, 1], padding = 'SAME')

   out_layer += bias
   out_layer = tf.nn.relu(out_layer)
   ksize = [1, pool_shape[0], pool_shape[1], 1]
   strides = [1, 2, 2, 1]
   out_layer = tf.nn.max_pool(
      out_layer, ksize = ksize, strides = strides, padding = 'SAME')

   return out_layer

if __name__ == "__main__":
run_cnn()

Ниже приведен вывод, сгенерированный вышеуказанным кодом –