• 手把手教你用Python绘制神经网络图


    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    • 接下来教大家如何使用 Python 中的 networkx 库,绘制美观且标准的神经网络。
    • 会根据指定的层和节点数量,绘制不同结构的神经网络。

    networkx 库可以用来创建和操作图类型的数据结构,其中包括无向图、有向图、带权图等等。
    神经网络可以看做是一种图数据结构,因此可以使用networkx库创建,并进行可视化的操作。


    简单示例:绘制一个2层的神经网络

    在这里插入图片描述

    1. 首先,需提前安装好networkx库,然后在代码中导入 networkxmatplotlib。然后使用 DiGraph 创建一个有向图G。

    2. 我们要绘制的网络,包括了5个节点,第1层的节点编号为1、2,第2层的是3、4、5,我们使用add_edge,从1向3、4、5,从2向3、4、5,连接一条边。

    3. 为了让绘制的图像看起来像一个神经网络,我们需要为这5个节点设置坐标。创建字典pos,字典的key是节点的名称,字典的value,是节点所在位置。

    4. 最后使用nx.draw函数进行绘制。
      其中G是要绘制的图,
      pos是图中节点的坐标,
      with_labels = True,代表绘制节点的名称
      node_color和edgecolor是节点和边的颜色
      linewidths和width是节点和边的粗细
      node_size是节点的大小

    # 在代码中导入networkx 和 matplotlib
    import networkx as nx
    import matplotlib.pyplot as plt
    
    G = nx.DiGraph()  # 使用DiGraph创建一个有向图G
    
    # 网络包括了5个节点
    # 第一层的节点编号为1、2,第2层的是3、4、5
    G.add_edge(1, 3)  # 从1到3
    G.add_edge(1, 4)  # 从1到4
    G.add_edge(1, 5)  # 从1到5
    G.add_edge(2, 3)  # 从2到3
    G.add_edge(2, 4)  # 从2到4
    G.add_edge(2, 5)  # 从2到5
    
    # 创建字典pos,字典的key是节点的名称
    # 字典的value,是节点所在位置
    
    # 1号和2号节点在一列
    # 3、4、5在一列
    # 因此设置1和2的x坐标为0;3、4、5的为1
    
    # 同一组中的节点,可以均匀的分布在同一列上
    # 所以我们将1和2的y坐标,设置为0.25和0.75
    # 3、4、5的y坐标0.2、0.5、0.8
    
    # {节点名称:(节点x坐标,节点y坐标)}
    pos = {
        1: (0, 0.25),  # 节点1的坐标(0,0.25)
        2: (0, 0.75),  # 节点2的坐标(0,0.75)
        3: (1, 0.2),  # 节点3的坐标(1, 0.2)
        4: (1, 0.5),  # 节点4的坐标(1, 0.5)
        5: (1, 0.8),  # 节点5的坐标(1, 0.8)
    }
    
    # 使用nx.draw函数进行绘制
    nx.draw(G,  # 要绘制的图
            pos,  # 图中节点的坐标
            with_labels=True,  # 绘制节点的名称
            node_color='white',  # 节点的颜色
            edgecolors='black',  # 边的颜色
            linewidths=3,  # 节点的粗细
            width=2,  # 边的粗细
            node_size=1000  # 节点的大小
            )
    
    plt.show()  # 使用show方法显示图形
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    自定义函数,根据参数自由绘制神经网络

    在这里插入图片描述在这里插入图片描述在这里插入图片描述
    # 在代码中导入networkx 和 matplotlib
    import networkx as nx
    import matplotlib.pyplot as plt
    
    G = nx.DiGraph()  # 使用DiGraph创建一个有向图G
    
    # 网络包括了5个节点
    # 第一层的节点编号为1、2,第2层的是3、4、5
    G.add_edge(1, 3)  # 从1到3
    G.add_edge(1, 4)  # 从1到4
    G.add_edge(1, 5)  # 从1到5
    G.add_edge(2, 3)  # 从2到3
    G.add_edge(2, 4)  # 从2到4
    G.add_edge(2, 5)  # 从2到5
    
    # 创建字典pos,字典的key是节点的名称
    # 字典的value,是节点所在位置
    
    # 1号和2号节点在一列
    # 3、4、5在一列
    # 因此设置1和2的x坐标为0;3、4、5的为1
    
    # 同一组中的节点,可以均匀的分布在同一列上
    # 所以我们将1和2的y坐标,设置为0.25和0.75
    # 3、4、5的y坐标0.2、0.5、0.8
    
    # {节点名称:(节点x坐标,节点y坐标)}
    pos = {
        1: (0, 0.25),  # 节点1的坐标(0,0.25)
        2: (0, 0.75),  # 节点2的坐标(0,0.75)
        3: (1, 0.2),  # 节点3的坐标(1, 0.2)
        4: (1, 0.5),  # 节点4的坐标(1, 0.5)
        5: (1, 0.8),  # 节点5的坐标(1, 0.8)
    }
    
    # 使用nx.draw函数进行绘制
    nx.draw(G,  # 要绘制的图
            pos,  # 图中节点的坐标
            with_labels=True,  # 绘制节点的名称
            node_color='white',  # 节点的颜色
            edgecolors='black',  # 边的颜色
            linewidths=3,  # 节点的粗细
            width=2,  # 边的粗细
            node_size=1000  # 节点的大小
            )
    
    plt.show()
    
    
    # 根据传入的输入层、隐含层、输出层的神经元数量,绘制对应的神经网络
    def draw_network_digraph(input_num, hidden_num, output_num):
        G = nx.DiGraph()  # 创建一个图G
    
        # 连接输入层和隐含层之间的边
        for i in range(input_num):
            for j in range(hidden_num):
                G.add_edge(i, input_num + j)
    
        # 连接隐含层和输出层之间的边
        for i in range(hidden_num):
            for j in range(output_num):
                G.add_edge(input_num + i, input_num + hidden_num + j)
    
        pos = dict()  # 计算每个节点的坐标pos
        # 节点的坐标,(x,y)设置为:
        # (0,i-input_num/2)
        # (1,i-hidden_num)/2)
        # (2,i-output_num/2)
        # 根据每一层的节点数量,将节点从中间,向两边分布
        for i in range(0, input_num):
            pos[i] = (0, i - input_num / 2)
        for i in range(0, hidden_num):
            hidden = i + input_num
            pos[hidden] = (1, i - hidden_num / 2)
        for i in range(0, output_num):
            output = i + input_num + hidden_num
            pos[output] = (2, i - output_num / 2)
    
        # 调用 nx.draw 绘制神经网络
        nx.draw(G,  # 要绘制的图
                pos,  # 图中节点的坐标
                with_labels=False,  # 绘制节点的名称
                node_color='white',  # 节点的颜色
                edgecolors='black',  # 边的颜色
                linewidths=3,  # 节点的粗细
                width=2,  # 边的粗细
                node_size=1000  # 节点的大小
                )
    
    
    if __name__ == '__main__':
        #   尝试多组参数,绘制不同结构的神经网络
        draw_network_digraph(3, 5, 2)
        plt.show()
        draw_network_digraph(5, 2, 6)
        plt.show()
        draw_network_digraph(1, 10, 1)
        plt.show()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
  • 相关阅读:
    论文阅读-Whisper语音识别(OpenAI)
    【HUST】网安纳米|2023年研究生纳米技术考试参考
    redis进阶
    【MySql密码爆破脚本】用于其他爆破工具无法使用的情况下
    17-CSS3过渡
    Unicode编码的emoji表情如何在前端页面展示(未完成)
    备战蓝桥杯---动态规划的一些思想2
    WEB前端网页设计 HTML CSS 网页设计参数 - 【高度坍塌】
    字符串匹配_KMP算法_C语言
    OpenKruise :Kubernetes背后的托底
  • 原文地址:https://blog.csdn.net/Lov1_BYS/article/details/133837922