Научные знания
NIPS (NeurIPS), полное название конференции и семинара по нейронным системам обработки информации (Neural Information Processing Systems) — международная конференция по машинному обучению и вычислительной нейронауке. Конференция проводится в декабре каждого года и спонсируется Фондом NIPS. NIPS — это лучшая конференция по машинному обучению. В рейтинге международных академических конференций Китайской компьютерной федерации NIPS является конференцией класса А в области искусственного интеллекта.
# Предисловие
Сентябрь.
В предыдущей статье теоретической главы мы узнали об остаточной сети (ResNet), ее основная идея состоит в том, чтобы построить остаточную структуру за счет пропусков соединений, чтобы сеть могла преодолеть ограничение глубины и построить более глубокую сеть.
Битва ResNet от TensorFlow
В этом выпуске практического обмена мы в основном практикуем код Tensorflow ResNet-18, который обычно используется в сетевой структуре ResNet, На этот раз код очень лаконичен, и я надеюсь, что вы сможете не отставать от него до конца.
1. Подготовка данных
На этот раз данные используют набор данных выражений лица RAFDB, который содержит семь категорий: мирное, счастливое, грустное,
Удивлен, возмущен, зол, напуган. Подобно предыдущему набору данных, этот набор данных по выражению лица также содержит
Обучающий набор и тестовый набор, каждый набор не содержит 7 папок (выражений). с предыдущим набором данных
То же самое, набор данных содержит обучающий набор и тестовый набор, каждый набор содержит семь папок (выражений), а некоторые образцы показывают
2. Структура сети
На приведенном выше рисунке показана обычная версия сети ResNet. В качестве примера для совместного использования используется 18-уровневая сеть ResNet-18. Структура сети следующая:
# 残差块构建
def ResBlock(name, num_blocks, input, inchannel, outchannel, stride):
conv_input = input
conv_inchannel = inchannel
conv_stride = stride
for i in range(num_blocks):
out = Conv_layer(names = '{}{}'.format(name, i), input = conv_input , w_shape = [3, 3, conv_inchannel, outchannel], b_shape = [outchannel], strid = [conv_stride, conv_stride])
conv_input = out
conv_inchannel = outchannel
conv_stride = 1
# 残差
if stride > 1:
shortcut = Conv_layer(names = '{}_{}'.format(name,i), input = input , w_shape = [1, 1, inchannel, outchannel], b_shape = [outchannel], strid = [stride, stride])
out = out + shortcut
return out
# 残差网络构建
def inference(images, batch_size, n_classes,drop_rate):
print("******** images {} ".format(images.shape))
#第一层预处理卷积
pre_conv1 = Conv_layer(names = 'pre_conv', input = images , w_shape = [7, 7, 3, 64], b_shape = [64], strid = [2, 2])
print("******** pre_conv1 {} ".format(pre_conv1.shape))
# 池化层
pool_1 = Max_pool_lrn(names = 'pooling1', input = pre_conv1 , ksize = [1, 3, 3, 1], is_lrn = False)
# print("******** pool_1 {} ".format(pool_1.shape))
# 第一个卷积块(layer1)
layer1 = ResBlock('Resblock1', 2, pool_1, 64, 64, 1)
print("******** layer1 {} ".format(layer1.shape))
# 第二个卷积块(layer2)
layer2 = ResBlock('Resblock2', 2, layer1, 64, 128, 2)
print("******** layer2 {} ".format(layer2.shape))
# 第三个卷积块(layer3)
layer3 = ResBlock('Resblock3', 2, layer2, 128, 256, 2)
print("******** layer3 {} ".format(layer3.shape))
# 第四个卷积块(layer4)
layer4 = ResBlock('Resblock4', 2, layer3, 256, 512, 2)
print("******** layer4 {} ".format(layer4.shape))
# 全局平均池化
global_avg = tf.nn.avg_pool(layer4, ksize=[1,7,7,1],strides=[1,7,7,1],padding='SAME')
print("******** global_avg {} ".format(global_avg.shape))
reshape = tf.reshape(global_avg, shape=[batch_size, -1])
dim = reshape.get_shape()[1].value
with tf.variable_scope('softmax_linear') as scope:
weights = tf.Variable(tf.truncated_normal(shape=[dim, n_classes], stddev=0.005, dtype=tf.float32),
name='softmax_linear', dtype=tf.float32)
biases = tf.Variable(tf.constant(value=0.1, dtype=tf.float32, shape=[n_classes]),
name='biases', dtype=tf.float32)
resnet18_out = tf.add(tf.matmul(reshape, weights), biases, name='softmax_linear')
print("---------resnet18_out:{}".format(resnet18_out))
return resnet18_out
3. Тренировочный процесс
Получение исходного кода: https://gitee.com/fengyuxiexie/res-net-18
КОНЕЦ
эпилог
На этом обсуждение этой проблемы завершается. Остаточная сеть нравится многим исследователям из-за ее отличной производительности. Поэтому остаточная сеть стала базовой моделью для многих наборов данных.
Из-за простой реализации структуры остаточной сети редактор надеется, что вы сможете реализовать ее самостоятельно после понимания структуры сети, глубокого понимания преобразования размеров изображений в остаточной сети и изучения использования размера шага свертки и заполнения в Tensorflow. , Дальнейшее повышение реальных боевых возможностей Tensorflow.
Кроме того, из-за популярности фреймворка Pytorch в академическом мире мы больше не можем использовать Tensorflow в следующих статьях, а будем напрямую использовать Pytorch для его реализации.Надеюсь, он вам и дальше будет нравиться.
Редактор: Мирянин Юэи | Рецензия: Мирянин Сяоцюаньцюань
Продвинутый ИТ-тур
Прошлый отзыв
Практическая глава по глубокому обучению (15) -- GoogLeNet из TensorFlow
Практическая глава по глубокому обучению (14) — VGG16 TensorFlow
Практическая глава по глубокому обучению (13) — AlexNet из TensorFlow
Что мы сделали за последний год:
[Итоги на конец года] Прощаясь со старым и приветствуя новое, 2020 год, давайте начнем сначала
[Итоги на конец года] 2021 год, прощаемся со старым и приветствуем новое
Нажми "Нравится" и вперед~