Класифікація зображень TensorFlow: CNN (згорткова нейронна мережа)

Зміст:

Anonim

Що таке згорткова нейронна мережа?

Згорнута нейронна мережа, також відома як convnets або CNN, є добре відомим методом у програмах комп'ютерного зору. Цей тип архітектури є домінуючим для розпізнавання об’єктів із картинки або відео.

У цьому підручнику ви дізнаєтесь, як побудувати коннет та як використовувати TensorFlow для розв’язання рукописного набору даних.

У цьому підручнику ви дізнаєтесь

  • Свертальна нейронна мережа
  • Архітектура згорткової нейронної мережі
  • Компоненти Конвця
  • Тренуйте CNN за допомогою TensorFlow
  • Крок 1: Завантажте набір даних
  • Крок 2: Вхідний рівень
  • Крок 3: Сверточний шар
  • Крок 4: Об’єднання шару
  • Крок 5: Другий згортковий шар та шар об’єднання
  • Крок 6: Щільний шар
  • Крок 7: Шар Logit

Архітектура згорткової нейронної мережі

Подумайте про Facebook кілька років тому, після того, як ви завантажили зображення у свій профіль, вам запропонували додати ім’я до обличчя на малюнку вручну. Сьогодні Facebook використовує convnet для автоматичного позначення вашого друга на зображенні.

Згорнуту нейронну мережу не дуже важко зрозуміти. Вхідне зображення обробляється під час фази згортки і надалі йому присвоюється мітка.

Типова архітектура convnet може бути узагальнена на малюнку нижче. Перш за все, зображення виштовхується в мережу; це називається вхідним зображенням. Потім вхідне зображення проходить нескінченну кількість кроків; це згорткова частина мережі. Нарешті, нейронна мережа може передбачити цифру на зображенні.

Зображення складається з масиву пікселів з висотою та шириною. Зображення у відтінках сірого має лише один канал, тоді як кольорове зображення має три канали (кожен для червоного, зеленого та синього). Канал складений один над одним. У цьому посібнику ви будете використовувати зображення у градаціях сірого лише з одним каналом. Кожен піксель має значення від 0 до 255, щоб відображати інтенсивність кольору. Наприклад, піксель, рівний 0, буде відображати білий колір, тоді як піксель зі значенням, близьким до 255, буде темнішим.

Давайте подивимось зображення, що зберігається в наборі даних MNIST. На малюнку нижче показано, як зобразити зображення ліворуч у форматі матриці. Зверніть увагу, що оригінальна матриця стандартизована на рівні від 0 до 1. Для темного кольору значення в матриці становить приблизно 0,9, тоді як білі пікселі мають значення 0.

Сверточна операція

Найважливішим компонентом моделі є згортковий шар. Ця частина спрямована на зменшення розміру зображення для швидшого обчислення ваг та покращення його узагальнення.

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

Натомість згорткова нейронна мережа використовуватиме математичний прийом для вилучення лише найбільш релевантних пікселів. Ця математична операція називається згорткою. Цей прийом дозволяє мережі вивчати дедалі складніші функції на кожному рівні. Згорток ділить матрицю на невеликі шматочки, щоб навчитися найбільш важливим елементам у кожному фрагменті.

Компоненти Конвця

Конневець має чотири компоненти

  1. Виток
  2. Нелінійність (ReLU)
  3. Об’єднання або додаткова вибірка
  4. Класифікація (повністю зв’язаний шар)
  • Виток

Метою згортки є локальне вилучення ознак об’єкта на зображенні. Це означає, що мережа вивчить конкретні закономірності на зображенні і зможе розпізнати їх скрізь на зображенні.

Конволюція - це елементарне множення. Поняття легко зрозуміти. Комп’ютер сканує частину зображення, як правило, розміром 3x3, і множить його на фільтр. Результат множення за елементами називається картою об'єктів. Цей крок повторюється, доки все зображення не буде відскановано. Зверніть увагу, що після згортки розмір зображення зменшується.

Внизу є URL-адреса, щоб побачити в дії, як працює згортка.

Доступні численні канали. Нижче ми перерахували деякі канали. Ви бачите, що кожен фільтр має певне призначення. Зверніть увагу, на малюнку нижче; Ядро є синонімом фільтра.

Джерело

Арифметика за згорткою

Фаза згортки застосовуватиме фільтр до невеликого масиву пікселів у межах зображення. Фільтр рухатиметься по вхідному зображенню із загальною формою 3x3 або 5x5. Це означає, що мережа просуне ці вікна по всьому вхідному зображенню та обчислить згортку. На зображенні нижче показано, як працює згортка. Розмір виправлення становить 3x3, а вихідна матриця є результатом елементної операції між матрицею зображення та фільтром.

