Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >图解一致性哈希算法,看这一篇就够了!

图解一致性哈希算法,看这一篇就够了!

作者头像
架构师精进
发布于 2023-03-23 12:26:23
发布于 2023-03-23 12:26:23
6.3K00
代码可运行
举报
文章被收录于专栏:公众号文章公众号文章
运行总次数:0
代码可运行

近段时间一直在总结分布式系统架构常见的算法。前面我们介绍过布隆过滤器算法。接下来介绍一个非常重要、也非常实用的算法:一致性哈希算法。通过介绍一致性哈希算法的原理并给出了一种实现和实际运用的案例,带大家真正理解一致性哈希算法。

一、背景

在具体介绍一致性哈希算法之前,先问一个问题:为什么需要一致性哈希算法?下面我们通过一个案例来回答这个问题。

假设有这么一种场景:我们有三台缓存服务器分别为:node0、node1、node2,有3000万个缓存数据需要存储在这三台服务器组成的集群中,希望可以将这些数据均匀的缓存到三台机器上,你会想到什么方案呢?

我们可能首先想到的方案是:取模算法hash(key)%N,即:对缓存数据的key进行hash运算后取模,N是机器的数量;运算后的结果映射对应集群中的节点。具体如下图所示:

如上图所示,首先对key进行hash计算后的结果对3取模,得到的结果一定是0、1或者2;然后映射对应的服务器node0、node1、node2,最后直接找对应的服务器存取数据即可。

通过取模算法将每个数据请求都均匀的分散到了三个不同的服务器节点上,看起来很完美!但是,在分布式集群系统的负载均衡实现上,这种模型在集群扩容和收缩时却有一定的局限性:因为在生产环境中根据业务量的大小,调整服务器数量是常有的事,而服务器数量N发生变化后hash(key)%N计算的结果也会随之变化!导致整个集群的缓存数据必须重新计算调整,进而导致大量缓存在同一时间失效,造成缓存的雪崩,最终导致整个缓存系统的不可用,这是不能接受的。为了解决优化上述情况,一致性哈希算法应运而生。

二、一致性哈希简介

有些朋友一听到算法就头大,其实大可不必,一致性哈希算法听起来高大上,其实非常简单。接下来开始介绍什么是一致性哈希算法,它解决了什么问题。

2.1 什么是一致性哈希?

一致性哈希(Consistent Hash)算法是1997年提出,是一种特殊的哈希算法,目的是解决分布式系统的数据分区问题:当分布式集群移除或者添加一个服务器时,必须尽可能小地改变已存在的服务请求与处理请求服务器之间的映射关系。

2.2 一致性哈希主要解决问题

我们知道,传统的按服务器节点数量取模在集群扩容和收缩时存在一定的局限性。而一致性哈希算法正好解决了简单哈希算法在分布式集群中存在的动态伸缩的问题。降低节点上下线的过程中带来的数据迁移成本,同时节点数量的变化与分片原则对于应用系统来说是无感的,使上层应用更专注于领域内逻辑的编写,使得整个系统架构能够动态伸缩,更加灵活方便。

2.3 一致性哈希的使用场景

一致性哈希算法是分布式系统中的重要算法,使用场景也非常广泛。主要是是负载均衡、缓存数据分区等场景。

一致性哈希应该是实现负载均衡的首选算法,它的实现比较灵活,既可以在客户端实现,也可以在中间件上实现,比如日常使用较多的缓存中间件memcached 使用的路由算法用的就是一致性哈希算法。

此外,其它的应用场景还有很多:

  • RPC框架Dubbo用来选择服务提供者
  • 分布式关系数据库分库分表:数据与节点的映射关系
  • LVS负载均衡调度器

三、一致性哈希的原理

2.1 算法原理

前面介绍的取模算法虽然使用简单,但缺陷也很明显,如果服务器中保存有服务请求对应的数据,那么如果重新计算请求的哈希值,会造成缓存的雪崩的问题。这种情况在分布式系统中是非常糟糕的。一个设计良好的分布式系统应该具有良好的单调性,即服务器的添加与移除不会造成大量的哈希重定位,而一致性哈希恰好可以解决这个问题 。

