ResNet(V2)结构以及Tensorflow实现

Tensorflow实战:ResNet原理及实现(多注释)         参考《Tensorflow实战》黄文坚,对Inception_V3进行了实现与改进,增加了自己的理解,欢迎提问!!         残差神经单元:假定某段神经网络的输入是x,期望输出是H(x),如果我们直接将输入x传到输出作为初始结果,那么我们需要学习的目标就是F(x) = H(x) - x,这就是一个残差神经单元,相当于将学习目标改变了,不再是学习一个完整的输出H(x),只是输... 阅读详情

Tensorflow实现ResNet_V2

引言:
ResNet是由Kaiming He等4名华人提出,通过使用Residual Unit成功训练了152层的深度神经网络,在ILSVRC 2015比赛中获得冠军,取得了3.57%的top-5错误率,同时参数却比VGGNet少。之后很多方法都建立在ResNet的基础上完成的,例如检测,分割,识别等领域都纷纷使用ResNet。在ResNet推出不久,Google就借鉴了ResNet的精髓,提出了Inception V4和Inception-ResNet-V2,并通过融合这两个模型,在ILSVRC数据集上取得了惊人的3.08%的错误率。所以可见ResNet确实很好用。


  • 相关阅读:
    VGGNet以及Tensorflow实现
    AlexNet以及Tensorflow实现
    GoogleInceptionNet_V3以及Tensorflow实现

  • ResNet灵感来源:
    这来自于困扰深度学习领域的一个Degradation的问题,即在不断加深神经网络深度时,准确率会先上升然后达到饱和,再持续增加深度则会导致准确率下降。这并不是过拟合的问题,因为不光在测试集上误差增大,训练集本身误差也会增大。

  • ResNet结构:
    在这里插入图片描述
    其中,每一列对应的是不同深度的ResNet。此外,表格中每一个用中括号括起来的都是一个残差学习模块组,其内部的结构类似于下图:

这种结构与HighWay NetWork非常类似。这种结构不仅能够解决非常深的神经网络结构出现梯度消失或者梯度爆炸的问题,而且也能在一定程度上保护信息的完整性(因为传统的卷积层或者全连接层在信息传递时,或多或少会存在信息丢失或者损耗等问题)

Note: 其实这里有一个小tips,上面右边那张图有两种不同的结构,但是可以发现,如果采用的是第一种结构,则参数数目大约为(这里先假设输入输出都为256-d):

左图:3x3x256x64 + 3x3x64x256 = 294912
右图:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632
两者相差将近5倍,显然用右边的结构能够在比较深的网络中仍然能保持参数的规模不至于过大
  • ResNet_V2的改进之处:
  1. 作者通过研究ResNet残差学习单元的传播公式,发现前馈和反馈信号可以直接传输,因此最后的非线性激活函数(如Relu)替换了为了恒等映射(Identity Mapping)
    y = x y = x y=x,从而使得训练变得更加容易
  2. 在每一层中都使用BN,这样处理之后,新的残差单元将比以前更容易训练且泛化性更强
  • 模块化方法:
    本文将通过模块化加注释的方法,来实现ResNet_V2,这样可以帮助初学者快速读懂其结果以及实现方法
  1. 导入包并设计Block模块组
  2. 定义部分方法
  3. 定义生成ResNet V2的主函数
  4. 定义不同深度的ResNet网络结构
  5. 定义耗时(测试用)

导入包并设计Block模块组:

import collections
import tensorflow as tf
from datetime import datetime
import math
import time
slim = tf.contrib.slim

'''
使用collectin.namedtuple设计ResNet基本Block模块组
示例:
    MyTupleClass = collections.namedtuple('MyTupleClass',['name', 'age', 'job'])
    obj = MyTupleClass("Tomsom",12,'Cooker')
    print(obj.name)
    print(obj.age)
    print(obj.job)
执行结果:
    Tomsom
    12
    Cooker
'''
Block = collections.namedtuple('Block', ['scope', 'unit_fn', 'args'])