Джерело

Ви помічаєте, що ширина та висота виводу можуть відрізнятися від ширини та висоти введення. Це відбувається через ефект кордону.

Ефект кордону

Зображення має карту особливостей 5x5 та фільтр 3x3. У центрі є лише одне вікно, де фільтр може відображати сітку 3x3. Карта вихідних характеристик зменшиться на дві плитки разом із розміром 3x3.

Щоб отримати той самий вихідний розмір, що і вхідний, потрібно додати відступ. Заповнення складається з додавання потрібної кількості рядків і стовпців з кожного боку матриці. Це дозволить згортці розташуватися по центру кожної введеної плитки. На зображенні нижче матриця вводу / виводу має однакові розміри 5x5

Коли ви визначаєте мережу, звивисті функції контролюються трьома параметрами:

  1. Глибина: визначає кількість фільтрів, що застосовуються під час згортки. У попередньому прикладі ви бачили глибину 1, тобто використовується лише один фільтр. У більшості випадків існує більше одного фільтра. На малюнку нижче показано операції, виконані в ситуації з трьома фільтрами

  1. Покроковий: Він визначає кількість "стрибків пікселів" між двома зрізами. Якщо крок дорівнює 1, вікна рухатимуться з піксельним розводом одиниці. Якщо крок дорівнює двом, вікна підскочать на 2 пікселі. Якщо ви збільшите крок, у вас будуть менші карти функцій.

Приклад кроку 1

Крок зображення 2

  1. Нульове заповнення: заповнення - це операція додавання відповідної кількості рядків і стовпців на кожній стороні вхідних карт функцій. У цьому випадку вихід має такий самий розмір, що і вхід.
  2. Нелінійність (ReLU)

В кінці операції згортки вихід виходить з функції активації, щоб забезпечити нелінійність. Звичайною функцією активації для convnet є Relu. Усі пікселі з від’ємним значенням будуть замінені на нуль.

  • Операція максимального об’єднання

Цей крок легко зрозуміти. Метою об'єднання є зменшення розмірності вхідного зображення. Кроки робляться для зменшення обчислювальної складності операції. Зменшуючи розмірність, мережа має менші ваги для обчислення, тому вона запобігає перенапруженню.

На цьому етапі вам потрібно визначити розмір і крок. Стандартним способом об’єднання вхідного зображення є використання максимального значення карти об’єктів. Подивіться на малюнок нижче. "Пул" відобразить чотири підматриці карти особливостей 4x4 і поверне максимальне значення. Пул приймає максимальне значення масиву 2x2, а потім переміщує це вікно на два пікселі. Наприклад, перша підматриця [3,1,3,2], об'єднання поверне максимум, який дорівнює 3.

Існує ще одна операція об’єднання, така як середнє значення.

Ця операція агресивно зменшує розмір карти об’єктів

  • Повністю з'єднані шари

Останній крок складається з побудови традиційної штучної нейронної мережі, як це було зроблено в попередньому уроці. Ви з'єднуєте всі нейрони з попереднього шару з наступним шаром. Ви використовуєте функцію активації softmax для класифікації номера на вхідному зображенні.

Підсумок:

Зворотний нейронна мережа компілює різні рівні перед тим, як робити прогноз. Нейронна мережа має:

  • Згорнутий шар
  • Функція активації Relu
  • Об’єднуючий шар
  • Щільно з'єднаний шар

Сверточні шари застосовують різні фільтри для субрегіону зображення. Функція активації Relu додає нелінійність, а шари об'єднання зменшують розмірність карт функцій.

Всі ці шари витягують важливу інформацію із зображень. Нарешті, карта об’єктів подається на первинний повністю зв’язаний шар із функцією softmax для прогнозування.

Тренуйте CNN за допомогою TensorFlow

Тепер, коли ви знайомі з будівельним блоком конвна, ви готові побудувати його за допомогою TensorFlow. Для класифікації зображень ми використовуватимемо набір даних MNIST.

Підготовка даних така ж, як і в попередньому підручнику. Ви можете запускати коди і переходити безпосередньо до архітектури CNN.

Ви виконуватимете наведені нижче дії.

Крок 1: Завантажте набір даних

Крок 2: Вхідний рівень

Крок 3: Сверточний шар

Крок 4: Об’єднання шару

Крок 5: Другий згортковий шар та шар об’єднання

Крок 6: Щільний шар

Крок 7: Шар Logit

Крок 1: Завантажте набір даних