其实,一致性哈希算法本质上也是一种取模算法。只不过前面介绍的取模算法是按服务器数量取模,而一致性哈希算法是对固定值2^32取模,这就使得一致性算法具备良好的单调性:不管集群中有多少个节点,只要key值固定,那所请求的服务器节点也同样是固定的。其算法的工作原理如下:

  1. 一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环,整个哈希空间的取值范围为0~2^32-1;
  2. 计算各服务器节点的哈希值,并映射到哈希环上;
  3. 将服务发来的数据请求使用哈希算法算出对应的哈希值;
  4. 将计算的哈希值映射到哈希环上,同时沿圆环顺时针方向查找,遇到的第一台服务器就是所对应的处理请求服务器。
  5. 当增加或者删除一台服务器时,受影响的数据仅仅是新添加或删除的服务器到其环空间中前一台的服务器(也就是顺着逆时针方向遇到的第一台服务器)之间的数据,其他都不会受到影响。

综上所述,一致性哈希算法对于节点的增减都只需重定位环空间中的一小部分数据,具有较好的容错性和可扩展性 。

2.2 深入剖析

说了那么多,可能你还是云里雾里的,那么接下来我们详细剖析一致性哈希的实现原理。

2.2.1 哈希环

首先,一致性哈希算法将整个哈希值空间映射成一个虚拟的圆环。整个哈希空间的取值范围为0~2^32-1,按顺时针方向开始从0~2^32-1排列,最后的节点2^32-1在0开始位置重合,形成一个虚拟的圆环。如下图所示:

2.2.2 服务器映射到哈希环

接下来,将服务器节点映射到哈希环上对应的位置。我们可以对服务器IP地址进行哈希计算,哈希计算后的结果对2^32取模,结果一定是一个0到2^32-1之间的整数。最后将这个整数映射在哈希环上,整数的值就代表了一个服务器节点的在哈希环上的位置。即:hash(服务器ip)% 2^32。下面我们依次将node0、node1、node2三个缓存服务器映射到哈希环上,如下图所示:

2.2.3 对象key映射到服务器

当服务器接收到数据请求时,首先需要计算请求Key的哈希值;然后将计算的哈希值映射到哈希环上的具体位置;接下来,从这个位置沿着哈希环顺时针查找,遇到的第一个节点就是key对应的节点;最后,将请求发送到具体的服务器节点执行数据操作。

假设我们有“key-01:张三”、“key-02:李四”、“key-03:王五”三条缓存数据。经过哈希算法计算后,映射到哈希环上的位置如下图所示:

如上图所示,通过哈希计算后,key-01顺时针寻找将找到node0,key-02顺时针寻找将找到node1,key-03顺时针寻找将找到node2。最后,请求找到的服务器节点执行具体的业务操作。

以上便是一致性哈希算法的工作原理。

四、服务器扩容&缩容

前面介绍了一致性哈希算法的工作原理,那么,一致性哈希算法如何避免服务器动态伸缩的问题的呢?

4.1 服务器缩容

服务器缩容就是减少集群中服务器节点的数量或是集群中某个节点故障。假设,集群中的某个节点故障,原本映射到该节点的请求,会找到哈希环中的下一个节点,数据也同样被重新分配至下一个节点,其它节点的数据和请求不受任何影响。这样就确保节点发生故障时,集群能保持正常稳定。如下图所示:

如上图所示:节点node2发生故障时,数据key-01和key-02不会受到影响,只有key-03的请求被重定位到node0。在一致性哈希算法中,如果某个节点宕机不可用了,那么受影响的数据仅仅是会寻址到此节点和前一节点之间的数据。其他哈希环上的数据不会受到影响。

4.2 服务器扩容

服务器扩容就是集群中需要增加一个新的数据节点,假设,由于需要缓存的数据量太大,必须对集群进行扩容增加一个新的数据节点。此时,只需要计算新节点的哈希值并将新的节点加入到哈希环中,然后将哈希环中从上一个节点到新节点的数据映射到新的数据节点即可。其他节点数据不受影响,具体如下图所示:

