Класифікація зображень CNN у TensorFlow із кроками та прикладами
Що таке згортка нейронна мережа?
Згортка нейронна мережа, також відомий як convnets або CNN, є добре відомим методом у програмах комп’ютерного зору. Це клас глибоких нейронних мереж, які використовуються для аналізу візуальних зображень. Цей тип архітектури є домінуючим для розпізнавання об’єктів із зображення чи відео. Він використовується в програмах, таких як розпізнавання зображень або відео, нейронна обробка мови тощо.
Archiструктура згорткової нейронної мережі
Згадайте Facebook кілька років тому, коли ви завантажили фотографію у свій профіль, вас попросили вручну додати ім’я до обличчя на зображенні. Сьогодні Facebook використовує convnet, щоб автоматично позначати вашого друга на зображенні.
Згорточну нейронну мережу для класифікації зображень не дуже важко зрозуміти. Вхідне зображення обробляється на етапі згортання, а потім присвоюється мітка.
Типову архітектуру convnet можна підсумувати на малюнку нижче. Перш за все, зображення надсилається в мережу; це називається вхідним зображенням. Потім вхідне зображення проходить нескінченну кількість кроків; це згортка частини мережі. Нарешті, нейронна мережа може передбачити цифру на зображенні.
Зображення складається з масиву пікселів із висотою та шириною. Зображення у градаціях сірого має лише один канал, тоді як кольорове зображення має три канали (кожний для червоного, зеленого та синього). Швелери накладаються один на одного. У цьому посібнику ви використовуватимете зображення у відтінках сірого лише з одним каналом. Кожен піксель має значення від 0 до 255, що відображає інтенсивність кольору. Наприклад, піксель, що дорівнює 0, матиме білий колір, тоді як піксель із значенням, близьким до 255, буде темнішим.
Давайте подивимося на зображення, що зберігається в Набір даних MNIST. На зображенні нижче показано, як представити зображення лівого боку в матричному форматі. Зауважте, що вихідна матриця була стандартизована між 0 і 1. Для темнішого кольору значення в матриці становить приблизно 0.9, тоді як білі пікселі мають значення 0.
Згорточна операція
Найважливішим компонентом у моделі є згортковий шар. Ця частина спрямована на зменшення розміру зображення для швидшого обчислення вагових коефіцієнтів і покращення його узагальнення.
Під час згорткової частини мережа зберігає основні характеристики зображення та виключає несуттєвий шум. Наприклад, модель вчиться розпізнавати слона на картинці з горою на задньому плані. Якщо ви використовуєте традиційну нейронну мережу, модель призначить вагу всім пікселям, включно з пікселями з гори, що не є суттєвим і може ввести мережу в оману.
Натомість а Керас згорточна нейронна мережа використовуватиме математичну техніку для вилучення лише найбільш відповідних пікселів. Ця математична операція називається згорткою. Ця техніка дозволяє мережі вивчати дедалі складніші функції на кожному рівні. Згортка ділить матрицю на невеликі частини, щоб дізнатися про найважливіші елементи в кожній частині.
Компоненти згорткової нейронної мережі (ConvNet або CNN)
Є чотири компоненти Convnets
- Згортка
- Нелінійність (ReLU)
- Pooling або підвибірка
- Класифікація (повністю підключений рівень)
Згортка
Метою згортки є локальне виділення ознак об’єкта на зображенні. Це означає, що мережа вивчатиме певні шаблони всередині зображення та зможе розпізнавати їх всюди на зображенні.
Згортка — це поелементне множення. Концепцію легко зрозуміти. Комп’ютер сканує частину зображення, зазвичай розміром 3 × 3, і множить її на фільтр. Результат поелементного множення називається картою ознак. Цей крок повторюється, доки не буде відскановано все зображення. Зверніть увагу, що після згортки розмір зображення зменшується.
Нижче наведено URL-адресу, щоб побачити в дії, як працює згортка.
Доступно багато каналів. Нижче ми перерахували деякі з каналів. Ви бачите, що кожен фільтр має певне призначення. Зверніть увагу, на малюнку нижче; Ядро є синонімом фільтра.
Арифметика за згорткою
Фаза згортки застосує фільтр до невеликого масиву пікселів на зображенні. Фільтр буде рухатися вздовж вхідного зображення із загальною формою 3×3 або 5×5. Це означає, що мережа ковзатиме цими вікнами по всьому вхідному зображенню та обчислюватиме згортку. На зображенні нижче показано, як працює згортка. Розмір патча становить 3×3, а вихідна матриця є результатом поелементної операції між матрицею зображення та фільтром.
Ви помітили, що ширина та висота виведення можуть відрізнятися від ширини та висоти введення. Це відбувається через ефект кордону.
Ефект кордону
Зображення має карту функцій 5×5 і фільтр 3×3. Є лише одне вікно в центрі, де фільтр може екранувати сітку 3×3. Вихідна карта функцій зменшиться на дві плитки разом із розміром 3×3.
Щоб отримати такий самий вихідний розмір, як і вхідний, потрібно додати відступ. Заповнення складається з додавання потрібної кількості рядків і стовпців з кожного боку матриці. Це дозволить розташувати згортку по центру кожної вхідної плитки. На зображенні нижче матриця введення/виведення має той самий розмір 5×5
Коли ви визначаєте мережу, згорнуті функції контролюються трьома параметрами:
- Глибина: визначає кількість фільтрів, які застосовуються під час згортки. У попередньому прикладі ви бачили глибину 1, тобто використовується лише один фільтр. У більшості випадків існує більше ніж один фільтр. На малюнку нижче показані операції, виконані в ситуації з трьома фільтрами
- Стрий: визначає кількість «стрибків пікселів» між двома фрагментами. Якщо крок дорівнює 1, вікна рухатимуться з розносом пікселів, що дорівнює одиниці. Якщо крок дорівнює двом, вікна підскочать на 2 пікселі. Якщо ви збільшите крок, ви матимете менші карти функцій.
Приклад кроку 1
крок 2
- Нульове заповнення: Заповнення — це операція додавання відповідної кількості рядків і стовпців з кожного боку карт вхідних об’єктів. У цьому випадку вихід має такий самий розмір, як і вхід.
Нелінійність (ReLU)
Наприкінці операції згортки вихід підлягає функції активації, щоб дозволити нелінійність. Звичайною функцією активації для convnet є Relu. Усі пікселі з від’ємним значенням будуть замінені на нуль.
Pooling Operaції
Цей крок легко зрозуміти. Метою об’єднання є зменшення розмірності вхідного зображення. Ці кроки зроблені для зменшення обчислювальної складності операції. Зменшуючи розмірність, мережа має менші ваги для обчислення, тому запобігає переобладнанню.
На цьому етапі вам потрібно визначити розмір і крок. Стандартним способом об’єднання вхідного зображення є використання максимального значення карти функцій. Подивіться на малюнок нижче. «Об’єднання» екранує чотири субматриці карти функцій 4×4 і повертає максимальне значення. Об’єднання приймає максимальне значення масиву 2×2, а потім переміщує ці вікна на два пікселі. Наприклад, перша підматриця — [3,1,3,2], об’єднання поверне максимум, який дорівнює 3.
Існує ще одна операція об’єднання, наприклад середнє.
Ця операція агресивно зменшує розмір карти функцій
Повністю підключені шари
Останній крок складається з побудови традиційного штучна нейронна мережа як ви робили в попередньому посібнику. Ви підключаєте всі нейрони з попереднього шару до наступного. Ви використовуєте функцію активації softmax для класифікації числа на вхідному зображенні.
Резюме:
Конволюційна нейронна мережа TensorFlow компілює різні рівні перед тим, як зробити прогноз. Нейронна мережа має:
- Згортковий шар
- Функція активації Relu
- Poolinг шар
- Щільно зв'язаний шар
Згорткові шари застосовують різні фільтри до підобласті зображення. Функція активації Relu додає нелінійність, а шари об’єднання зменшують розмірність карт об’єктів.
Усі ці шари отримують важливу інформацію із зображень. Нарешті, карта об’єктів надсилається до основного повністю зв’язаного шару за допомогою функції softmax, щоб зробити прогноз.
Навчання CNN за допомогою TensorFlow
Тепер, коли ви знайомі з будівельним блоком convnets, ви готові його будувати TensorFlow. Ми будемо використовувати набір даних MNIST для класифікації зображень CNN.
Підготовка даних така ж, як і в попередньому уроці. Ви можете запустити коди та перейти безпосередньо до архітектури CNN.
Щоб класифікувати зображення за допомогою CNN, виконайте наведені нижче дії.
Крок 1. Завантажте набір даних
Крок 2: Вхідний шар
Крок 3: згортковий шар
Крок 4: Poolinг шар
Крок 5: Другий згортковий шар і Pooling Шар
Крок 6: Щільний шар
Крок 7: Рівень логіту
Крок 1. Завантажте набір даних
Набір даних MNIST доступний за допомогою scikit, щоб дізнатися про це URL. Завантажте його та збережіть у розділі Завантаження. Ви можете завантажити його за допомогою fetch_mldata('MNIST original').
Створіть набір тренувань/тестів
Вам потрібно розділити набір даних за допомогою train_test_split
Масштабуйте функції
Нарешті, ви можете масштабувати функцію за допомогою MinMaxScaler, як показано в класифікації зображень нижче, використовуючи приклад TensorFlow CNN.
import numpy as np import tensorflow as tf from sklearn.datasets import fetch_mldata #Change USERNAME by the username of your machine ## Windows USER mnist = fetch_mldata('C:\\Users\\USERNAME\\Downloads\\MNIST original') ## Mac User mnist = fetch_mldata('/Users/USERNAME/Downloads/MNIST original') print(mnist.data.shape) print(mnist.target.shape) from sklearn.model_selection import train_test_split X_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 ) ## resclae from sklearn.preprocessing import MinMaxScaler scaler = MinMaxScaler() # Train X_train_scaled = scaler.fit_transform(X_train.astype(np.float64)) # test X_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, вам потрібно визначити:
- Згортковий шар: застосуйте n фільтрів до карти об’єктів. Після згортки вам потрібно використовувати функцію активації Relu, щоб додати мережі нелінійність.
- Poolinшар g: наступним кроком після згортки є зменшення дискретизації макс. Мета полягає в тому, щоб зменшити розмірність карти функцій, щоб запобігти переобладнанню та підвищити швидкість обчислень. Максимальне об’єднання — це звичайна техніка, яка розділяє карти функцій на субрегіони (зазвичай розміром 2×2) і зберігає лише максимальні значення.
- Повністю з’єднані шари: усі нейрони з попередніх шарів з’єднані з наступними шарами. CNN класифікує мітку відповідно до характеристик із згорткових шарів і зменшених шаром об’єднання.
Архітектура CNN
- Згортковий шар: застосовує 14 фільтрів 5×5 (вилучаючи субобласті 5×5 пікселів) із функцією активації ReLU
- Pooling Layer: виконує максимальне об’єднання за допомогою фільтра 2×2 і кроку 2 (що вказує, що об’єднані області не перекриваються)
- Згортковий шар: застосовує 36 фільтрів 5×5 із функцією активації ReLU
- Pooling Рівень №2: знову виконує максимальне об’єднання з фільтром 2×2 і кроком 2
- 1,764 нейрона з коефіцієнтом регулярізації випадання 0.4 (ймовірність 0.4 того, що будь-який даний елемент буде викинуто під час навчання)
- Щільний шар (шар логіт): 10 нейронів, по одному для кожного цільового класу цифр (0–9).
Є три важливі модулі для створення CNN:
- conv2d(). Створює двовимірний згортковий шар із кількістю фільтрів, розміром ядра фільтра, заповненням і функцією активації як аргументами.
- max_pooling2d(). Створює двовимірний шар об’єднання за допомогою алгоритму максимального об’єднання.
- dense(). Створює щільний шар із прихованими шарами та блоками
Ви визначите функцію для створення CNN. Давайте детально розглянемо, як побудувати кожен будівельний блок, перш ніж об’єднати все разом у функцію.
Крок 2: Вхідний шар
def cnn_model_fn(features, labels, mode): input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
Вам потрібно визначити тензор із формою даних. Для цього ви можете використовувати модуль tf.reshape. У цьому модулі вам потрібно оголосити тензор, який потрібно змінити, і форму тензора. Перший аргумент — це особливості даних, які визначені в аргументі функції.
Картина має висоту, ширину та канал. Набір даних MNIST — це монохронічне зображення розміром 28×28. Ми встановлюємо розмір пакета на -1 в аргументі форми, щоб він мав форму ознак [“x”]. Перевагою є можливість налаштування гіперпараметрів розміру партії. Якщо розмір партії встановлено на 7, тоді тензор подасть 5,488 значень (28*28*7).
Крок 3: згортковий шар
# first Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
Перший згортковий шар має 14 фільтрів з розміром ядра 5×5 з однаковим заповненням. Однакове заповнення означає, що і вихідний, і вхідний тензори повинні мати однакову висоту та ширину. Tensorflow додасть нулі до рядків і стовпців, щоб забезпечити однаковий розмір.
Ви використовуєте функцію активації Relu. Вихідний розмір буде [28, 28, 14].
Крок 4: Poolinг шар
Наступним кроком після згортки є обчислення об’єднання. Обчислення об’єднання зменшить розмірність даних. Ви можете використовувати модуль max_pooling2d із розміром 2×2 і кроком 2. Ви використовуєте попередній шар як вхідні дані. Вихідний розмір буде [batch_size, 14, 14, 14]
# first Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
Крок 5: Другий згортковий шар і Pooling Шар
Другий згортковий шар має 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: Щільний шар
Потім вам потрібно визначити повністю підключений рівень. Карту об’єктів потрібно звести до з’єднання з щільним шаром. Ви можете використовувати модуль reshape розміром 7*7*36.
Щільний шар з’єднає 1764 нейрони. Ви додаєте функцію активації Relu. Крім того, ви додаєте член регулярізації вилучення зі швидкістю 0.3, тобто 30 відсотків ваг буде встановлено на 0. Зауважте, що вилучення відбувається лише під час фази навчання. Функція cnn_model_fn має режим аргументів, щоб оголосити, чи потребує модель навчання або оцінка, як показано в наведеному нижче прикладі класифікації зображень CNN TensorFlow.
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: Рівень логіту
Нарешті, у прикладі класифікації зображень TensorFlow ви можете визначити останній шар із передбаченням моделі. Вихідна форма дорівнює розміру партії та 10 загальній кількості зображень.
# Logits Layer logits = tf.layers.dense(inputs=dropout, units=10)
Ви можете створити словник, що містить класи та ймовірність кожного класу. Модуль tf.argmax() з повертає найвище значення, якщо логічні шари. Функція 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)
Останнім кроком прикладу TensorFlow CNN є оптимізація моделі, тобто пошук найкращих значень ваг. Для цього ви використовуєте оптимізатор градієнтного спуску зі швидкістю навчання 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 Layer input_layer = tf.reshape(features["x"], [-1, 28, 28, 1]) # Convolutional Layer conv1 = tf.layers.conv2d( inputs=input_layer, filters=32, kernel_size=[5, 5], padding="same", activation=tf.nn.relu) # Pooling Layer pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2) # Convolutional Layer #2 and Pooling Layer 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) # Dense Layer 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.4, training=mode == tf.estimator.ModeKeys.TRAIN) # Logits Layer logits = 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 Loss loss = 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 mode 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 для класифікації зображень.
# Create the Estimator mnist_classifier = tf.estimator.Estimator( model_fn=cnn_model_fn, model_dir="train/mnist_convnet_model")
Навчання CNN займає багато разів, тому ви створюєте хук Logging для зберігання значень шарів softmax кожні 50 ітерацій.
# Set up logging for predictions tensors_to_log = {"probabilities": "softmax_tensor"} logging_hook = tf.train.LoggingTensorHook(tensors=tensors_to_log, every_n_iter=50)
Ви готові оцінити модель. Ви встановлюєте розмір партії 100 і перемішуєте дані. Зверніть увагу, що ми встановлюємо 16.000 XNUMX тренувальних кроків, тренування може зайняти багато часу. Наберіться терпіння.
# Train the model train_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 results eval_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:41 INFO:tensorflow:Graph was finalized. INFO:tensorflow:Restoring parameters from train/mnist_convnet_model/model.ckpt-15652 INFO:tensorflow:Running local_init_op. INFO:tensorflow:Done running local_init_op. INFO:tensorflow:Finished evaluation at 2018-08-05-12:52:56 INFO: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 працює набагато краще, ніж ШНМ або логістична регресія. У підручнику зі штучної нейронної мережі ви мали точність 96%, що нижче CNN. Виступи CNN вражають більшим зображенням комплект, як щодо швидкості обчислень, так і щодо точності.
Підсумки
Згорточна нейронна мережа дуже добре працює для оцінки зображення. Цей тип архітектури є домінуючим для розпізнавання об’єктів із зображення чи відео.
Щоб створити TensorFlow CNN, вам потрібно виконати сім кроків:
крок 1: Завантажити набір даних:
Набір даних MNIST доступний за допомогою scikit для вивчення. Завантажте його та збережіть у розділі Завантаження. Ви можете завантажити його за допомогою fetch_mldata('MNIST original').
крок 2: Вхідний шар:
Цей крок змінює форму даних. Форма дорівнює квадратному кореню з кількості пікселів. Наприклад, якщо зображення має 156 пікселів, то форма має 26×26. Потрібно вказати, чи є на малюнку колір чи ні. Якщо так, то у вас було 3 для форми - 3 для RGB-, інакше 1.
input_layer = tf.reshape(tensor = features["x"],shape =[-1, 28, 28, 1])
крок 3: Згортковий шар
Далі вам потрібно створити згорткові шари. Ви застосовуєте різні фільтри, щоб дозволити мережі дізнатися важливу функцію. Ви вказуєте розмір ядра та кількість фільтрів.
conv1 = tf.layers.conv2d( inputs=input_layer, filters=14, kernel_size=[5, 5], padding="same", activation=tf.nn.relu)
крок 4: Poolinг шар
На третьому кроці ви додаєте шар об’єднання. Цей шар зменшує розмір введення. Для цього береться максимальне значення підматриці a. Наприклад, якщо підматриця дорівнює [3,1,3,2], об’єднання поверне максимум, який дорівнює 3.
pool1 = tf.layers.max_pooling2d(inputs=conv1, pool_size=[2, 2], strides=2)
крок 5: Додайте згортковий шар і Pooling Шар
На цьому кроці ви можете додавати скільки завгодно шарів конверсії та шарів об’єднання. Google використовує архітектуру з понад 20 рівнями конверсії.
крок 6: Щільний шар
Крок 6 зрівняйте попередній, щоб створити повністю з’єднані шари. На цьому кроці ви можете використовувати іншу функцію активації та додати ефект вилучення.
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: рівень логіту
Останнім кроком є прогноз.
logits = tf.layers.dense(inputs=dropout, units=10)