Набір даних MNIST доступний разом із scikit для вивчення за цією URL-адресою. Завантажте його та збережіть у папці «Завантаження». Ви можете завантажити його за допомогою fetch_mldata ('оригінал MNIST').

Створіть комплект поїздів / тестів

Вам потрібно розділити набір даних за допомогою train_test_split

Масштабуйте функції

Нарешті, ви можете масштабувати цю функцію за допомогою MinMaxScaler

import numpy as npimport tensorflow as tffrom sklearn.datasets import fetch_mldata#Change USERNAME by the username of your machine## Windows USERmnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original')## Mac Usermnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original')print(mnist.data.shape)print(mnist.target.shape)from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(mnist.data, mnist.target, test_size=0.2, random_state=42)y_train = y_train.astype(int)y_test = y_test.astype(int)batch_size =len(X_train)print(X_train.shape, y_train.shape,y_test.shape )## resclaefrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()# TrainX_train_scaled = scaler.fit_transform(X_train.astype(np.float64))# testX_test_scaled = scaler.fit_transform(X_test.astype(np.float64))feature_columns = [tf.feature_column.numeric_column('x', shape=X_train_scaled.shape[1:])]X_train_scaled.shape[1:]

Визначте CNN

CNN використовує фільтри вихідного пікселя зображення, щоб дізнатись деталі порівняння з глобальним шаблоном за допомогою традиційної нейронної мережі. Щоб побудувати CNN, вам потрібно визначити:

  1. Згорнутий шар: Застосуйте n кількість фільтрів до карти об’єктів. Після згортки вам потрібно використовувати функцію активації Relu, щоб додати нелінійність мережі.
  2. Об'єднання шару: Наступним кроком після згортки є зменшення вибірки об'єкта макс. Метою є зменшення розмірності карти об’єктів, щоб запобігти переобладнанню та покращити швидкість обчислення. Максимальне об’єднання - це звичайна методика, яка ділить карти об’єктів на субрегіони (зазвичай розміром 2х2) і зберігає лише максимальні значення.
  3. Повністю пов'язані шари: Усі нейрони попередніх шарів з'єднані з наступними шарами. CNN класифікує етикетку за ознаками згорнутих шарів та зменшеними за допомогою шару об'єднання.

Архітектура CNN

  • Свертовий шар: Застосовує 14 фільтрів 5x5 (витягуючи 5x5-піксельні субрегіони) з функцією активації ReLU
  • Пул об'єднання: виконує максимальне об'єднання з фільтром 2x2 та кроком 2 (що вказує, що об'єднані області не перекриваються)
  • Свертовий шар: Застосовує 36 фільтрів 5x5 з функцією активації ReLU
  • Пул об'єднання №2: Знову виконує максимальне об'єднання за допомогою фільтра 2x2 та кроку 2
  • 1764 нейрони, з коефіцієнтом регуляризації відсіву 0,4 (ймовірність 0,4, що будь-який елемент буде скинутий під час тренування)
  • Щільний шар (шар Logits): 10 нейронів, по одному для кожного цільового класу цифр (0-9).

Є три важливі модулі, які слід використовувати для створення CNN:

  • conv2d (). Побудовує двовимірний згортковий шар із кількістю фільтрів, розміром ядра фільтра, відступом та функцією активації як аргументи.
  • max_pooling2d (). Побудовує двовимірний шар об'єднання за допомогою алгоритму максимального об'єднання.
  • щільний (). Побудовує щільний шар із прихованими шарами та одиницями

Ви визначите функцію побудови CNN. Давайте розглянемо детально, як побудувати кожен будівельний блок, перш ніж обернути все разом у функцію.

Крок 2: Вхідний рівень

def cnn_model_fn(features, labels, mode):input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])

Вам потрібно визначити тензор з формою даних. Для цього ви можете використовувати модуль tf.reshape. У цьому модулі вам потрібно оголосити про переформування тензора та форму тензора. Перший аргумент - це особливості даних, які визначені в аргументі функції.

Зображення має висоту, ширину та канал. Набір даних MNIST - це монохронне зображення розміром 28x28. В аргументі shape ми встановлюємо розмір партії на -1 так, щоб він набував форму об’єктів ["x"]. Перевага полягає в тому, щоб налаштувати гіперпараметри розміру партії. Якщо розмір партії встановлений на 7, то тензор подасть 5488 значень (28 * 28 * 7).

Step 3: Convolutional layer
# first Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Перший згортковий шар має 14 фільтрів з розміром ядра 5x5 з однаковим заповненням. Те саме заповнення означає, що вихідний і вхідний тензор повинні мати однакову висоту і ширину. Tensorflow додасть нулі до рядків і стовпців, щоб забезпечити однаковий розмір.