如上图所示,加入新的node3节点后,key-01、key-02不受影响,只有key-03的寻址被重定位到新节点node3,受影响的数据仅仅是会寻址到新节点和前一节点之间的数据。

通过一致性哈希算法,集群扩容或缩容时,只需要重新定位哈希环空间内的一小部分数据。其他数据保持不变。当节点数越多的时候,使用哈希算法时,需要迁移的数据就越多,使用一致哈希时,需要迁移的数据就越少。所以,一致哈希算法具有较好的容错性和可扩展性。

五、数据倾斜与虚拟节点

5.1 什么是数据倾斜?

前面说了一致性哈希算法的原理以及扩容缩容的问题。但是,由于哈希计算的随机性,导致一致性哈希算法存在一个致命问题:数据倾斜,,也就是说大多数访问请求都会集中少量几个节点的情况。特别是节点太少情况下,容易因为节点分布不均匀造成数据访问的冷热不均。这就失去了集群和负载均衡的意义。如下图所示:

如上图所示,key-1、key-2、key-3可能被映射到同一个节点node0上。导致node0负载过大,而node1和node2却很空闲的情况。这有可能导致个别服务器数据和请求压力过大和崩溃,进而引起集群的崩溃。

5.2 如何解决数据倾斜?

为了解决数据倾斜的问题,一致性哈希算法引入了虚拟节点机制,即对每一个物理服务节点映射多个虚拟节点,将这些虚拟节点计算哈希值并映射到哈希环上,当请求找到某个虚拟节点后,将被重新映射到具体的物理节点。虚拟节点越多,哈希环上的节点就越多,数据分布就越均匀,从而避免了数据倾斜的问题。

说起来可能比较复杂,一句话概括起来就是:原有的节点、数据定位的哈希算法不变,只是多了一步虚拟节点到实际节点的映射。具体如下图所示:

如上图所示,我们可以在服务器ip或主机名的后面增加编号来实现,将全部的虚拟节点加入到哈希环中,增加了节点后,数据在哈希环上的分布就相对均匀了。当有访问请求寻址到node0-1这个虚拟节点时,将被重新映射到物理节点node0。

六、一致性Hash算法实现

前面介绍了一致性哈希算法的原理、动态伸缩以及数据倾斜的问题后,下面我们根据上面的讲述,使用Java实现一个简单的一致性哈希算法。

6.1 数据节点

首先定义一个节点类,实现数据节点的功能,具体代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Node {
    private static final int VIRTUAL_NODE_NO_PER_NODE = 200;
    private final String ip;
    private final List<Integer> virtualNodeHashes = new ArrayList<>(VIRTUAL_NODE_NO_PER_NODE);
    private final Map<Object, Object> cacheMap = new HashMap<>();

    public Node(String ip) {
        Objects.requireNonNull(ip);
        this.ip = ip;
        initVirtualNodes();
    }


    private void initVirtualNodes() {
        String virtualNodeKey;
        for (int i = 1; i <= VIRTUAL_NODE_NO_PER_NODE; i++) {
            virtualNodeKey = ip + "#" + i;
            virtualNodeHashes.add(HashUtils.hashcode(virtualNodeKey));
        }
    }

    public void addCacheItem(Object key, Object value) {
        cacheMap.put(key, value);
    }


    public Object getCacheItem(Object key) {
        return cacheMap.get(key);
    }


    public void removeCacheItem(Object key) {
        cacheMap.remove(key);
    }


    public List<Integer> getVirtualNodeHashes() {
        return virtualNodeHashes;
    }

    public String getIp() {
        return ip;
    }
}

6.2 实现一致性哈希算法

