Практическая глава по глубокому обучению (16) — ResNet of TensorFlow

Научные знания

NIPS (NeurIPS), полное название конференции и семинара по нейронным системам обработки информации (Neural Information Processing Systems) — международная конференция по машинному обучению и вычислительной нейронауке. Конференция проводится в декабре каждого года и спонсируется Фондом NIPS. NIPS — это лучшая конференция по машинному обучению. В рейтинге международных академических конференций Китайской компьютерной федерации NIPS является конференцией класса А в области искусственного интеллекта.

73866d386989b81242b1ca8c02053d8b.png

# Предисловие

Сентябрь.

В предыдущей статье теоретической главы мы узнали об остаточной сети (ResNet), ее основная идея состоит в том, чтобы построить остаточную структуру за счет пропусков соединений, чтобы сеть могла преодолеть ограничение глубины и построить более глубокую сеть.

38fcb207b4df8a5ecb43a0c0cdcc7b8b.png

Битва ResNet от TensorFlow

93cfd05c11e034093d4c55cdac179a7f.png

В этом выпуске практического обмена мы в основном практикуем код Tensorflow ResNet-18, который обычно используется в сетевой структуре ResNet, На этот раз код очень лаконичен, и я надеюсь, что вы сможете не отставать от него до конца.

1. Подготовка данных

c5079c3ed3428526f4155241d5cdcff8.png

На этот раз данные используют набор данных выражений лица RAFDB, который содержит семь категорий: мирное, счастливое, грустное,

Удивлен, возмущен, зол, напуган. Подобно предыдущему набору данных, этот набор данных по выражению лица также содержит

Обучающий набор и тестовый набор, каждый набор не содержит 7 папок (выражений). с предыдущим набором данных

То же самое, набор данных содержит обучающий набор и тестовый набор, каждый набор содержит семь папок (выражений), а 5aeb720ecbdd9de3d7cf4f2f4ea75ee7.png некоторые образцы показывают

ea19af916d70c40b2e9149e74586fa25.png

2. Структура сети

a9405985fbc7d41875a40ceb0dfc4e7a.png

1922f8975d61c8a3756a26793fed81f6.png

На приведенном выше рисунке показана обычная версия сети ResNet. В качестве примера для совместного использования используется 18-уровневая сеть ResNet-18. Структура сети следующая:

a1d87baa375062c11d8835e4ff6ccf19.png

# 残差块构建
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. Тренировочный процесс

d493683507d523a5430fdc2af3418247.png

f72a8ae50c4da9b6dffd21b3657c207a.png

Получение исходного кода: https://gitee.com/fengyuxiexie/res-net-18

82364cbcde38d9f0f7036536a43241be.gif

КОНЕЦ

эпилог

На этом обсуждение этой проблемы завершается. Остаточная сеть нравится многим исследователям из-за ее отличной производительности. Поэтому остаточная сеть стала базовой моделью для многих наборов данных.

Из-за простой реализации структуры остаточной сети редактор надеется, что вы сможете реализовать ее самостоятельно после понимания структуры сети, глубокого понимания преобразования размеров изображений в остаточной сети и изучения использования размера шага свертки и заполнения в Tensorflow. , Дальнейшее повышение реальных боевых возможностей Tensorflow.

Кроме того, из-за популярности фреймворка Pytorch в академическом мире мы больше не можем использовать Tensorflow в следующих статьях, а будем напрямую использовать Pytorch для его реализации.Надеюсь, он вам и дальше будет нравиться.

Редактор: Мирянин Юэи | Рецензия: Мирянин Сяоцюаньцюань

c31d9548f59c36a161e76af34a0a1652.png

Продвинутый ИТ-тур

Прошлый отзыв

Практическая глава по глубокому обучению (15) -- GoogLeNet из TensorFlow

Практическая глава по глубокому обучению (14) — VGG16 TensorFlow

Практическая глава по глубокому обучению (13) — AlexNet из TensorFlow

Что мы сделали за последний год:

[Итоги на конец года] Прощаясь со старым и приветствуя новое, 2020 год, давайте начнем сначала

[Итоги на конец года] 2021 год, прощаемся со старым и приветствуем новое

11931cf613cff89e002ecfe6a3852768.gif

Нажми "Нравится" и вперед~

Supongo que te gusta

Origin blog.csdn.net/xyl666666/article/details/122163836
Recomendado
Clasificación