Ви використовуєте функцію активації Relu. Вихідний розмір буде [28, 28, 14].

Крок 4: Об’єднання шару

Наступним кроком після згортки є обчислення об'єднання. Обчислення об’єднання зменшить розмірність даних. Ви можете використовувати модуль max_pooling2d з розміром 2x2 та кроком 2. Ви використовуєте попередній шар як вхід. Вихідний розмір буде [batch_size, 14, 14, 14]

# first Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)

Крок 5: Другий згортковий шар та шар об’єднання

Другий згортковий шар має 32 фільтри з вихідним розміром [batch_size, 14, 14, 32]. Шар об'єднання має такий самий розмір, як і раніше, а вихідна форма - [batch_size, 14, 14, 18].

conv2 = tf.layers.conv2d(inputs=pool1,filters=36,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)

Крок 6: Щільний шар

Потім вам потрібно визначити повністю зв’язаний шар. Карту об’єктів потрібно зрівняти перед тим, як з’єднати її з щільним шаром. Ви можете скористатися переформуванням модуля розміром 7 * 7 * 36.

Щільний шар з’єднає 1764 нейрони. Ви додаєте функцію активації Relu. Крім того, ви додаєте термін регуляризації відсіву з коефіцієнтом 0,3, тобто 30 відсотків ваг буде встановлено на 0. Зверніть увагу, що відсівання відбувається лише на етапі навчання. Функція cnn_model_fn має режим аргументів, щоб визначити, чи потрібно модель навчати або оцінювати.

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

Крок 7: Шар Logit

Нарешті, ви можете визначити останній шар із передбаченням моделі. Вихідна форма дорівнює розміру партії і 10, загальній кількості зображень.

# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10) 

Ви можете створити словник, що містить класи та ймовірність кожного класу. Модуль tf.argmax () з повертає найвище значення, якщо шари logit. Функція softmax повертає ймовірність кожного класу.

predictions = {# Generate predictions"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor") }

Повернути прогнозування дикціону потрібно лише тоді, коли для режиму встановлено передбачення. Ви додаєте ці коди, щоб не відображати прогнози

if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)

Наступний крок полягає в обчисленні втрати моделі. В останньому підручнику ви дізналися, що функція втрат для багатокласової моделі є перехресною ентропією. Втрати легко обчислити за допомогою наступного коду:

# Calculate Loss (for both TRAIN and EVAL modes)loss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)

Останній крок - оптимізація моделі, тобто пошук найкращих значень ваг. Для цього ви використовуєте оптимізатор градієнтного спуску зі швидкістю навчання 0,001. Мета - мінімізувати збитки

optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)train_op = optimizer.minimize(loss=loss,global_step=tf.train.get_global_step())

Ви закінчили з CNN. Однак ви хочете відобразити показники продуктивності в режимі оцінки. Показники ефективності для багатокласової моделі - це показники точності. Tensorflow оснащений модулем точності з двома аргументами, мітками та передбачуваними значеннями.

