После понимания концепций машинного обучения мы можем переключить наше внимание на концепции глубокого обучения. Глубокое обучение является разделом машинного обучения и считается решающим шагом, предпринятым исследователями в последние десятилетия. Примеры реализации глубокого обучения включают в себя такие приложения, как распознавание изображений и распознавание речи.
Ниже приведены два важных типа глубоких нейронных сетей:
В этой главе мы сосредоточимся на CNN, сверточных нейронных сетях.
Сверточные нейронные сети предназначены для обработки данных через несколько уровней массивов. Этот тип нейронных сетей используется в таких приложениях, как распознавание изображений или распознавание лиц. Основное различие между CNN и любой другой обычной нейронной сетью состоит в том, что CNN принимает входные данные в виде двумерного массива и работает непосредственно с изображениями, а не фокусируется на извлечении признаков, на котором сосредоточены другие нейронные сети.
Доминирующий подход CNN включает в себя решения проблем распознавания. Ведущие компании, такие как Google и Facebook, вложили средства в исследования и разработки для реализации проектов по распознаванию, чтобы ускорить процесс.
Сверточная нейронная сеть использует три основных идеи:
Позвольте нам понять эти идеи в деталях.
CNN использует пространственные корреляции, которые существуют во входных данных. Каждый параллельный слой нейронной сети соединяет несколько входных нейронов. Этот конкретный регион называется локальным рецептивным полем. Местное рецептивное поле фокусируется на скрытых нейронах. Скрытые нейроны обрабатывают входные данные внутри упомянутого поля, не осознавая изменений за пределами определенной границы.
Ниже приведено схематическое представление генерации соответствующих полей:
Если мы наблюдаем вышеупомянутое представление, каждое соединение узнает вес скрытого нейрона с ассоциированной связью с перемещением от одного слоя к другому. Здесь отдельные нейроны время от времени выполняют сдвиг. Этот процесс называется «свертка».
Отображение соединений от входного слоя к карте скрытых объектов определяется как «общие веса», а включенное смещение называется «общим смещением».
CNN или сверточные нейронные сети используют уровни объединения, которые являются уровнями, расположенными сразу после объявления 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("\nПолный курс обучения!") 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()
Ниже приведен вывод, сгенерированный вышеуказанным кодом:
See @{tf.nn.softmax_cross_entropy_with_logits_v2}. 2019-06-20 09:45:23.746375: I T:\src\github\tensorflow\tensorflow\core\platform\cpu_feature_guard.cc:140] Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 2019-06-20 09:46:43.837465: W T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation of 1003520000 exceeds 10% of system memory. 2019-06-20 09:46:46.746678: W T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation of 501760000 exceeds 10% of system memory. Epoch: 1 cost = 0.676 test accuracy: 0.940 2019-06-20 09:47:33.857665: W T:\src\github\tensorflow\tensorflow\core\framework\allocator.cc:101] Allocation of 1003520000 exceeds 10% of system memory.