精华内容
下载资源
问答
  • 战略决定结构是什么意思?

    万次阅读 2017-07-10 11:03:59
    战略决定结构是一个业务原则,它规定组织的办事处、部门、团队、过程和技术是为了实现公司的战略而设计的。这个似乎理所当然,但是实际上相反情况屡有发生。例如,技术部门可能要为技术实现制定战略,仅仅是因为这...
    mirror-mirror-3792-173.jpg
    
    战略决定结构是一个业务原则,它规定组织的办事处、部门、团队、过程和技术是为了实现公司的战略而设计的。这个似乎理所当然,但是实际上相反情况屡有发生。例如,技术部门可能要为技术实现制定战略,仅仅是因为这(技术)是技术部门所做的事情。同样,在产品层面,如果一个公司有一个制造牙刷的部门,那么这个部门将倾向于去制定更好或更有利可图的牙刷的战略,而不管这是否符合公司整体战略。
    战略决定结构的原则通常是通过自上而下的战略规划和组织结构、过程和技术的 管理来实现的。
    概述:战略决定结构
    分类业务策略
    定义一个组织的办事处、部门、团队、过程和技术是为了实现公司的战略而设计而不是相反的原则。
    实现方法

    战略计划
    公司治理
    IT 治理
    企业架构
    目标设定
    绩效管理
    相关概念功能决定形式

    原文链接: What is Structure Follows Strategy?,发布日期:2016 年 6 月 8 日。
    作者简介
    John Spacey
    John Spacey
    John Spacey 是一名工作在东京的加拿大籍企业级架构师。John Spacey 拥有近 20 年银行和电信领域经验,涉及开发、信息安全、编程管理、策划、产品管理、IT 治理以及运营团队管理。
    展开全文
  • 《MySQL 性能优化》之理解 MySQL 体系结构

    万次阅读 多人点赞 2020-02-10 10:40:03
    本文介绍 MySQL 的体系结构,包括物理结构、逻辑结构以及插件式存储引擎。

    作为专栏文章《MySQL 性能优化》的第一篇,本文介绍 MySQL 的服务器体系结构,包括物理结构、逻辑结构以及插件式存储引擎。

    实例和数据库

    我们通常所说的 MySQL 数据库服务器由一个实例(instance)以及一个数据库(database)组成。实例包括一组后台进程/线程和许多内存结构,用于管理数据库;数据库由一组磁盘文件组成,用于存储数据和日志等信息。MySQL 使用典型的客户端/服务器(Client/Server)结构,下图显示了一个简单的 MySQL 体系结构:

    mysql
    客户端通过通过实例中的后台进程访问 MySQL 数据库。MySQL 采用单进程多线程架构,也就是说一个 MySQL 实例在操作系统中就是一个进程(mysqld)。在 Linux 系统中使用ps命令进行查看:

    [root@sqlhost ~]# ps -ef|grep mysql|grep -v grep
    mysql     7898     1  1 Feb03 ?        00:12:12 /usr/sbin/mysqld
    

    严格来说,一个 MySQL 实例管理的是多个数据库(也叫模式,Schema)包括系统数据库 mysql、information_schema、performance_schema、sys 以及用户创建的数据库等。使用SHOW DATABASES或者SHOW SCHEMAS命令查看当前实例中的数据库:

    mysql> show databases;
    +--------------------+
    | Database           |
    +--------------------+
    | information_schema |
    | mydb               |
    | mysql              |
    | performance_schema |
    | sys                |
    +--------------------+
    5 rows in set (0.14 sec)
    

    数据库就像是一个容器,存储了各种对象。例如,数据表(Table)、视图(View)、存储过程(Stored Procedure)以及触发器(Trigger)等。其中,表是存储数据的主要对象。它们之间的关系如下图所示:

    mysql database

    MySQL 物理结构

    MySQL 的物理结构主要包括两个目录:软件的安装目录和数据目录,以及配置文件和日志文件等。

    mysql

    📝不同平台、不同安装方式(源码安装、二进制解压)的目录结构有所不同,具体可以参考 MySQL 官方文档

    安装目录

    安装目录(Base Directory)是 MySQL 服务器的安装路径,Linux 上使用 RPM 包安装的默认位置为 /usr/。安装目录中主要包含以下内容:

    文件或目录描述
    bin/mysql 客户端和实用程序目录
    sbin/mysqld 服务器程序目录
    share/man/Unix 帮助手册页目录
    include/mysql/头文件目录
    lib/mysql/库文件目录
    share/mysql/各种字符集、语言相关的错误信息目录

    我们可以使用下面的命令查看安装目录:

    mysql> show global variables like "%basedir%";
    +---------------+-------+
    | Variable_name | Value |
    +---------------+-------+
    | basedir       | /usr/ |
    +---------------+-------+
    1 row in set (0.00 sec)
    

    数据目录

    数据目录(Data Directory)是 MySQL 存储数据库文件的位置,Linux 上使用 RPM 包安装的默认位置为 /var/lib/mysql/。数据目录中主要包含以下内容:

    文件或目录描述
    #innodb_temp/InnoDB 会话临时表空间目录
    mysql/系统数据库 mysql 文件目录
    performance_schema/性能数据库 performance_schema 文件目录
    sys/sys 数据库文件目录
    其他子目录每个数据库对应一个文件目录,存储该数据库中的文件
    auto.cnf当前服务器实例的 UUID,用于主从复制
    binlog.*二进制日志 binary log 相关文件
    *.pemSSL 连接相关的证书和密钥文件
    ib_buffer_pool缓冲区 buffer pool 中数据页的页号转储文件
    ibdata1InnoDB 表空间文件
    ib_logfile0
    ib_logfile1
    InnoDB 事务日志(REDO)文件
    ibtmp1InnoDB 临时表空间文件
    mysql.ibd系统数据库 mysql 数据文件
    mysql.sockUnix 套接字文件
    undo_001
    undo_002
    InnoDB UNDO 表空间文件

    我们可以使用以下命令查看数据目录:

    mysql> show global variables like "%datadir%";
    +---------------+-----------------+
    | Variable_name | Value           |
    +---------------+-----------------+
    | datadir       | /var/lib/mysql/ |
    +---------------+-----------------+
    1 row in set (0.01 sec)
    

    配置文件

    MySQL 服务器进程和各种工具程序启动时,需要通过配置文件(my.cnf 或者 my.ini)读取各种参数。Linux 上使用 RPM 包安装的默认配置文件为 /etc/my.cnf,可以使用mysqld --verbose --help查看读取配置文件的顺序:

    [root@sqlhost ~]# mysqld --verbose --help | grep -A 1 'Default options'
    Default options are read from the following files in the given order:
    /etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
    

    服务器运行使用的所有配置选项都可以使用SHOW VARIABLES命令查看,例如以下命令可以查看 InnoDB 缓冲池相关的配置:

    mysql> show variables like '%buffer_pool%';
    +-------------------------------------+----------------+
    | Variable_name                       | Value          |
    +-------------------------------------+----------------+
    | innodb_buffer_pool_chunk_size       | 8388608        |
    | innodb_buffer_pool_dump_at_shutdown | ON             |
    | innodb_buffer_pool_dump_now         | OFF            |
    | innodb_buffer_pool_dump_pct         | 25             |
    | innodb_buffer_pool_filename         | ib_buffer_pool |
    | innodb_buffer_pool_in_core_file     | ON             |
    | innodb_buffer_pool_instances        | 1              |
    | innodb_buffer_pool_load_abort       | OFF            |
    | innodb_buffer_pool_load_at_startup  | ON             |
    | innodb_buffer_pool_load_now         | OFF            |
    | innodb_buffer_pool_size             | 8388608        |
    +-------------------------------------+----------------+
    11 rows in set (0.00 sec)
    

    除此之外,MySQL 还使用一些其他的文件:

    • 错误日志文件,例如 /var/log/mysqld.log;
    • 慢查询日志文件,例如 /var/lib/mysql/HOSTNAME-slow.log;
    • 服务器进程 PID 文件,例如 /var/run/mysqld/mysqld.pid;

    MySQL 逻辑结构

    MySQL 使用典型的客户端/服务器(Client/Server)结构,逻辑结构图如下所示:

    mysql logical
    MySQL 体系结构大体可以分为三层:客户端、服务器层以及存储引擎层。其中,服务器层又包括了连接管理、查询缓存 、SQL 接口、解析器、优化器、缓冲与缓存以及各种管理工具与服务等。

    具体来说,每个组件的作用如下:

    • 客户端,连接 MySQL 服务器的各种工具和应用程序。例如 mysql 命令行工具、mysqladmin 以及各种驱动程序等。
    • 连接管理,负责监听和管理客户端的连接以及线程处理等。每一个连接到 MySQL 服务器的请求都会被分配一个连接线程。连接线程负责与客户端的通信,接受客户端发送的命令并且返回服务器处理的结果。
    • 查询缓存 ,用于将执行过的 SELECT 语句和结果缓存在内存中。每次执行查询之前判断是否命中缓存,如果命中直接返回缓存的结果。缓存命中需要满足许多条件,SQL 语句完全相同,上下文环境相同等。实际上除非是只读应用,查询缓存的失效频率非常高,任何对表的修改都会导致缓存失效;因此,查询缓存在 MySQL 8.0 中已经被删除。
    • SQL 接口,接收客户端发送的各种 DML和 DDL 命令,并且返回用户查询的结果。另外还包括所有的内置函数(日期、时间、数学以及加密函数)和跨存储引擎的功能,例如存储过程、触发器、视图等。
    • 解析器,对 SQL 语句进行解析,例如语义和语法的分析和检查,以及对象访问权限检查等。
    • 优化器,利用数据库的统计信息决定 SQL 语句的最佳执行方式。使用索引还是全表扫描的方式访问单个表,多表连接的实现方式等。优化器是决定查询性能的关键组件,而数据库的统计信息是优化器判断的基础。
    • 缓存与缓冲,由一系列缓存组成的,例如数据缓存、索引缓存以及对象权限缓存等。对于已经访问过的磁盘数据,在缓冲区中进行缓存;下次访问时可以直接读取内存中的数据,从而减少磁盘 IO。
    • 存储引擎,存储引擎是对底层物理数据执行实际操作的组件,为服务器层提供各种操作数据的 API。MySQL 支持插件式的存储引擎,包括 InnoDB、MyISAM、Memory 等。
    • 管理工具,MySQL 提供的系统管理和控制工具,例如备份与恢复、复制、集群等。

    我们使用 mysql 客户端工具连接到 MySQL 服务器:

    [root@sqlhost ~]# mysql -h 192.168.56.104 -u root -p
    Enter password: 
    Welcome to the MySQL monitor.  Commands end with ; or \g.
    Your MySQL connection id is 18
    Server version: 8.0.19 MySQL Community Server - GPL
    
    Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
    
    Oracle is a registered trademark of Oracle Corporation and/or its
    affiliates. Other names may be trademarks of their respective
    owners.
    
    Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
    
    mysql> 
    

    以上方式是通过 TCP/IP 网络协议连接到 MySQL 服务器,需要提供服务器的 IP、端口以及用户名和密码等信息。如果提供的信息不正确,将会返回错误消息。另外,我们也可以通过命名管道或者 UNIX 套接字进行连接。

    连接成功之后就可以执行各种语句和命令,我们以一个查询语句为例:

    SEELCT * FROM employees;
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SEELCT * FROM employees' at line 1
    

    以上语句通过 SQL 查询接口提交给服务器的处理线程,解析器进行语法检查时发现 SELECT 写成了 SEELCT,提示的是语法错误。示例表来自《SQL 入门教程》示例数据库

    如果语句没有问题,通过解析器之后生成解析树,然后发送给优化器;优化器判断是否进行查询重写,并且根据统计信息决定访问表的方式和顺序等。我们可以通过 EXPLAIN 命名了解优化器选择的执行计划:

    mysql> EXPLAIN SELECT * FROM employees;
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    | id | select_type | table     | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    |  1 | SIMPLE      | employees | NULL       | ALL  | NULL          | NULL | NULL    | NULL |  107 |   100.00 | NULL  |
    +----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
    1 row in set, 1 warning (0.00 sec)
    

    这里我们查询的是整个表的数据,因此 MySQL 采用全表扫描的方式(type = ALL)获取数据。关于执行计划的解释,可以参考这篇文章

    最后,由存储引擎获取表中的数据;如果数据已经被缓存,可以直接从缓冲区获取。

    MySQL 存储引擎

    插件式存储引擎是 MySQL 的一大特点体系结构,每个存储引擎都提供了各自的功能,用户可以根据业务或者应用场景为数据表选择不同的存储引擎。也就是说,存储引擎的设置是在表级别的;因此也被称为表类型(table type)。

    📝从 MySQL 5.5 之后,默认的存储引擎是 InnoDB。InnoDB 是一个通用的存储引擎,除非有特殊需求,推荐使用 InnoDB。

    MySQL 插件式存储引擎结构允许在 MySQL 服务器运行时装载和卸载一个存储引擎,使用SHOW ENGINES语句可以查看当前服务器支持的存储引擎:

    mysql> SHOW ENGINES;
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    | FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
    | MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
    | InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
    | PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
    | MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
    | MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
    | BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
    | CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
    | ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
    +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
    9 rows in set (0.00 sec)
    

    其中,Support 列显示了是否支持该存储引擎以及默认的存储引擎。MySQL 8.0 支持的存储引擎如下:

    • InnoDB:默认的存储引擎。InnoDB 是一个事务安全(ACID 兼容)的存储引擎,支持事务的提交、回滚以及故障恢复功能。InnoDB 行级锁(无需升级到更高粒度的锁)以及类似 Oracle 的一致性非锁定读功能能够增加多用户并发性和性能。InnoDB 使用聚集索引存储用户数据,减少了常见的基于主键查询时的 I/O 操作。为了维护数据完整性,InnoDB 还支持 FOREIGN KEY 参照完整性约束。
    • MyISAM:这种类型的表占用很少的磁盘空间。表级锁限制了它的并发读/写性能,因此通常用于只读或者以读为主的 Web 应用和数据仓库。
    • Memory:将所有数据存储在 RAM 中,用于需要快速查找的非关键数据。Memory 之前被称为 HEAP 存储引擎。它的使用场景越来越少;InnoDB 中的 buffer pool 内存区提供了将大部分或全部数据保留在内存中的一个通用持久性方法,NDBCLUSTER 为海量分布式数据集提供了快速的键-值查找。
    • CSV:这种类型的表实际上就是逗号分隔符文本文件。CSV 表可以导入或导出 CSV 格式的数据,用于脚本和应用程序之间的数据交换。由于 CSV 表不支持索引,通常可以在日常操作中将数据存储在 InnoDB 表中,只在导入或导出阶段使用 CSV 表。
    • Archive:这种压缩格式的无索引表主要用于存储和检索大量的很少使用的历史、归档或者安全审计数据。
    • Blackhole:Blackhole 存储引擎不会实际存储数据,类似于 Unix 中的 /dev/null 设备。查询永远不会返回数据。这种表可以用于特定的复制环境,DML 语句需要发送到从服务器,但是主服务器自身不保存数据。
    • NDB (也就是 NDBCLUSTER):这种集群数据库引擎主要用于对服务可用性要求极高的场景。
    • Merge:支持 MySQL DBA 或者开发人员将许多结构一致的 MyISAM 表作为一个逻辑对象使用。可以用于 VLDB 环境,例如数据仓库。
    • Federated:提供访问远程数据库的功能,可以将多个 MySQL 物理服务器组合成一个逻辑数据库。非常适合分布式环境或者数据集市。
    • Example:这是 MySQL 源代码中的一个示例存储引擎,用于演示如何编写新的存储引擎。它主要面向开发者,这种类型的表无法存储数据,也不会返回任何结果。

    存储引擎的设置不在服务器级别,也不在数据库(模式)级别;用户可以为不同的表指定不同的存储引擎。例如,一个应用程序大多数的表使用 InnoDB 存储引擎;同时创建一个 CSV 表,用于将数据导出到电子表格文件中;另外创建一些 MEMORY 表作为临时存储区。

    下表描述了 MySQL 中常见存储引擎支持的功能特性。

    功能特性MyISAMMemoryInnoDBArchiveNDB
    B-树索引✔️✔️✔️
    备份/时间点恢复(1)✔️✔️✔️✔️✔️
    集群数据库✔️
    聚集索引✔️
    压缩数据✔️ (2)✔️✔️
    数据缓存N/A✔️✔️
    加密数据✔️ (3)✔️ (3)✔️ (4)✔️ (3)✔️ (3)
    外键✔️✔️ (5)
    全文搜索索✔️✔️ (6)
    空间数据类型✔️✔️✔️✔️
    空间数据索引✔️✔️ (7)
    哈希索引✔️❌ (8)✔️
    索引缓存✔️N/A✔️✔️
    锁的粒度表级表级行级行级行级
    MVCC✔️
    复制 (1)✔️有限(9)✔️✔️✔️
    存储限制256TBRAM64TB384EB
    T-树索引✔️
    数据库事务✔️✔️
    更新数据字典统计信✔️✔️✔️✔️✔️

    注释:

    1. 在服务器层实现,而不是存储引擎层。
    2. 只有使用行压缩格式才支持 MyISAM 压缩表。使用行压缩格式的 MyISAM 表属于只读表。
    3. 在服务器层通过加密函数实现。
    4. 在服务器层通过加密函数实现;MySQL 5.7 开始支持表空间静态数据(data-at-rest)加密。
    5. MySQL Cluster NDB 7.3 开始支持外键约束。
    6. MySQL 5.6 开始支持 InnoDB 的 FULLTEXT 索引。
    7. MySQL 5.7 开始支持 InnoDB 的空间数据索引。
    8. InnoDB 内部使用哈希索引实现自适应哈希索引(Adaptive Hash Index)特性。
    9. 内存表的复制

    下一篇我们来具体谈谈 InnoDB 存储引擎的体系结构。欢迎关注❤️、点赞👍、转发📣!

    展开全文
  • 理解ResNet结构与TensorFlow代码分析

    万次阅读 多人点赞 2017-07-21 01:18:48
    除了__init__的构造函数外,类下还定义了12个函数,把残差模型构建中用到功能模块化了,12个函数貌似很多的样子,但是都是一些很简单的功能,甚至有一些只有一行代码**(比如可以看下65行)**,之所有单拉出来是...

    该博客主要以TensorFlow提供的ResNet代码为主,但是我并不想把它称之为代码解析,因为代码和方法,实践和理论总是缺一不可。
    github地址,其中:

    resnet_model.py为残差网络模型的实现,包括残差模块,正则化,批次归一化,优化策略等等;

    resnet_main.py为主函数,主要定义了测试、训练、总结、打印的代码和一些参数。

    cifar_input.py为数据准备函数,主要把cifar提供的bin数据解码为图片tensor,并组合batch

    为了保证行号的一致性,下面的内容如果涉及到行号的话,均以github上的为准,同时为了节省篇幅,下面如果出现代码将去掉注释,建议在阅读本博客是同时打开github网址,因为下面的内容并没有多少代码。

    既然是在说残差模型,那么当然就要说resnet_model.py这个代码,整个代码就是在声明一个类——ResNet:

    第38行到55行:

    class ResNet(object):
    
      def __init__(self, hps, images, labels, mode):
        self.hps = hps
        self._images = images
        self.labels = labels
        self.mode = mode
    
        self._extra_train_ops = []
    

    上面是构造函数在初始化对象时的四个参数,实例化对象时也就完成初始化,参数赋值给类中的数据成员,其中self._images为私有成员。此外又定义了一个新的私有数组成员:self._extra_train_ops用来执行滑动平均操作。

    构造函数的参数有hpsimageslabelsmode

    hps在resnet_main.py在初始化的:

      hps = resnet_model.HParams(batch_size=batch_size,
                                 num_classes=num_classes,
                                 min_lrn_rate=0.0001,
                                 lrn_rate=0.1,
                                 num_residual_units=5,
                                 use_bottleneck=False,
                                 weight_decay_rate=0.0002,
                                 relu_leakiness=0.1,
                                 optimizer='mom')
    

    其中的HParams字典在resnet_mode.py的32行定义,变量的意义分别是:

    HParams = namedtuple('HParams',
                         '一个batch内的图片个数', 
                         '分类任务数目', 
                         '最小的学习率', 
                         '学习率', 
                         '一个残差组内残差单元数量', 
                         '是否使用bottleneck',  
                         'relu泄漏',
                         '优化策略')
                                                                                                               
    

    imageslabels是cifar_input返回回来的值(115行),注意这里的值已经是batch了,毕竟image和label都加了复数。
    mode决定是训练还是测试,它在resnet_main.py中定义(29行)并初始化(206行)。

    除了__init__的构造函数外,类下还定义了12个函数,把残差模型构建中用到功能模块化了,12个函数貌似很多的样子,但是都是一些很简单的功能,甚至有一些只有一行代码**(比如可以看下65行)**,之所有单拉出来是因为功能是独立的,或者反复出现,TensorFlow提供的代码还是非常规范和正规的!

    按照自上而下的顺序依次是:

    build_graph(self):
    构建TensorFlow的graph

    _stride_arr(self, stride):
    定义卷积操作中的步长

    _build_model(self):
    构建残差模型

    _build_train_op(self):
    构建训练优化策略

    _batch_norm(self, name, x):
    批次归一化操作

    _residual(self, x, in_filter, out_filter, stride,activate_before_residual=False):
    不带bottleneck的残差模块,或者也可以叫做残差单元,总之注意不是残差组

    _bottleneck_residual(self, x, in_filter, out_filter, stride,activate_before_residual=False):
    带bottleneck的残差模块

    decay(self):
    L2正则化

    _conv(self, name, x, filter_size, in_filters, out_filters, strides):
    卷积操作

    _relu(self, x, leakiness=0.0):
    激活操作

    _fully_connected(self, x, out_dim):
    全链接

    _global_avg_pool(self, x, out_dim):
    全局池化

    注意:
    1.在代码里这12个函数是并列的,但是讲道理的话它们并不平级(有一些函数在调用另一些)。比如卷积,激活,步长设置之类肯定是被调用的。而有三个函数比较重要,分别是:build_graph(self):_build_model(self):_build_train_op(self):。第一个是由于TensorFlow就是在维护一张图,所有的数据以tensor的形式在图上流动;第二个决定了残差模型;第三个决定了优化策略。

    2.个人认为_stride_arr(self, stride):函数不应该出现在该位置(65行),如果把它放后面,前三个函数就分别是构件图,构建模型,构建优化策略。这样逻辑上就很清晰。

    3.这套代码没有常规的池化操作,一方面是因为RenNet本身就用步长为2的卷积取代池化,但是在进入残差组之前还是应该有一个常规池化的,只是这个代码没有。

    4.这个代码有一个很不讲理的地方,第一层卷积用了33的核,不是77,也不是3个3*3(73行)

    5.这套代码使用的是bin封装的cifar数据,所以要想改成自己的数据集需要把input的部分换掉。

    6.这套代码没有设终止条件,会一直训练/测试,直到手动停止。

    到这里代码的结构起码说清楚了,带着上面的注意事项,我们就可以看代码。
    图构建没什么好说的,我们直接进入_build_model(self)好了(69行):
    71-73行定义残差网络的第一个卷积层

    75-82行使用哪种残差单元(带bottleneck还是不带bottleneck),并分别对两种情况定义了残差组中的特征通道数。

    90-109行构建了三个残差组,每个组内有4个单元,这个数量是由hps参数决定的。

    111-124行是残差组结束后模型剩余的部分(池化+全连接+softmax+loss function+L2),这已经和残差网络的特性没什么关系了,每个卷积神经网络差不多都是这样子。

    126行将损失函数计算出的cost加入summary。

    所以残差模型最关键的东西,最能表征残差特性的东西,都在90-109行,当然这十几行里是调用了其他函数的。这个本文的最后后再说,下面为保证代码部分的连贯性,先往下说_build_train_op(self)(128行):

    130-131行获取学习率并加入到summary。

    133-134行根据cost与权系数计算梯度。

    136-136行选择使用随机梯度下降还是带动量梯度下降。

    141-143行执行梯度下降优化。

    145行将梯度下降优化操作与bn操作合并(带op的变量是一种操作)。

    146行得到最后的结果,在这里定义了一个新的数组成员:self.train_op,而这个变量最终被用到了resnet_main.py中(113行):

    while not mon_sess.should_stop():
          mon_sess.run(model.train_op)
    

    如果没有达到终止条件的话,代码将一直执行优化操作,model是类实例化出来的一个对象,在resnet_main.py中的model和在resnet_model.py中的self是一个东西。

    到这里重要的代码就都说完了,最后说回残差网络最核心的东西:两种残差单元。
    残差网络的结构非常简单,就是不断的通过一组一组的残差组链接,这是一个Resnet50的结构图,不同的网络结构在不同的组之间会有不同数目的残差模块,如下图:
    这里写图片描述
    举个例子,比如resnet50中,2-5组中分别有3,4,6,3个残差模块。

    朴素残差模块(不带bottleneck):
    这里写图片描述
    左侧为正常了两个卷积层,而右侧在两个卷积层前后做了直连,这个直连解释残差,左侧的输出为H(x)=F(x),而加入直连后的H(x)=F(x)+x,一个很简单的改进,但是取得了非常优异的效果。
    至于为什么直连要跨越两个卷积层,而不是一个?这个是实验验证的结果,在一个卷积层上加直连性能并没有太大提升。

    bottleneck残差模块:
    bottleneck残差模块让残差网络可以向更深的方向上走,原因就是因为同一通道数的情况下,bottleneck残差模块要比朴素残差模块节省大量的参数,一个单元内的参数少了,对应的就可以做出更深的结构。
    这里写图片描述
    上面这样图能够说明二者的区别,左侧的通道数是64(它常出现在50层内的残差结构中),右侧的通道数是256(常出现在50层以上的残差结构中),从右面的图可以看到,bottleneck残差模块将两个33换成了11,33,11的形式,第一个11用来降通道,33用来在降通道的特征上卷积,第二个11用于升通道。而参数的减少就是因为在第一个11将通道数降了下来。我们可以举一个例子验证一下:

    假设朴素残差模块与bottleneck残差模块通道数都是256,那么:

    朴素残差模块的参数个数:
    33256256+33256256 = 10616832
    bottleneck残差模块的参数个数:
    1125664+336464+1164*256 = 69632
    可以看到,参数的减少非常明显。

    再回到上面的图:
    这里写图片描述

    Resnet34余Resnet50层每一组中的模块个数并没有变化,层数的上升是因为以前两个卷积层变成了3个,前者的参数为3.6亿,后者参数为3.8亿。这样来看的话参数为什么反而多了?这是因为组内的通道数发生了变化,前者各组通道数为[64,128,256,512],而后者的各组通道数为[256,512,1024,2048]。这也是残差网络在设计时的一个特点,使用bottleneck残差模块时,组内的通道数要明显高于使用朴素残差模块。

    TensorFlow提供的代码也是这样,可以看下77行:

    if self.hps.use_bottleneck:
          res_func = self._bottleneck_residual
          filters = [16, 64, 128, 256]
        else:
          res_func = self._residual
          filters = [16, 16, 32, 64]
    

    通过上面的理论说明,就可以再回头看下代码中的:_residual()函数和_bottleneck_residual()函数了。

    展开全文
  • UC3846的结构功能及引脚功能介绍

    千次阅读 2019-09-18 20:44:23
    其内部结构框图如图l所示。 UC3846N有16个引脚。各引脚的功能如下: 脚l:限流电平设置端; 脚2:基准电压输出端; 脚3:电流检测放大器的反相输入端; 脚4:电流检测放大器的同相输人端; 脚5:...

      UC3846采用标准双列直插式16引脚(DIP—16)封装。其内部结构框图如图l所示。


      UC3846N有16个引脚。各引脚的功能如下:
      脚l:限流电平设置端;
      脚2:基准电压输出端;
      脚3:电流检测放大器的反相输入端;
      脚4:电流检测放大器的同相输人端;
      脚5:误差放大器的同相输入端;
      脚6:误差放大器的反相输入端;
      脚7:误差放大器反馈补偿;
      脚8:振荡器的外接电容端;
      脚9:振荡器的外接电阻端;
      脚10:同步端;
      脚Il:PWM脉冲的A输出端;
      脚12:地;
      脚13:集电极电源端;
      脚14:PwM脉冲的B输出端;
      脚15:控制电源输入端;
      脚16:关闭端。
      UC3846的振荡器频率由外接阻容Rt、CT决定(9脚、8脚)。CT的充电电流由恒流源所提供。振荡器的工作频率可按下式近似计算:
      l UC3846的结构功能及引脚功能介绍
      式中,Rt一般在1~500 kΩ之间。为了减小噪声对晶振电容的影响,CT应选择大于100 pF的电容。为了防止两路开关管的互通,还要设定两路输出都关断的“死区时间”。CT上的电压为一个锯齿波.其下降时间即为死区时间,其死区可设置时间为:
      l UC3846的结构功能及引脚功能介绍
      式中,CT增大,锯齿波下降时间(即死区时间)随着增大。

    转载于:https://my.oschina.net/u/3911785/blog/3073701

    展开全文
  • STM32——简述GPIO的功能结构

    千次阅读 2019-05-11 20:11:08
    简述GPIO的功能结构 (1)什么是GPIO GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 (2)基本结构 1....
  • 文章目录Structure and function of the global topsoil microbiome全球表层土微生物组群落结构功能热心肠日报导读摘要正文**图1. 真菌和细菌多样性在纬度上呈现不同模式****图2. ARGs的全球相对丰度可以通过生物...
  • 个人对数据结构理解和总结

    万次阅读 多人点赞 2014-06-03 09:54:34
    个人对数据结构理解和总结  在很多编程人员的潜意识里总是觉得数据结构知识似乎没什么用,因为工作中似乎从来都没有涉及到数据结构的什么内容。我对这样的认识只能报以呵呵~ 也难怪,其实有这些想法的同行在工作...
  • 计算机系统结构里的多级立方体网络怎么理解?一、背景二、先从单级互连网络开始讲起1、互连网络2、那么为什么要进行互连网络的设计呢?3、互连函数3.1 基本的互连网络3.1.1立方体3.1.2PM213.1.3混洗交换四、基本的...
  • 计算机网络体系结构——各层的功能

    万次阅读 多人点赞 2018-07-09 13:18:21
    物理层主要功能:实现比特流的透明传输。基本单位:比特。数据链路层主要功能 :封装成帧 。把帧从原MAC传到目的MAC(相邻节点之间帧的透明传输)差错检测 循环冗余检测法。只检测有没有比特错误,若有则丢弃。网络...
  • 蛋白质结构功能的预测方法总结和资料汇总 “折叠(fold)”的概念 “折叠(fold)”是近年来蛋白质研究中应用较广的一个概念,它是介与二级和三级结构之间的蛋白质结构层次,它描述的是二级结构元素的混合组合方式...
  • 只要三分钟,快速理解计算机网络体系结构

    千次阅读 多人点赞 2018-05-30 19:46:27
    这是对计算机体系结构的一次 overview。 计算机网络课程大学时有系统地学过,但没有太上心,工作发现用的挺多的,比如定位一些网络异常的问题,做网络层面的优化,都需要对计算机网络体系的一些常见协议有所了解。 ...
  • 分布式应用程序结构简单理解

    千次阅读 2007-04-24 00:35:00
    应用程序设计的一个关键要素是系统结构,系统结构决定了应用程序的各个部分如何进行交互,同时也决定了每个部分实现的功能。在这个基于网络的环境中,通常在分布式环境中创建应用程序。实际上,Web系统是很好的...
  • 重温数据结构理解 B 树、B+ 树特点及使用场景

    万次阅读 多人点赞 2018-05-29 00:46:13
    大家好,前面那篇文章《3 分钟理解完全二叉树、平衡二叉树、二叉查找树》中我们了解了几种特殊的二叉树的功能及特点,知道了它们在进行查找数据时可以提高效率,但需要注意的是,这是指在内存中进行查找。...
  • 在学习数据结构类型时,首先遇到的一个难点即是如何理解抽象数据结构类型。通过阅读多个博客,将个人理解总结如下: 如已看过抽象数据类型定义,可直接跳过定义。 抽象数据类似的定义 抽象数据类型(Abstract Data ...
  • GIS基本理论之一:GIS的概念、构成结构功能 1 地理信息系统的概念  地理信息系统(Geographic Information System 简称GIS)是一项以计算机为基础的新兴技术,围绕着这项技术的研究、开发和应用形成了一门交叉...
  • CRM软件系统的结构功能分析

    千次阅读 2005-07-13 19:13:00
    CRM软件系统的结构功能分析(作者:施福莱 王海艳) 集成了CRM管理思想和最新信息技术成果的CRM软件系统,是帮助企业最终实现以客户为中心的管理模式的重要手段。本文首先描述了CRM软件系统的一般模型,然后根据模型,...
  • DRAM内存原理(二)结构功能

    万次阅读 2014-12-08 09:03:22
     通过以上的介绍,我们已经理解的DRAM工作的基本原理,下面让我们了解一下决定RAM技术速度的因素。 究竟是什么决定DRAM速度?SDRAM是多bank结构,芯片组可以保持一部分曾经访问过的Bank的行地址,也就是说...
  • 本文结合JDK1.7和JDK1.8的区别,深入探讨HashMap的结构实现和功能原理,文章末尾附有HashMap的put方法和resize方法的源码解析。简介Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现
  • 网络的分层结构及各层功能

    千次阅读 2015-10-22 09:13:09
     OSI 模型的第三层,其主要功能决定如何将数据从发送方路由到接收方。    网络层通过综合考虑发送优先权、 网络拥塞 程度、服务质量以及可选路由的花费来决定从一个网络中节点A 到另一个网络中节点B ...
  • 数据结构与算法学习笔记

    万次阅读 多人点赞 2018-09-25 13:55:49
    本文是王争老师的《算法与数据结构之美》的学习笔记,详细内容请看王争的专栏。有不懂的地方指出来,我做修改。 数据结构与算法思维导图 数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组...
  • 1…spring batch 的理解—> spring官网 : https://spring.io/projects/spring-batch 目前,Spring Batch是批处理框架界为数不多的优秀框架(Java语言开发) Spring Batch 是一个轻量级的、完善的批处理框架,...
  • 数据结构分别为逻辑结构、(存储)物理结构和数据的运算三个部分。 为什么要学数据结构? 首先,因为数据结构作为计算机专业的专业基础课程,是计算机考研的必考科目之一,如果打算报考计算机专业的研究生,你...
  • 课程笔记2--fMRI数据结构

    万次阅读 2017-01-01 22:49:58
    一、 时间分辨率与空间分布率、结构图像与功能图像时间分辨率(temporal resolution):时间分辨率由扫描一张图片所需的时间决定,事实上扫描一张图片的时间是由一个扫描时的参数TR决定的。他决定了我们区分观察不同...
  • 谈谈三层结构开发的理解

    万次阅读 热门讨论 2006-08-18 22:35:00
    不管怎么样,他们的看法代表了他们对程序的理解,是他们实践经验的总结,是宝贵的。今天,这里我们且不评论他们的见解正确与否,这里我只谈谈我对分层的看法.希望能起到抛砖引玉的作用。二、 三层架构开发简介a) ...
  • 前一段时间学习了STM32,先是用库函数学了一个星期。发现学完之后,一些基本要用的...决定慢慢的回归库函数之前写下自己对STM32一些模块的理解,共勉之。 首先附上GPIO口的内部电路图: 其中蓝色方框部分代表的是GP
  • 由于文章有点多,并且发的文章也不是一个系列一个系列发的,不过我的文章大部分都是围绕着 数据结构 + 算法 + 计算机网络 + 操作系统 + Linux + 数据库 这几个方面发的,为了方便大家阅读,我整理了一波。...
  • 计算机系统结构,组成和实现

    千次阅读 2015-05-17 23:16:58
    计算机系统结构的定义:计算机系统结构是其所处环境中最高层次的概念,是对计算机系统中各个机器之间界面的划分和定义,以及对各级界面上,下的功能进行分配。也称为体系结构。计算机体系结构指的是计算机系统设计的...
  •  物理数据库结构是由构成数据库的操作系统文件所决定,Oracle数据库文件包括:  1.1.数据文件(Data File)  数据文件用来存储数据库中的全部数据,例如数据库表中的数据和索引数据.通常以为*.dbf格式,例如:...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 634,123
精华内容 253,649
关键字:

如何理解结构决定功能