eval_metric_ops = {"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

Це воно. Ви створили свій перший CNN і готові обернути все у функцію, щоб використовувати її для навчання та оцінки моделі.

def cnn_model_fn(features, labels, mode):"""Model function for CNN."""# Input Layerinput_layer = tf.reshape(features["x"], [-1, 28, 28, 1])# Convolutional Layerconv1 = tf.layers.conv2d(inputs=input_layer,filters=32,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)# Pooling Layerpool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)# Convolutional Layer #2 and Pooling Layerconv2 = tf.layers.conv2d(inputs=pool1,filters=36,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)pool2 = tf.layers.max_pooling2d(inputs=conv2, pool_size=[2, 2], strides=2)# Dense Layerpool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.4, training=mode == tf.estimator.ModeKeys.TRAIN)# Logits Layerlogits = tf.layers.dense(inputs=dropout, units=10)predictions = {# Generate predictions (for PREDICT and EVAL mode)"classes": tf.argmax(input=logits, axis=1),"probabilities": tf.nn.softmax(logits, name="softmax_tensor")}if mode == tf.estimator.ModeKeys.PREDICT:return tf.estimator.EstimatorSpec(mode=mode, predictions=predictions)# Calculate Lossloss = tf.losses.sparse_softmax_cross_entropy(labels=labels, logits=logits)# Configure the Training Op (for TRAIN mode)if mode == tf.estimator.ModeKeys.TRAIN:optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.001)train_op = optimizer.minimize(loss=loss,global_step=tf.train.get_global_step())return tf.estimator.EstimatorSpec(mode=mode, loss=loss, train_op=train_op)# Add evaluation metrics Evaluation modeeval_metric_ops = {"accuracy": tf.metrics.accuracy(labels=labels, predictions=predictions["classes"])}return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops=eval_metric_ops)

Наведені нижче кроки такі ж, як і в попередніх підручниках.

Перш за все, ви визначаєте оцінювач за допомогою моделі CNN.

# Create the Estimatormnist_classifier = tf.estimator.Estimator(model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")

CNN займається багато разів, тому ви створюєте журнал реєстрації для зберігання значень шарів softmax кожні 50 ітерацій.

# Set up logging for predictionstensors_to_log = {"probabilities": "softmax_tensor"}logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)

Ви готові оцінити модель. Ви встановлюєте розмір партії 100 і перемішуєте дані. Зверніть увагу, що ми встановлюємо кроки підготовки 16 000, на навчання може піти багато часу. Наберіться терпіння.

# Train the modeltrain_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": X_train_scaled},y=y_train,batch_size=100,num_epochs=None,shuffle=True)mnist_classifier.train(input_fn=train_input_fn,steps=16000,hooks=[logging_hook])

Тепер, коли модель навчається, ви можете оцінити її та роздрукувати результати

# Evaluate the model and print resultseval_input_fn = tf.estimator.inputs.numpy_input_fn(x={"x": X_test_scaled},y=y_test,num_epochs=1,shuffle=False)eval_results = mnist_classifier.evaluate(input_fn=eval_input_fn)print(eval_results)
INFO:tensorflow:Calling model_fn.INFO:tensorflow:Done calling model_fn.INFO:tensorflow:Starting evaluation at 2018-08-05-12:52:41INFO:tensorflow:Graph was finalized.INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652INFO:tensorflow:Running local_init_op.INFO:tensorflow:Done running local_init_op.INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56INFO:tensorflow:Saving dict for global step 15652: accuracy = 0.9589286, global_step = 15652, loss = 0.13894269{'accuracy': 0.9689286, 'loss': 0.13894269, 'global_step': 15652}

При поточній архітектурі ви отримуєте точність 97%. Ви можете змінити архітектуру, розмір партії та кількість ітерацій, щоб підвищити точність. Нейромережа CNN мала набагато кращі результати, ніж ANN або логістична регресія. У підручнику зі штучної нейронної мережі ви мали точність 96%, що нижче CNN. Виступи CNN вражають більшим набором зображень як з точки зору обчислення швидкості, так і точності.

Резюме

Сверточна нейронна мережа дуже добре працює для оцінки зображення. Цей тип архітектури є домінуючим для розпізнавання об’єктів із картинки або відео.

Щоб побудувати CNN, потрібно виконати шість кроків:

Крок 1: Вхідний рівень:

Цей крок змінює дані. Фігура дорівнює квадратному кореню з кількості пікселів. Наприклад, якщо зображення має 156 пікселів, то форма 26x26. Вам потрібно вказати, чи має малюнок колір чи ні. Якщо так, тоді у вас було 3 до фігури - 3 для RGB-, інакше 1.

input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1]) 

Крок 2: Сверточний шар

Далі вам потрібно створити згорткові шари. Ви застосовуєте різні фільтри, щоб дозволити мережі вивчити важливу функцію. Ви вказуєте розмір ядра та кількість фільтрів.

conv1 = tf.layers.conv2d(inputs=input_layer,filters=14,kernel_size=[5, 5],padding="same",activation=tf.nn.relu)

Крок 3: Об’єднання шару

На третьому кроці ви додаєте шар об’єднання. Цей шар зменшує розмір вводу. Він робить це, приймаючи максимальне значення підматриці. Наприклад, якщо підматриця дорівнює [3,1,3,2], об’єднання поверне максимум, який дорівнює 3.

pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) 

Крок 4: Додайте згортковий шар та шар об’єднання

На цьому кроці ви можете додати скільки завгодно шарів conv та шарів об'єднання. Google використовує архітектуру з більш ніж 20 шарами конв.

Крок 5: Щільний шар

Крок 5 згладжує попередній, щоб створити повністю з'єднані шари. На цьому кроці ви можете використовувати різні функції активації та додати ефект відсіву.

pool2_flat = tf.reshape(pool2, [-1, 7 * 7 * 36])dense = tf.layers.dense(inputs=pool2_flat, units=7 * 7 * 36, activation=tf.nn.relu)dropout = tf.layers.dropout(inputs=dense, rate=0.3, training=mode == tf.estimator.ModeKeys.TRAIN)

Крок 6: Шар Logit

Останній крок - прогнозування.

logits = tf.layers.dense(inputs=dropout, units=10)