定义部分方法:

# 实行降采样,如果factor不为1就以factor为步长降采样
def subsample(inputs, factor, scope = None):
    if factor == 1:
        return inputs
    else:
        return slim.max_pool2d(inputs, [1, 1], stride = factor, scope = scope)

# 依据步长选择卷积策略
def conv2d_same(inputs, num_outputs, kernel_size, stride, scope=None):
    if stride == 1:  # 如果stride == 1, 直接进行卷积
        return slim.conv2d(inputs, num_outputs, kernel_size, stride = 1,
                           padding = 'SAME', scope = scope)
    else:     # 如果stride != 1
        pad_total = kernel_size - 1
        pad_beg = pad_total // 2     # 上方、左方填充0的列数(行数)
        pad_end = pad_total - pad_beg    # 下方、右方填充0的列数(行数)
        inputs = tf.pad(inputs, [[0,0], [pad_beg, pad_end], [pad_beg, pad_end], [0,0]]) # 进行全0填充
        return slim.conv2d(inputs, num_outputs, kernel_size, stride = stride, padding = 'VALID', scope = scope)
        
# 下面等价于slim.add_arg_scope(stack_blocks_dense)
@slim.add_arg_scope
def stack_blocks_dense(net, blocks, outputs_collections = None):
    '''
    定义堆叠Blocks的函数
    net: 输入
    blocks: 之前定义的Block的class的列表
    outputs_collections: 用来收集各个end_point的collections
    '''
    for block in blocks:
        with tf.variable_scope(block.scope, 'block', [net]) as sc:
            for i, unit in enumerate(block.args):
                with tf.variable_scope('unit_%d' % (i+1), values = [net]):
                    unit_depth, unit_depth_bottleneck, unit_stride = unit
                    # unit_fn: 残差学习单元的生成函数,顺序地创建并连接所有的残差学习单元
                    net = block.unit_fn(net, depth = unit_depth, 
                                        depth_bottleneck = unit_depth_bottleneck,
                                        stride = unit_stride)
            # collect_named_outputs: 将输出net添加到collection中
            net = slim.utils.collect_named_outputs(outputs_collections, sc.name, net)
    return net


# 创立ResNet通用的arg_scope
def resnet_arg_scope(is_training = True,
                     weight_decay = 0.0001,
                     batch_norm_decay = 0.997,
                     batch_norm_epsilon = 1e-5,
                     batch_norm_scale = True):
    '''
    weight_decay: 权重衰减速率, 即下面L2所占比
    batch_norm_decay: BN衰减速率
    batch_norm_epsilon: BN的epsilon
    batch_norm_scale: BN的scale默认为True, 即乘以公式中的gamma
    '''
    batch_norm_paras = {
        'is_training': is_training,
        'decay': batch_norm_decay,
        'epsilon': batch_norm_epsilon,
        'scale': batch_norm_scale,
        'updates_collections': tf.GraphKeys.UPDATE_OPS
    }
    # 设置slim.conv2d()中的参数默认值
    with slim.arg_scope([slim.conv2d],
                        weights_regularizer = slim.l2_regularizer(weight_decay),
                        weights_initializer = slim.variance_scaling_initializer(),
                        activation_fn = tf.nn.relu,
                        normalizer_fn = slim.batch_norm,
                        normalizer_params = batch_norm_paras):
        # 设置slim.batch_norm中的参数默认值,**batch_norm_para是解包的作用,把对应参数值分配给BN中的参数
        with slim.arg_scope([slim.batch_norm], **batch_norm_paras):
            # 设置最大池化的默认参数
            with slim.arg_scope([slim.max_pool2d], padding = 'SAME') as arg_sc:
                return arg_sc