接下来实现核心功能:一致性哈希算法,主要使用java的TreeMap类,实现哈希环和哈希查找的功能。具体代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConsistentHash {
    private final TreeMap<Integer, Node> hashRing = new TreeMap<>();

    public List<Node> nodeList = new ArrayList<>();

    /**
     * 增加节点
     * 每增加一个节点,就会在闭环上增加给定虚拟节点
     * 例如虚拟节点数是2,则每调用此方法一次,增加两个虚拟节点,这两个节点指向同一Node
     * @param ip
     */
    public void addNode(String ip) {
        Objects.requireNonNull(ip);
        Node node = new Node(ip);
        nodeList.add(node);
        for (Integer virtualNodeHash : node.getVirtualNodeHashes()) {
            hashRing.put(virtualNodeHash, node);
            System.out.println("虚拟节点[" + node + "] hash:" + virtualNodeHash + ",被添加");
        }
    }

    /**
     * 移除节点
     * @param node
     */
    public void removeNode(Node node){
        nodeList.remove(node);
    }

    /**
     * 获取缓存数据
     * 先找到对应的虚拟节点,然后映射到物理节点
     * @param key
     * @return
     */
    public Object get(Object key) {
        Node node = findMatchNode(key);
        System.out.println("获取到节点:" + node.getIp());
        return node.getCacheItem(key);
    }

    /**
     * 添加缓存
     * 先找到hash环上的节点,然后在对应的节点上添加数据缓存
     * @param key
     * @param value
     */
    public void put(Object key, Object value) {
        Node node = findMatchNode(key);

        node.addCacheItem(key, value);
    }

    /**
     * 删除缓存数据
     */
    public void evict(Object key) {
        findMatchNode(key).removeCacheItem(key);
    }


    /**
     *  获得一个最近的顺时针节点
     * @param key 为给定键取Hash,取得顺时针方向上最近的一个虚拟节点对应的实际节点
     *      * @return 节点对象
     * @return
     */
    private Node findMatchNode(Object key) {
        Map.Entry<Integer, Node> entry = hashRing.ceilingEntry(HashUtils.hashcode(key));
        if (entry == null) {
            entry = hashRing.firstEntry();
        }
        return entry.getValue();
    }
}

如上所示,通过TreeMap的ceilingEntry() 方法,实现顺时针查找下一个的服务器节点的功能。

6.3 哈希计算方法

哈希计算方法比较常见,网上也有很多计算hash 值的函数。示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class HashUtils {

    /**
     * FNV1_32_HASH
     *
     * @param obj
     *         object
     * @return hashcode
     */
    public static int hashcode(Object obj) {
        final int p = 16777619;
        int hash = (int) 2166136261L;
        String str = obj.toString();
        for (int i = 0; i < str.length(); i++)
            hash = (hash ^ str.charAt(i)) * p;
        hash += hash << 13;
        hash ^= hash >> 7;
        hash += hash << 3;
        hash ^= hash >> 17;
        hash += hash << 5;

        if (hash < 0)
            hash = Math.abs(hash);
        //System.out.println("hash computer:" + hash);
        return hash;
    }
}

6.4 验证测试

一致性哈希算法实现后,接下来添加一个测试类,验证此算法时候正常。示例代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class ConsistentHashTest {
    public static final int NODE_SIZE = 10;
    public static final int STRING_COUNT = 100 * 100;
    private static ConsistentHash consistentHash = new ConsistentHash();
    private static List<String> sList = new ArrayList<>();

    public static void main(String[] args) {
        // 增加节点
        for (int i = 0; i < NODE_SIZE; i++) {
            String ip = new StringBuilder("10.2.1.").append(i)
                    .toString();
            consistentHash.addNode(ip);
        }

        // 生成需要缓存的数据;
        for (int i = 0; i < STRING_COUNT; i++) {
            sList.add(RandomStringUtils.randomAlphanumeric(10));
        }

        // 将数据放入到缓存中。
        for (String s : sList) {
            consistentHash.put(s, s);
        }

        for(int i = 0 ; i < 10 ; i ++) {
            int index = RandomUtils.nextInt(0, STRING_COUNT);
            String key = sList.get(index);
            String cache = (String) consistentHash.get(key);
            System.out.println("Random:"+index+",key:" + key + ",consistentHash get value:" + cache +",value is:" + key.equals(cache));
        }

        // 输出节点及数据分布情况
        for (Node node : consistentHash.nodeList){
            System.out.println(node);
        }

        // 新增一个数据节点
        consistentHash.addNode("10.2.1.110");
        for(int i = 0 ; i < 10 ; i ++) {
            int index = RandomUtils.nextInt(0, STRING_COUNT);
            String key = sList.get(index);
            String cache = (String) consistentHash.get(key);
            System.out.println("Random:"+index+",key:" + key + ",consistentHash get value:" + cache +",value is:" + key.equals(cache));
        }

        // 输出节点及数据分布情况
        for (Node node : consistentHash.nodeList){
            System.out.println(node);
        }
    }
}

运行此测试,输出结果如下所示:

最后

以上,我们就把一致性哈希算法的实现原理,应用场景、解决了哪些问题都介绍完了,并用java简单实现了一个一致性哈希算法。相信看完之后,大家对一致性哈希算法应该不会那么陌生害怕了吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-11-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构师精进 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
《迁移学习导论》第2版,升级内容抢先看!
👆点击“博文视点Broadview”,获取更多书讯 迁移学习怎么学? 相信不少小伙伴最初都是通过王晋东老师知乎上的《小王爱迁移》系列文章或在GitHub上开源发布的《迁移学习简明手册》来学习的! 这一系列的材料帮助了很多读者可以快速入门迁移学习,也获得了大家的好评(GitHub收获1W星标)。 之后,作者将这本手册全面更新,写就了《迁移学习导论》一书,这本书更是受到众多读者的喜爱,收获如潮好评! 作者们也持续秉承精益求精、事无巨细的态度,在微信群、微信公众号、知乎、GitHub等平台解答读者的疑问;
博文视点Broadview
2022/08/26
4150
《迁移学习导论》第2版,升级内容抢先看!
火爆全网的迁移学习简明手册全面更新,重磅出版上市!
👆关注“博文视点Broadview”,获取更多书讯 学习迁移学习的小伙伴大都应该读过知乎上的《小王爱迁移》系列文章或在GitHub上开源发布的迁移学习简明手册: https://zhuanlan.zhihu.com/p/35352154 《迁移学习简明手册》是作者王晋东(知乎@王晋东不在家)根据自己在迁移学习领域的学习和研究心得进行系统性梳理的成果。 如今,手册上线已逾3年,帮助了众多读者快速入门迁移学习,也获得了大家的好评(GitHub收获 9K 星标、代码库收获 7K 星标)。 现在,这本手册已全面更
博文视点Broadview
2023/05/19
2910
火爆全网的迁移学习简明手册全面更新,重磅出版上市!
入门迁移学习,跟着知乎大V王晋东的这个火热开源项目来学习!
👆点击“博文视点Broadview”,获取更多书讯 AI圈喜欢逛知乎的小伙伴很多应该知道知名大V@王晋东不在家数年前开源的《迁移学习简明手册》。 该手册是作者王晋东根据自己在迁移学习领域的学习和研究心得进行系统性梳理的成果,非常适合初学者学习。 手册上线3年多的时间里备受好评,帮助了大量AI从业者快速入门迁移学习。 如今,《迁移学习简明手册》代码库和手册分别已经在Github上收获了 7K 和 2K 多星标。 现在,这本手册已全面更新,形成《迁移学习导论》一书,已经出版上市。 该书从初学者入门的角度,循序
博文视点Broadview
2023/05/06
3750
入门迁移学习,跟着知乎大V王晋东的这个火热开源项目来学习!
入门迁移学习,跟着知乎大V王晋东的这个火热开源项目来学习(赠书)
AI圈喜欢逛知乎的小伙伴很多应该知道知名大V@王晋东不在家数年前开源的《迁移学习简明手册》。该手册,是作者王晋东根据自己在迁移学习领域的学习和研究心得进行系统性梳理的成果,非常适合初学者学习。 手册上线3年多的时间里备受好评,帮助了大量AI从业者快速入门迁移学习。如今,《迁移学习简明手册》代码库和手册分别已经在Github上收获了 7K 和 2K 多星标。 现在,这本手册已全面更新,形成《迁移学习导论》一书,已经出版上市。 该书从初学者入门的角度,循序渐进地引入迁移学习的相关概念、问题、方法和应用,结
机器之心
2023/03/29
4400
入门迁移学习,跟着知乎大V王晋东的这个火热开源项目来学习(赠书)
AI综述专栏 | 迁移学习简明手册
在科学研究中,从方法论上来讲,都应先见森林,再见树木。当前,人工智能科技迅猛发展,万木争荣,更应系统梳理脉络。为此,我们特别精选国内外优秀的综述论文,开辟“AI综述”专栏,敬请关注。
马上科普尚尚
2020/05/14
6070
AI综述专栏 | 迁移学习简明手册
GitHub星标数超4.2万的火爆之作!
AI领域蓬勃发展,不断有新鲜血液注入行业,行业著作也不断推陈出新~~ 最近博文菌得到一本极具群众基础的深度学习图书。 要说AI图书,博文菌推荐过非常多的优秀著作,有数十年经验沉淀的经典巨著,也有0压入门的必备秘籍…… 但这本书完全不一样! 因为它集百家所长,凝聚了众多一线科研人员及工程师的经验,可以培养读者发现问题、解决问题、扩展问题等方面的能力,真真正正地称得上一本书入门深度学习! 不卖关子了,它就是火爆全网的《深度学习500:AI工程师面试宝典》!   《深度学习500问:AI工程师面试宝典》   ▼
博文视点Broadview
2023/05/19
2890
GitHub星标数超4.2万的火爆之作!
GitHub 标星 1.6w+项目 HelloGitHub,让开发更简单的开源启蒙手册!
如果你恰好是一个编程新手,并纠结于该如何开始 GitHub 开源项目的学习与研究,这本手册就恰恰能很好解决这一难题,它的最大亮点就在于 GitHub 入门。
AI研习社
2019/12/17
1.1K0
GitHub 标星 1.6w+项目 HelloGitHub,让开发更简单的开源启蒙手册!
人工智能学习书单推荐( Python版本)
《动手学深度学习》是一本既能讲原理、又有实现和实际使用、不断更新、而且容易读的书。这本书⾯向希望了解深度学习,特别是对实际使⽤深度学习感兴趣的⼤学⽣、⼯程师和研究⼈员。不要求你有任何深度学习或者机器学习的背景知识,从头开始解释每⼀个概念。
用户9925864
2022/07/27
1.5K0
人工智能学习书单推荐( Python版本)
带你用深度学习虚拟机进行文本迁移学习(附代码)
本文讲述了现代机器学习的模型,主要由微软数据科学家Anusua Trivedi和数据科学家经理Wee Hyong Tok共同撰写。
数据派THU
2018/07/30
8460
带你用深度学习虚拟机进行文本迁移学习(附代码)
Java学习必备书籍推荐终极版!
很早就想把书单更新一下了,昨晚加今天早上花了几个时间对之前的书单进行了分类和补充完善。虽是终极版,但一定还有很多不错的 Java 书籍我没有添加进去,会继续完善下去。希望这篇文章对你有帮助,不要再无书可看。
乔戈里
2019/05/13
1.6K0
嵌入式书籍推荐
有读者反馈,单看零碎的知识点,自己心中没底。还是看书更有框架一些,所以今天给大家推荐一些经典书籍,书籍电子版我已经发到百度网盘群。
Jasonangel
2021/05/28
2K0
超硬核Java学习路线图+学习资源+实战项目汇总,看完以后不用再问我怎么学Java了!
于是这次黄小斜决定来一波狠的,把所有这些内容都整理起来,做成一份非常硬核的Java学习指南+路线图,一篇文章搞定Java学习,360度无死角(可能)如果你们喜欢这类硬核的文章,以后我也会继续这么硬核下去的!不要忘了分享噢。
程序员黄小斜
2020/05/29
9420
干货丨深度迁移学习方法的基本思路
百度前首席科学家、斯坦福大学副教授吴恩达(Andrew Ng)曾经说过:迁移学习将是继监督学习之后的下一个促使机器学习成功商业化的驱动力。 本文选自《深度学习500问:AI工程师面试宝典》,将重点介绍目前最热门的深度迁移学习方法的基本思路。 ▼限时5折,扫码了解详情▼ ▼ 随着迁移学习方法的大行其道,越来越多的研究人员开始使用深度神经网络进行迁移学习。与传统的非深度迁移学习方法相比,深度迁移学习直接提升了在不同任务上的学习效果,并且由于深度迁移学习直接对原始数据进行学习,所以它与非深度迁移学习方法相比
博文视点Broadview
2023/05/19
6590
干货丨深度迁移学习方法的基本思路
GitHub 标星 3.6k,一本开源的深度学习中文教程!
深度学习中绕不开的便是对算法框架的实际使用了。如果没有娴熟的工程实践能力,很多优秀的算法设计就无法真正使用。TensorFlow2.0 正式版已发布了一段时间,然而过去使用 TensorFlow1.x 版本的开发者担心两个版本之间的差距过大以至于无法迁移已有的经验,刚入门深度学习的人则因为 TensorFlow 那不友好的 API 和设计逻辑而望而却步。
GitHubDaily
2019/11/20
1K0
GitHub 标星 3.6k,一本开源的深度学习中文教程!
GitHub 上这个「计算机科学」自学指南火了!
我不知道你们最近有没有刷 GitHub,如果有的话,你应该会发现一个项目特别亮眼,这个项目名为:TeachYourselfCS-CN。
GitHubDaily
2020/06/29
2.5K0
GitHub 上这个「计算机科学」自学指南火了!
迁移学习全面指南:概念、应用、优势、挑战
【编者按】Springboard AI顾问、前Intel数据科学家Dipanjan (DJ) Sarkar全面介绍了迁移学习的概念、应用、优势、挑战,重点关注深度迁移学习。
zenRRan
2019/11/20
2.3K0
迁移学习全面指南:概念、应用、优势、挑战
GitHub标星6000+!Python带你实践机器学习圣经PRML
将 Bishop 大神的 PRML 称为机器学习圣经一点也不为过,该书系统地介绍了模式识别和机器学习领域内详细的概念与基础。书中有对概率论基础知识的介绍,也有高阶的线性代数和多元微积分的内容,适合高校的研究生以及人工智能相关的从业人员学习。
CV君
2020/03/05
6230
GitHub标星6000+!Python带你实践机器学习圣经PRML
重磅!《深度学习 500 问》已更新,GitHub 标星 2.6W(附完整下载)
几个月前,红色石头发文介绍过一份在 GitHub 上非常火爆的项目,名为:DeepLearning-500-questions,中文译名:深度学习 500 问。作者是川大的一名优秀毕业生谈继勇。该项目以深度学习面试问答形式,收集了 500 个问题和答案。内容涉及了常用的概率知识、线性代数、机器学习、深度学习、计算机视觉等热点问题。
数据派THU
2019/07/17
1.8K0
重磅!《深度学习 500 问》已更新,GitHub 标星 2.6W(附完整下载)
敖丙力荐的书单(含技术和非技术)
记得帅丙在自己21岁的那个夏天,当时拿到了自己的第一笔实习工资1400块,因为是110块一天嘛,而且入职的第一个月也没上满,但是还是很开心,第一个月师傅就给了一个建议,买本书吧。
敖丙
2020/06/19
1.4K0
敖丙力荐的书单(含技术和非技术)
周末再聊聊Java学习路线
我相信这些读者或多或少都有一些 Java 基础,但由于看不到全貌,学了一段时间很容易迷失。所以我在寻思着能不能写一个学习的地图或者路线,让读者能知道下一步该学什么,自己离大厂的 offer还有多远的距离。
Java3y
2020/12/31
7590
周末再聊聊Java学习路线
推荐阅读
相关推荐
《迁移学习导论》第2版,升级内容抢先看!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验