# 定义核心的bottleneck残差学习单元(是ResNet V2论文提到的Full Preactivation Residual Net的一个变种)
@slim.add_arg_scope
def bottleneck(inputs, depth, depth_bottleneck, stride,
               outputs_collections = None, scope = None):
    '''
    inputs: 输入
    depth, depth_bottleneck, stride: Blocks类中的args
    outputs_collection: 收集end_points的collection
    scope: 当前unit的名称
    '''
    with tf.variable_scope(scope, 'bottleneck_v2', [inputs]) as sc:
        # 获取输入的最后一个维度
        depth_in = slim.utils.last_dimension(inputs.get_shape(), min_rank = 4)
        # 对输入进行预BN操作
        preact = slim.batch_norm(inputs, activation_fn = tf.nn.relu, scope = 'preact')

        if depth == depth_in: # 如果残差单元的输入通道数depth_in与输出通道数depth相同
            shortcut = subsample(inputs, stride, 'shortcut')
        else:            # 如果输入与输出通道不一致,则用stride=1的卷积操作改变通道数
            shortcut = slim.conv2d(preact, depth, [1, 1], stride = stride,
                                   normalizer_fn = None, 
                                   activation_fn = None,
                                   scope = 'shortcut')
        # 输出通道数为depth_bottleneck的卷积, 卷积核1x1
        residual = slim.conv2d(preact, depth_bottleneck, [1, 1],
                               stride = 1, scope = 'conv1')
        # 3表示卷积核尺寸3x3(帮你看代码抗"过拟合")
        residual = conv2d_same(residual, depth_bottleneck, 3,
                                    stride, scope = 'conv2')
        # 输出通道数为depth, 卷积核1x1
        residual = slim.conv2d(residual, depth, [1, 1], stride = 1,
                               normalizer_fn = None, activation_fn = None,
                               scope = 'conv3')
        # 实现Residual output的结果
        output = residual + shortcut
        # 将结果添加入collection,并返回output作为函数结果
        return slim.utils.collect_named_outputs(outputs_collections, sc.name, output)

定义生成ResNet V2的主函数:

def resnet_v2(inputs, blocks, num_classes = None,
              global_pool = True, 
              include_root_block = True,
              reuse = None,
              scope = None):
    '''
    inputs: 输入
    blocks: 定义好的Block类的列表
    num_classes: 最后输出的类数
    global_pool: 标志是否加上最后一层的全局平均池化
    include_root_block: 标志是否加上ResNet网络最前面通常使用的7x7卷积和最大池化
    reuse: 标志是否重用
    scope: 整个网络的名称
    '''
    with tf.variable_scope(scope, 'resnet_v2', [inputs], reuse = reuse) as sc:
        end_points_collection =sc.original_name_scope + '_end_point'
        # 设置outputs_collections默认参数为end_points_collection
        with slim.arg_scope([slim.conv2d, bottleneck, stack_blocks_dense],
                            outputs_collections = end_points_collection):
            net = inputs
            if include_root_block:
                # 设置slim.conv2d的默认参数
                with slim.arg_scope([slim.conv2d], activation_fn = None,
                                    normalizer_fn = None):
                    # 创建ResNet最前面64输出通道步长为2的7x7卷积
                    net = conv2d_same(net, 64, 7, stride = 2, scope = 'conv1')
                # 接步长为2的3x3池化
                net = slim.max_pool2d(net, [3, 3], stride = 2, scope = 'pool1')   # 执行完后,图片尺寸以缩小为1/4
            # 用stack_blocks_dense把残差学习模块生成好
            net = stack_blocks_dense(net, blocks)
            net = slim.batch_norm(net, activation_fn = tf.nn.relu, scope = 'postnorm')
            if global_pool: # 如果要进行全局平均池化层
                net = tf.reduce_mean(net, [1, 2], name = 'pool5', keep_dims = True)
            if num_classes is not None:  # 用卷积操作替代全连接层(添加一个输出通道为num_classes的1x1卷积)
                net = slim.conv2d(net, num_classes, [1, 1], activation_fn = None, normalizer_fn = None, scope = 'logits')
            # 将collection转为dict
            end_points = slim.utils.convert_collection_to_dict(end_points_collection) 
            if num_classes is not None:
                end_points['predictions'] = slim.softmax(net, scope = 'prediction')
            return net, end_points

定义不同深度的ResNet网络结构:

# 50层深度的ResNet网络配置
def resnet_v2_50(inputs, num_classes = None,
                 global_pool = True,
                 reuse = None,
                 scope = 'resnet_v2_50'):
    '''
    以下面Block('block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)])为例
    block1: 是这个Block的名称
    bottleneck: 前面定义的残差学习单元(有三层)
    [(256, 64, 1)] * 2 + [(256, 64, 2)]: 是一个列表,其中每个元素都对应一个bottleneck
        残差学习单元,前面两个元素都是(256, 64, 1),最后一个是(256, 64, 2)。每个元素都
        时一个3元组,即(depth, depth_bottleneck, stride),代表构建的bottleneck残差学
        习单元中,第三层的输出通道为256(depth),前两层的输出通道数为64(depth_bottleneck)
        且中间那层的步长stride为1(stride)
    '''
    blocks = [
        Block('block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]),
        Block('block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]),
        Block('block3', bottleneck, [(1024, 256, 1)] * 5 + [(1024, 256, 2)]),
        Block('block4', bottleneck, [(2048, 512, 1)] * 3)]
    return resnet_v2(inputs, blocks, num_classes, global_pool,
                     include_root_block = True, reuse = reuse,
                     scope = scope)

# 101层深度的ResNet网络配置
def resnet_v2_101(inputs, num_classes = None,
                  global_pool = True,
                  reuse = None,
                  scope = 'resnet_v2_101'):
    blocks = [
        Block('block1', bottleneck, [(256, 64, 1)] * 2+ [(256, 64, 2)]),
        Block('block2', bottleneck, [(512, 128, 1)] * 3 + [(512, 128, 2)]),
        Block('block3', bottleneck, [(1024, 256, 1)] * 22 + [(1024, 256, 2)]),
        Block('block4', bottleneck, [(2048, 512, 1)] * 3)]
    return resnet_v2(inputs, blocks, num_classes, global_pool,
                     include_root_block = True, reuse = reuse,
                     scope = scope)

# 152层深度的ResNet网络配置
def resnet_v2_152(inputs, num_classes = None,
                  global_pool = True,
                  reuse = None,
                  scope = 'resnet_v2_152'):
    blocks = [
        Block('block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]),
        Block('block2', bottleneck, [(512, 128, 1)] * 7 + [(512, 128, 2)]),
        Block('block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]),
        Block('block4', bottleneck, [(2048, 512, 1)] * 3)]
    return resnet_v2(inputs, blocks, num_classes, global_pool,
                     include_root_block = True, reuse = reuse,
                     scope = scope)

# 200层深度的ResNet网络配置
def resnet_v2_200(inputs, num_classes = None,
                  global_pool = True,
                  reuse = None,
                  scope = 'resnet_v2_200'):
    blocks = [
        Block('block1', bottleneck, [(256, 64, 1)] * 2 + [(256, 64, 2)]),
        Block('block2', bottleneck, [(512, 128, 1)] * 23 + [(512, 128, 2)]),
        Block('block3', bottleneck, [(1024, 256, 1)] * 35 + [(1024, 256, 2)]),
        Block('block4', bottleneck, [(2048, 512, 1)] * 3)]
    return resnet_v2(inputs, blocks, num_classes, global_pool,
                     include_root_block = True, reuse = reuse,
                     scope = scope)

定义耗时:

def time_tensorflow_run(session, target, info_string):
    num_steps_burn_in = 10  # 打印阈值
    total_duration = 0.0    # 每一轮所需要的迭代时间
    total_duration_aquared = 0.0  # 每一轮所需要的迭代时间的平方
    for i in range(num_batches + num_steps_burn_in):
        start_time = time.time()
        _ = session.run(target)
        duration = time.time() - start_time    # 计算耗时
        if i >= num_steps_burn_in:
            if not i % 10:
                print("%s : step %d, duration = %.3f" % (datetime.now(), i - num_steps_burn_in, duration))
            total_duration += duration
            total_duration_aquared += duration * duration
    mn = total_duration / num_batches   # 计算均值
    vr = total_duration_aquared / num_batches - mn * mn  # 计算方差
    sd = math.sqrt(vr) # 计算标准差
    print("%s : %s across %d steps, %.3f +/- %.3f sec/batch" % (datetime.now(), info_string, num_batches, mn, sd))

测试:
注:CNN的训练都是比较耗时的,所以这里也就是测试一下几张随机生成图的前向和反向传播过程

batch_size = 32
height, width = 224, 224
inputs = tf.random_uniform((batch_size, height, width, 3))
with slim.arg_scope(resnet_arg_scope(is_training = False)):
    net, end_points = resnet_v2_152(inputs, 1000)

with tf.Session() as sess:
    init = tf.global_variables_initializer()
    sess.run(init)
    num_batches = 100
    time_tensorflow_run(sess, net, "Forward")

运行效果:

WARNING:tensorflow:From <ipython-input-6-adddb457e8ef>:34: calling reduce_mean (from tensorflow.python.ops.math_ops) with keep_dims is deprecated and will be removed in a future version.
Instructions for updating:
keep_dims is deprecated, use keepdims instead
2019-01-26 08:10:51.879413 : step 0, duration = 0.486
2019-01-26 08:10:56.748640 : step 10, duration = 0.487
2019-01-26 08:11:01.628659 : step 20, duration = 0.489
2019-01-26 08:11:06.511324 : step 30, duration = 0.489
2019-01-26 08:11:11.410210 : step 40, duration = 0.490
2019-01-26 08:11:16.311633 : step 50, duration = 0.491
2019-01-26 08:11:21.219118 : step 60, duration = 0.493
2019-01-26 08:11:26.133231 : step 70, duration = 0.492
2019-01-26 08:11:31.054586 : step 80, duration = 0.493
2019-01-26 08:11:35.984226 : step 90, duration = 0.494
2019-01-26 08:11:40.435636 : Forward across 100 steps, 0.490 +/- 0.002 sec/batch

[1] He K, Zhang X, Ren S, et al. Deep residual learning for image recognition[C]//Proceedings of the IEEE conference on computer vision and pattern recognition. 2016: 770-778.
[2] He K, Zhang X, Ren S, et al. Identity mappings in deep residual networks[C]//European conference on computer vision. Springer, Cham, 2016: 630-645.
[3] Tensorflo实战.黄文坚,唐源

如果觉得我有地方讲的不好的或者有错误的欢迎给我留言,谢谢大家阅读(点个赞我可是会很开心的哦)~

ResNet_V2_152层---TensorFlow ResNet #实现ResNet_V2_152 import tensorflow as tf import collections import time from datetime import datetime import math slim = tf.contrib.slim WARNING: Logging before flag parsing goes to stderr. W... 阅读详情

相关推荐

TensorFlow实现inception-resnet

论文地址 inception-v1,inception-v2,inception-v3,inception-v4 事前准备 我这边使用的是Windows平台TensorFlow1.4 gpu版本,当然如果是cpu版本也玩不了,太慢了,这个网络可是用来跑ImageNet的。另外你可以下载前面的inception-v4论文,因为接下来要对照论文进行实现。当然这里只是尝试模拟,可能会有错误,欢迎指...

u014524930的博客 1万+

论文笔记:ResNet v2

ResNet v2 1、四个问题 要解决什么问题? 进一步提高ResNet的性能。 解释为何Identity mapping(恒等映射)的效果会比较好。 用了什么方法解决? 提出了一个新的残差单元结构。 从理论和实验上分析了identity mapping的有效性。 效果如何? 使用1001层的ResNet,在CIFAR-10数据集上错误率为4.62%,在CIFAR-100数据集上...

hongbin_xu的博客 1149

基于python开发使用EcapaTdnn、ResNetSE、ERes2Net、CAM++先进声纹识别模型,并支持多种数据预处理

基于python开发使用EcapaTdnn、ResNetSE、ERes2Net、CAM++先进声纹识别模型,并支持多种数据预处理,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 项目简介: 项目使用了EcapaTdnn、ResNetSE、ERes2Net、CAM++等多种先进的声纹识别模型,不排除以后会支持更多模型,同时本项目也支持了MelSpectrogram、Spectrogram、MFCC、Fbank等多种数据预处理方法,使用了ArcFace Loss,ArcFace loss:Additive Angular Margin Loss(加性角度间隔损失函数),对应项目中的AAMLoss,对特征向量和权重归一化,对θ加上角度间隔m,角度间隔比余弦间隔在对角度的影响更加直接,除此之外,还支持AMLoss、ARMLoss、CELoss等多种损失函数。

TensorFlow实现ResNet

目录 1.概述 2.Basic_Block ① __init__ ②call 3.Resnet ①build_block ②__init__ ③call 1.概述 通过tensorflow实现ResNet,需要先定义最小模块basic_block,在其中实现最基本的ResNet前向传播以及短接功能;之后定义ResNet模块,通过堆叠不同个数的basic_block,并拼接到一起,实现ResNet的功能实现。 2.Basic_Block ① __init__ 在这里面定义好.

Swayzzu的博客 5488

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置

全国大学生软件测试大赛Web应用测试(二)Selenium功能测试环境配置指南配置JAVA配置mooctest配置ChromeDriver配置SeleniumSelenium的使用 环境配置指南 配置JAVA 首先进入JDK8官方安装地址 然后找到Windows 64位 jdk8 点击下载(这里下载需要登录Orcale 账户) 下载后JDK的安装根据提示进行,还有安装JDK的时候也会安装JRE,一并安装就可以了。 安装JDK,安装过程中可以自定义安装目录等信息,例如我们选择安装目录为 D:\java\jav

Kennen0_0的博客 9606

利用GBD数据库做未来疾病负担预测

最近看到一篇文献,利用GBD数据库中的数据对疾病负担的发展趋势进行预测。觉得很有趣,就抽空用R语言复盘了一下里面关键的方法。 参考文献: Changing trends in the disease burden of esophageal cancer in China from 1990 to 2017 and its predicted level in 25 years DOI: 10.1002/cam4.3775 1. 相关R包的安装 主要用到的R包有3个,一个一个讲: 1.1 Nordpred

NickyCat的博客 5万+

ResNet的TensorFlow实现

在实现网络之前,我们首先要对残差网络的实现方法有一定的了解,这里不再过多的赘述。要实现一个网络,最重要的当然是基本框架的搭建了,我们从这张图片来入手resnet的基本框架。                                                        图1    (以101为例,如果没有特别说明,后面默认为Res101网络)不难看出,ResNet101的...

Pierce_KK的博客 1265

C#精准获取Windows已安装应用清单的完整方案

Windows已安装应用识别是IT资产管理、安全合规与自动化运维的基础能力。其核心原理在于突破文件系统表象,以注册表为可信数据源,分层解析HKLM/HKCU、64位/32位视图及MSI Products路径中的元数据。技术价值体现在可验证(如过滤SystemComponent=1)、可关联(通过ProductCode绑定补丁与许可证)、可操作(启动路径二次验证+卸载命令沙箱执行)。典型应用场景包括终端合规审计、软件资产清查、静默卸载脚本开发及多版本应用聚合分析。本文聚焦C#原生实现,覆盖注册表四路采集、La

weixin_33552698的博客 634

《An Enhanced Res2Net with Local and Global Feature Fus-ion for Speaker Verification》论文分享

本文提出了一种新的架构,称为增强式Res2Net(ERes2Net),通过局部和全局特征融合提高说话人识别性能。

weixin_72625335的博客 1956

Mac---安装Navicat

把这个填充好的字符串放入刚才打开的RSA在线加解密的网站中的第二个框框(替换之前的请求码),第一个框框不动(还是之前第10步骤中的私钥),点击RSA私钥加密,这时会得到一个加密的字符串,这个就是激活码。{“K”:“你的K值”, “N”:“52pojie”, “O”:“52pojie.cn”, “DI”:“你的DI值”, “T”:你的时间戳}链接: https://pan.baidu.com/s/1mEVY4hnKdktg-p7DBIfD7A 提取码: twwg。Navicat会弹出一个对话框,点击“注册”

weixin_53970868的博客 1万+

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

YOLO系列训练时出现loss出现nan值或者测试时P\R\map全部为0值的解决办法(GTX16xx系列显卡大坑)

weixin_55249340的博客 3万+

3D-Speaker核心模型解析:CAM++、ERes2Net系列与ECAPA-TDNN深度对比

在语音技术快速发展的今天,**3D-Speaker**作为一个开源的多模态说话人验证、识别和分离工具包,凭借其先进的**说话人识别模型**和**说话人验证算法**,已经成为语音处理领域的重要工具。本文将深度解析3D-Speaker中的三大核心模型:CAM++、ERes2Net系列和ECAPA-TDNN,帮助您全面了解这些**说话人嵌入模型**的技术特点和性能差异。 ## 🏆 模型性能基准对比

gitblog_00785的博客 1602

【箱子之字形摆放】python实现-附ChatGPT解析

箱子之形摆放有一批箱子(形式为宁符串,设为str) ,要求将这批箱子按以之形的顺序摆放在宽度为n的空地,请输出箱子的摆放结果。例如:箱子为ABCDEFG,空地宽度为3,摆放结果如图:则输出结果为:AFGBECD输入一行字符串,通过空格分制,前面部分为字母或数字组成的字符串str,表示;后面部分为一个数字n,表示。ABCDEFG 3箱子摆放结果,如题目示例所示AFGBECD。

sinat_29950703的博客 370

InceptionV4,Inception-ResNet-V2,Inception-ResNet-V1(TensorFlow-2.6.0实现结构)

文章目录1.InceptionV4结构(1)整体网络结构(2)主干网络结构(Stem)(3)Inception模块(4)降采样模块2.InceptionV4整体讲解3.Inception-ResNet-V1结构(1)整体网络结构(2)主干网络(Stem)(3)Inception-ResNet-V1模块(4)降采样模块4.10.inception-ResNet-V2(1)整体网络结构(2)主干网络(Stem)(3)inception-ResNet-V2模块(4)降采样模块5.单模型,单帧和多帧的预测结果对比(

Keep_Trying_Go的博客 3416

基于深度学习的人脸识别考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

基于深度学习的口罩人脸识别的考勤管理系统,采用YOLOv11和Dlib算法实现人脸识别和考勤签到,前台人脸识别和签到系统 + 后台人脸和考勤管理系统,全网独发

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 1820

YOLOv9分割改进 ,YOLOv9分割改进主干网络为华为EfficientNet,助力涨点

EfficientNet论文中研究了卷积网络的缩放和,并证明对深度,宽度和分辨率复合缩放的重要性,因此精度和效率更好。为了阐述相关的原理,我们提出了简单有效的复合缩放方法,使得模型缩放具有一定设计准则,同时兼顾了模型的效率。我下文将 YOLOv9 分割模型改进主干网络为 EfficientNet 融合网络结构。论文地址代码地址下文都是手把手教程,跟着操作即可添加成功把环境配置好,数据集处理好,训练基本能成功,创作不易,请帮忙点一个爱心,关注我,带你不挂科!

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 937

深度学习 Day22——J2ResNet50V2算法实战与解析

关键字:ResnetV2, pytorch实现Resnet50V2算法

LittleRuby的博客 1582

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

使用TensorFlow-2.6.0实现Inception-ResNet-V2网络结构

1.输出结果 2.InceptionV4网络结构细节 https://mydreamambitious.blog.youkuaiyun.com/article/details/124414800 3.代码复现 import os import keras import numpy as np import tensorflow as tf from tensorflow.keras import models from tensorflow.keras import layers from tensorfl

Keep_Trying_Go的博客 1130

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

使用TensorFlow-2.6.0实现Inception-ResNet-V1网络结构

文章目录1.输出结果2.InceptionV4网络结构细节3.代码复现 1.输出结果 2.InceptionV4网络结构细节 https://mydreamambitious.blog.youkuaiyun.com/article/details/124414800 3.代码复现 import os import keras import numpy as np import tensorflow as tf from tensorflow.keras import models from tensorflow

Keep_Trying_Go的博客 721

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

tensorflow2制作Resnet残差网络

使用tensorflow2复现 Resnet v1&v2 关于resnet的原理、解析参考论文以及网络博客, 这里就不再复述了, 我主要是看其他框架版本的resnet进行理解, 毕竟文字描述不清楚, 细节都在代码中体现 导入相应的包 这里使用的tensorflow2 import tensorflow as tf from tensorflow import keras from tens...

rainweic的博客 3118

ResNet_V1和ResNet_V2

残差网络的V1和V2的论文我都看了,但总感觉还是要结合代码才能真正了解内部网络结构,所以又跑去看了下tensorflow的resnet源码,总结出下面四种module。 希望对大家理解网络结构和看代码的过程有所帮助。 另外需要注意的是,所有类型的resnet_X,都是由5个stage组成的,第一个stage只有一个stride=2的卷积,剩下的四个stage都是由特定module个数堆叠而...

hukongtao1994的博客 2413

第J2周:ResNet50V2算法实现01(Tensorflow硬编码版)

使用tensorflow实现ResNetV50V2的网络结构。本次根据第一层的细节手动硬编码,没有任何的优化,只为了更好的理解细节。结果不是很理想,网络结构应该还有瑕疵。后续优化代码解决拟合问题。

差点就差一点点的专栏 638

inception v4 官方实现_【深度学习系列】用Tensorflow实现GoogLeNet InceptionV2/V3/V4

上一篇文章我们引出了GoogLeNet InceptionV1的网络结构,这篇文章中我们会详细讲到Inception V2/V3/V4的发展历程以及它们的网络结构和亮点。GoogLeNet Inception V2使用较大的学习率而不用特别关心诸如梯度爆炸或消失等优化问题;降低了模型效果对初始权重的依赖;可以加速收敛,一定程度上可以不使用Dropout这种降低收敛速度的方法,但却起到了正则化作用提...

weixin_39775872的博客 495

inception v4 官方实现_Inception v4与Inception-Resnet v1/v2

介绍Inception系列模型设计的核心思想讲至Inception v3基本已经尽了。但2015年Resnet的提出及其在ILSVRC 2015的成功使得Google team开始重新评估CNN深度模型的设计。他们自然不肯屈服于Resnet的强大,同行相轻,古今中外皆然,Googlers们也不能免。他们试着将Residual learning的思想应用在inception网络中,搞出了性能不错的I...

weixin_39857174的博客 351

读tensorflow实战之ResNet_V2

1.使用collections.namedtuple设计ResNet基本Block模块组 注:collections.namedtuple,tuple和list类型类似,tuple中的元素不可以更改,tuple元组的item只能通过index访问,collections模块的namedtuple子类不仅可以使用item的index访问item,还可以通过item的name进行访问。 c

cs1612900的博客 1212

【Tensorflow slim 实战】写Inception-V4 Inception-ResNet-v2结构

inception的paper地址:https://arxiv.org/pdf/1602.07261.pdf Inception-V4 Inception-ResNet-v2结构结构图如下: 实现如下 # -*- coding:utf-8 -*- import tensorflow as tf import tensorflow.contrib.slim as slim #v4.d

zj360202的专栏 5520
上一篇: GoogleInceptionNet(V3)简介以及Tensorflow实现
下一篇: Tensorflow:NotFoundError (see above for traceback): Key style_weight/Variable not found in checkpoin
大鲨鱼冲鸭
博客等级 码龄9年 249粉丝 185原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值