精华内容
下载资源
问答
  • GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析 文章目录GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析SetUp,库声明数据准备图卷积层定义模型定义模型训练 ...

    GCN实战深入浅出图神经网络第五章:基于Cora数据集的GCN节点分类 代码分析

    SetUp,库声明

    In [2]:

    import itertools
    import os
    import os.path as osp
    import pickle
    import urllib
    from collections import namedtuple
    
    import numpy as np
    import scipy.sparse as sp
    import torch
    import torch.nn as nn
    import torch.nn.functional as F
    import torch.nn.init as init
    import torch.optim as optim
    import matplotlib.pyplot as plt
    %matplotlib inline
    

    数据准备

    Cora数据集说明

    ├── gcn
    │   ├── data          //图数据
    │   │   ├── ind.citeseer.allx
    │   │   ├── ind.citeseer.ally
    │   │   ├── ind.citeseer.graph
    │   │   ├── ind.citeseer.test.index
    │   │   ├── ind.citeseer.tx  # 1
    │   │   ├── ind.citeseer.ty  # 2
    │   │   ├── ind.citeseer.x   # 3
    │   │   ├── ind.citeseer.y   # 4
    │   │   ├── ind.cora.allx
    │   │   ├── ind.cora.ally
    │   │   ├── ind.cora.graph
    │   │   ├── ind.cora.test.index
    │   │   ├── ind.cora.tx
    │   │   ├── ind.cora.ty
    │   │   ├── ind.cora.x
    │   │   ├── ind.cora.y
    │   │   ├── ind.pubmed.allx
    │   │   ├── ind.pubmed.ally
    │   │   ├── ind.pubmed.graph
    │   │   ├── ind.pubmed.test.index
    │   │   ├── ind.pubmed.tx
    │   │   ├── ind.pubmed.ty
    │   │   ├── ind.pubmed.x
    │   │   └── ind.pubmed.y
    │   ├── __init__.py
    │   ├── inits.py    //初始化的公用函数
    │   ├── layers.py   //GCN层定义
    │   ├── metrics.py  //评测指标的计算
    │   ├── models.py   //模型结构定义
    │   ├── train.py    //训练
    │   └── utils.py    //工具函数的定义
    ├── LICENCE
    ├── README.md
    ├── requirements.txt
    └── setup.py
    
    
    

    实验时可能出现数据集下载出错的问题,可以自行下载,放进程序预定的文件夹即可

    download_url = https://wwe.lanzous.com/iFiGKib18fi

    image-20201112090241667

    cora读取的文件说明:
    
    ind.cora.x => 训练实例的特征向量,是scipy.sparse.csr.csr_matrix类对象,shape:(140, 1433),由于ind.cora.x的数据包含于 allx 中,所以实验中没有读取 x
    ind.cora.tx => 测试实例的特征向量,shape:(1000, 1433)
    ind.cora.allx => 有标签的+无无标签训练实例的特征向量,是ind.dataset_str.x的超集,shape:(1708, 1433)
    
    # 实验中的完整的特征向量是有(allx,tx)拼接而成,(2708,1433),在实际训练是整体训练,只有当要计算损失值和精确度时才用掩码从(allx,tx)截取相应的输出
    
    ind.cora.y => 训练实例的 标签,独热编码,numpy.ndarray类的实例,是numpy.ndarray对象,shape:(140, 7)
    ind.cora.ty => 测试实例的标签,独热编码,numpy.ndarray类的实例,shape:(1000, 7)
    ind.cora.ally => 对应于ind.dataset_str.allx的标签,独热编码,shape:(1708, 7)
    
    # 同样是(ally,ty)拼接
    
    ind.cora.graph => 图数据,collections.defaultdict类的实例,格式为 {index:[index_of_neighbor_nodes]}
    
    ind.cora.test.index => 测试实例的id,(1000,)
    

    In [3]:

    Data = namedtuple('Data', ['x', 'y', 'adjacency',
                               'train_mask', 'val_mask', 'test_mask'])
    
    
    def tensor_from_numpy(x, device):
        return torch.from_numpy(x).to(device)
    
    
    class CoraData(object):
        download_url = "https://github.com/kimiyoung/planetoid/raw/master/data"
        filenames = ["ind.cora.{}".format(name) for name in
                     ['x', 'tx', 'allx', 'y', 'ty', 'ally', 'graph', 'test.index']]
    
        def __init__(self, data_root="cora", rebuild=False):
            """Cora数据,包括数据下载,处理,加载等功能
            当数据的缓存文件存在时,将使用缓存文件,否则将下载、进行处理,并缓存到磁盘
    
            处理之后的数据可以通过属性 .data 获得,它将返回一个数据对象,包括如下几部分:
                * x: 节点的特征,维度为 2708 * 1433,类型为 np.ndarray
                * y: 节点的标签,总共包括7个类别,类型为 np.ndarray
                * adjacency: 邻接矩阵,维度为 2708 * 2708,类型为 scipy.sparse.coo.coo_matrix
                * train_mask: 训练集掩码向量,维度为 2708,当节点属于训练集时,相应位置为True,否则False
                * val_mask: 验证集掩码向量,维度为 2708,当节点属于验证集时,相应位置为True,否则False
                * test_mask: 测试集掩码向量,维度为 2708,当节点属于测试集时,相应位置为True,否则False
    
            Args:
            -------
                data_root: string, optional
                    存放数据的目录,原始数据路径: {data_root}/raw
                    缓存数据路径: {data_root}/processed_cora.pkl
                rebuild: boolean, optional
                    是否需要重新构建数据集,当设为True时,如果存在缓存数据也会重建数据
    
            """
            self.data_root = data_root
            save_file = osp.join(self.data_root, "processed_cora.pkl")
            if osp.exists(save_file) and not rebuild:
                print("Using Cached file: {}".format(save_file))
                self._data = pickle.load(open(save_file, "rb"))
            else:
                self.maybe_download()
                self._data = self.process_data()
                with open(save_file, "wb") as f:
                    pickle.dump(self.data, f)
                print("Cached file: {}".format(save_file))
        
        @property
        def data(self):
            """返回Data数据对象,包括x, y, adjacency, train_mask, val_mask, test_mask"""
            return self._data
    
        def process_data(self):
            """
            处理数据,得到节点特征和标签,邻接矩阵,训练集、验证集以及测试集
            引用自:https://github.com/rusty1s/pytorch_geometric
            """
            print("Process data ...")
            _, tx, allx, y, ty, ally, graph, test_index = [self.read_data(
                osp.join(self.data_root, "raw", name)) for name in self.filenames]
            
            # 测试test_index的形状(1000,),如果那里不明白可以测试输出一下矩阵形状
            print('test_index',test_index.shape)
            
            train_index = np.arange(y.shape[0])  # [0,...139] 140个元素
            print('train_index',train_index.shape) 
            
            val_index = np.arange(y.shape[0], y.shape[0] + 500) # [140 - 640] 500个元素
            print('val_index',val_index.shape)  
            
            sorted_test_index = sorted(test_index)  # #test_index就是随机选取的下标,排下序
    #         print('test_index',sorted_test_index)
    
            x = np.concatenate((allx, tx), axis=0)  # 1708 +1000 =2708 特征向量
            y = np.concatenate((ally, ty), axis=0).argmax(axis=1) # 把最大值的下标重新作为一个数组 标签向量
            
            x[test_index] = x[sorted_test_index]  # 打乱顺序,单纯给test_index 的数据排个序,不清楚具体效果
            y[test_index] = y[sorted_test_index]
            num_nodes = x.shape[0]  #2078
    
            train_mask = np.zeros(num_nodes, dtype=np.bool)  # 生成零向量
            val_mask = np.zeros(num_nodes, dtype=np.bool)
            test_mask = np.zeros(num_nodes, dtype=np.bool)
            train_mask[train_index] = True  # 前140个元素为训练集
            val_mask[val_index] = True  # 140 -639 500个
            test_mask[test_index] = True  # 1708-2708 1000个元素
            
            #下面两句是我测试用的,本来代码没有
            #是为了知道使用掩码后,y_train_mask 的形状,由输出来说是(140,)
            # 这就是后面划分训练集的方法
            y_train_mask = y[train_mask]
            print('y_train_mask',y_train_mask.shape)
            
            #构建邻接矩阵
            adjacency = self.build_adjacency(graph)
            print("Node's feature shape: ", x.shape)
            print("Node's label shape: ", y.shape)
            print("Adjacency's shape: ", adjacency.shape)
            print("Number of training nodes: ", train_mask.sum())
            print("Number of validation nodes: ", val_mask.sum())
            print("Number of test nodes: ", test_mask.sum())
    
            return Data(x=x, y=y, adjacency=adjacency,
                        train_mask=train_mask, val_mask=val_mask, test_mask=test_mask)
    
        def maybe_download(self):
            save_path = os.path.join(self.data_root, "raw")
            for name in self.filenames:
                if not osp.exists(osp.join(save_path, name)):
                    self.download_data(
                        "{}/{}".format(self.download_url, name), save_path)
    
        @staticmethod
        def build_adjacency(adj_dict):
            """根据邻接表创建邻接矩阵"""
            edge_index = []
            num_nodes = len(adj_dict)
            print('num_nodesaaaaaaaaaaaa',num_nodes)
            for src, dst in adj_dict.items():  # 格式为 {index:[index_of_neighbor_nodes]}
                edge_index.extend([src, v] for v in dst)  # 
                edge_index.extend([v, src] for v in dst)
                
            # 去除重复的边
            edge_index = list(k for k, _ in itertools.groupby(sorted(edge_index)))  # 以轮到的元素为k,每个k对应一个数组,和k相同放进数组,不
                                                                                    # 同再生成一个k,sorted()是以第一个元素大小排序
            
            edge_index = np.asarray(edge_index)
            
            #稀疏矩阵 存储非0值 节省空间
            adjacency = sp.coo_matrix((np.ones(len(edge_index)), 
                                       (edge_index[:, 0], edge_index[:, 1])),
                        shape=(num_nodes, num_nodes), dtype="float32")
            return adjacency
    
        @staticmethod
        def read_data(path):
            """使用不同的方式读取原始数据以进一步处理"""
            name = osp.basename(path)
            if name == "ind.cora.test.index":
                out = np.genfromtxt(path, dtype="int64")
                return out
            else:
                out = pickle.load(open(path, "rb"), encoding="latin1")
                out = out.toarray() if hasattr(out, "toarray") else out
                return out
    
        @staticmethod
        def download_data(url, save_path):
            """数据下载工具,当原始数据不存在时将会进行下载"""
            if not os.path.exists(save_path):
                os.makedirs(save_path)
            data = urllib.request.urlopen(url)
            filename = os.path.split(url)[-1]
    
            with open(os.path.join(save_path, filename), 'wb') as f:
                f.write(data.read())
    
            return True
    
        @staticmethod
        def normalization(adjacency):
            """计算 L=D^-0.5 * (A+I) * D^-0.5"""
            adjacency += sp.eye(adjacency.shape[0])    # 增加自连接
            degree = np.array(adjacency.sum(1))
            d_hat = sp.diags(np.power(degree, -0.5).flatten())
            return d_hat.dot(adjacency).dot(d_hat).tocoo()  #返回稀疏矩阵的coo_matrix形式
    
    # 这样可以单独测试Process_data函数
    a = CoraData()
    a.process_data()
    
    
    

    Out[3]:

    Using Cached file: cora\processed_cora.pkl
    Process data ...
    test_index (1000,)
    train_index (140,)
    val_index (500,)
    y_train_mask (140,)
    num_nodesaaaaaaaaaaaa 2708
    Node's feature shape:  (2708, 1433)
    Node's label shape:  (2708,)
    Adjacency's shape:  (2708, 2708)
    Number of training nodes:  140
    Number of validation nodes:  500
    Number of test nodes:  1000
    Data(x=array([[0., 0., 0., ..., 0., 0., 0.],
           [0., 0., 0., ..., 0., 0., 0.],
           [0., 0., 0., ..., 0., 0., 0.],
           ...,
           [0., 0., 0., ..., 0., 0., 0.],
           [0., 0., 0., ..., 0., 0., 0.],
           [0., 0., 0., ..., 0., 0., 0.]], dtype=float32), y=array([3, 4, 4, ..., 3, 3, 3], dtype=int64), adjacency=<2708x2708 sparse matrix of type '<class 'numpy.float32'>'
    	with 10556 stored elements in COOrdinate format>, train_mask=array([ True,  True,  True, ..., False, False, False]), val_mask=array([False, False, False, ..., False, False, False]), test_mask=array([False, False, False, ...,  True,  True,  True]))
    

    图卷积层定义

    In [13]:

    class GraphConvolution(nn.Module):
        def __init__(self, input_dim, output_dim, use_bias=True):
            """图卷积:L*X*\theta
            
            完整GCN函数
            f = sigma(D^-1/2 A D^-1/2 * H * W)
            卷积是D^-1/2 A D^-1/2 * H * W
            adjacency = D^-1/2 A D^-1/2 已经经过归一化,标准化的拉普拉斯矩阵
            
            这样就把傅里叶变化和拉普拉斯矩阵结合起来了.
            
            Args:
            ----------
                input_dim: int
                    节点输入特征的维度
                output_dim: int
                    输出特征维度
                use_bias : bool, optional
                    是否使用偏置
            """
            super(GraphConvolution, self).__init__()
            
            
            self.input_dim = input_dim
            self.output_dim = output_dim
            self.use_bias = use_bias
            
            # 定义GCN层的 W 权重形状
            self.weight = nn.Parameter(torch.Tensor(input_dim, output_dim))
            
            #定义GCN层的 b 权重矩阵
            if self.use_bias:
                self.bias = nn.Parameter(torch.Tensor(output_dim))
            else:
                self.register_parameter('bias', None)
            self.reset_parameters()
            
        # 这里才是声明初始化 nn.Module 类里面的W,b参数
        def reset_parameters(self):
            init.kaiming_uniform_(self.weight)
            if self.use_bias:
                init.zeros_(self.bias)
    
        def forward(self, adjacency, input_feature):
            """邻接矩阵是稀疏矩阵,因此在计算时使用稀疏矩阵乘法
        
            Args: 
            -------
                adjacency: torch.sparse.FloatTensor
                    邻接矩阵
                input_feature: torch.Tensor
                    输入特征
            """
            support = torch.mm(input_feature, self.weight)  # 矩阵相乘 m由matrix缩写
            output = torch.sparse.mm(adjacency, support)  # sparse 稀疏的
            if self.use_bias:
                output += self.bias  # bias 偏置,偏见
            return output
        
        # 一般是为了打印类实例的信息而重写的内置函数
        def __repr__(self):
            return self.__class__.__name__ + ' (' \
                + str(self.input_dim) + ' -> ' \
                + str(self.output_dim) + ')'
    
    

    模型定义

    读者可以自己对GCN模型结构进行修改和实验

    In [14]:

    class GcnNet(nn.Module):
        """
        定义一个包含两层GraphConvolution的模型
        """
        def __init__(self, input_dim=1433):
            super(GcnNet, self).__init__()
            self.gcn1 = GraphConvolution(input_dim, 16) #(N,1433)->(N,16)
            self.gcn2 = GraphConvolution(16, 7) #(N,16)->(N,7)
        
        def forward(self, adjacency, feature):
            h = F.relu(self.gcn1(adjacency, feature)) #(N,1433)->(N,16),经过relu函数
            logits = self.gcn2(adjacency, h) #(N,16)->(N,7)
            return logits
    

    模型训练

    In [16]:

    # 超参数定义
    LEARNING_RATE = 0.1 #学习率
    WEIGHT_DACAY = 5e-4  #正则化系数 weight_dacay
    EPOCHS = 200 #完整遍历训练集的次数
    DEVICE = "cuda" if torch.cuda.is_available() else "cpu" #设备
    # 如果当前显卡忙于其他工作,可以设置为 DEVICE = "cpu",使用cpu运行
    

    In [17]:

    # 加载数据,并转换为torch.Tensor
    dataset = CoraData().data
    
    node_feature = dataset.x / dataset.x.sum(1, keepdims=True)  # 归一化数据,使得每一行和为1
    
    tensor_x = tensor_from_numpy(node_feature, DEVICE)  # (2708,1433)
    tensor_y = tensor_from_numpy(dataset.y, DEVICE)  #(2708,)
    
    tensor_train_mask = tensor_from_numpy(dataset.train_mask, DEVICE) #前140个为True
    tensor_val_mask = tensor_from_numpy(dataset.val_mask, DEVICE)  # 140 - 639  500个
    tensor_test_mask = tensor_from_numpy(dataset.test_mask, DEVICE) # 1708 - 2707 1000个
    
    normalize_adjacency = CoraData.normalization(dataset.adjacency)   # 规范化邻接矩阵 计算 L=D^-0.5 * (A+I) * D^-0.5
    
    num_nodes, input_dim = node_feature.shape  # 2708,1433
    
    # 原始创建coo_matrix((data, (row, col)), shape=(4, 4)) indices为index复数 https://blog.csdn.net/chao2016/article/details/80344828?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522160509865819724838529777%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=160509865819724838529777&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~first_rank_v2~rank_v28-2-80344828.pc_first_rank_v2_rank_v28&utm_term=%E7%A8%80%E7%96%8F%E7%9F%A9%E9%98%B5%E7%9A%84coo_matrix&spm=1018.2118.3001.4449
    indices = torch.from_numpy(np.asarray([normalize_adjacency.row, 
                                           normalize_adjacency.col]).astype('int64')).long()
    
    values = torch.from_numpy(normalize_adjacency.data.astype(np.float32))
    
    tensor_adjacency = torch.sparse.FloatTensor(indices, values, 
                                                (num_nodes, num_nodes)).to(DEVICE)
    #根据三元组 构造 稀疏矩阵向量,构造出来的张量是 (2708,2708)
    
    

    In [18]:

    # 模型定义:Model, Loss, Optimizer
    model = GcnNet(input_dim).to(DEVICE)
    criterion = nn.CrossEntropyLoss().to(DEVICE)  # criterion评判标准
    optimizer = optim.Adam(model.parameters(),    # optimizer 优化程序 ,使用Adam 优化方法,权重衰减https://blog.csdn.net/program_developer/article/details/80867468
                           lr=LEARNING_RATE, 
                           weight_decay=WEIGHT_DACAY)
    

    In [8]:

    # 训练主体函数
    def train():
        loss_history = []
        val_acc_history = []
        model.train() 
        
        train_y = tensor_y[tensor_train_mask]  # shape=(140,)不是(2708,)了
        # 共进行200次训练
        for epoch in range(EPOCHS):
            logits = model(tensor_adjacency, tensor_x)  # 前向传播,认为因为声明了 model.train(),不用forward了
            train_mask_logits = logits[tensor_train_mask]   # 只选择训练节点进行监督 (140,)
            
            loss = criterion(train_mask_logits, train_y)    # 计算损失值  
            optimizer.zero_grad()  # 梯度归零
            loss.backward()     # 反向传播计算参数的梯度
            optimizer.step()    # 使用优化方法进行梯度更新
            
            
            train_acc, _, _ = test(tensor_train_mask)     # 计算当前模型训练集上的准确率  调用test函数
            val_acc, _, _ = test(tensor_val_mask)     # 计算当前模型在验证集上的准确率
            
            # 记录训练过程中损失值和准确率的变化,用于画图
            loss_history.append(loss.item())
            val_acc_history.append(val_acc.item())
            print("Epoch {:03d}: Loss {:.4f}, TrainAcc {:.4}, ValAcc {:.4f}".format(
                epoch, loss.item(), train_acc.item(), val_acc.item()))
        
        return loss_history, val_acc_history
    
    

    In [9]:

    # 测试函数
    def test(mask):
        model.eval()  # 表示将模型转变为evaluation(测试)模式,这样就可以排除BN和Dropout对测试的干扰
        
        with torch.no_grad():  # 显著减少显存占用
            logits = model(tensor_adjacency, tensor_x) #(N,16)->(N,7) N节点数
            test_mask_logits = logits[mask]  # 矩阵形状和mask一样
            
            predict_y = test_mask_logits.max(1)[1]  # 返回每一行的最大值中索引(返回最大元素在各行的列索引)
            accuarcy = torch.eq(predict_y, tensor_y[mask]).float().mean()
        return accuarcy, test_mask_logits.cpu().numpy(), tensor_y[mask].cpu().numpy()
    
    

    In [13]:

    def plot_loss_with_acc(loss_history, val_acc_history):
        fig = plt.figure()
        # 坐标系ax1画曲线1
        ax1 = fig.add_subplot(111)  # 指的是将plot界面分成1行1列,此子图占据从左到右从上到下的1位置
        ax1.plot(range(len(loss_history)), loss_history,
                 c=np.array([255, 71, 90]) / 255.)  # c为颜色
        plt.ylabel('Loss')
        
        # 坐标系ax2画曲线2
        ax2 = fig.add_subplot(111, sharex=ax1, frameon=False)  # 其本质就是添加坐标系,设置共享ax1的x轴,ax2背景透明
        ax2.plot(range(len(val_acc_history)), val_acc_history,
                 c=np.array([79, 179, 255]) / 255.)
        ax2.yaxis.tick_right()  # 开启右边的y坐标
        
        ax2.yaxis.set_label_position("right")
        plt.ylabel('ValAcc')
        
        plt.xlabel('Epoch')
        plt.title('Training Loss & Validation Accuracy')
        plt.show()
    
    

    In [ ]:

    loss, val_acc = train()
    test_acc, test_logits, test_label = test(tensor_test_mask)
    print("Test accuarcy: ", test_acc.item())
    

    In [14]:

    plot_loss_with_acc(loss, val_acc)
    

    image-20201112091908533

    展开全文
  • 神经网络——实现MNIST数据集的手写数字识别

    千次阅读 多人点赞 2019-01-03 21:49:07
    由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下 手写数字的数据集MNIST下载:...一、使用小规模数据集进行神经网络的训练和测试 数据集:  mnist_train_100.csv :100个样本  ...

    由于官网下载手写数字的数据集较慢,因此提供便捷下载地址如下

    手写数字的数据集MNIST下载:https://download.csdn.net/download/gaoyu1253401563/10891997

    数据集包含如下:

    一、使用小规模数据集进行神经网络的训练和测试

    数据集:

                  mnist_train_100.csv   :100个样本

                  mnist_test_10.csv       :10个样本

    1、数据集分析

    如下为mnist_train_100.csv开始的2-3行:

        存储数据的文件成为CSV文件,每一个吗值都是由逗号分隔,对于每行(最左边有行号)的数值,开头的第一个在值是标签,即书写 者希望表示的数字,如第一行的 “5”、第二行的 “0”。随后的784个值,由逗号分隔,是手写数字的像素值,像素数组的尺寸是28*28(即784),这784个像素值是手写数字的28*28的图片对应的784个位置的像素值。

    注意:正常情况下0指的是黑色,255指的是白色,但是MNIST数据集使用相反的方式表示。

    通过以下程序根据数据显示图片。

    # 读入手写字体数据集(小数据集:mnist_train_100.csv)
    import numpy as np
    import matplotlib.pyplot as plt
    
    data_file = open("mnist_dataset/mnist_train_100.csv", 'r')
    data_list = data_file.readlines()
    data_file.close()
    
    all_values = data_list[1].split(',')
    #np.asfarray()函数:返回转换为float类型的数组
    image_array = np.asfarray(all_values[1:]).reshape((28,28))
    plt.imshow(image_array, cmap = 'Greys', interpolation = 'None')
    
    
    

                                

     

    2、数据集中数据的处理

       需要做的第一件事是将输入颜色值从较大的0到255的范围,缩放到较小的0.01到1.0的范围,选择0.01作为范围的最小值,是为了避免0值输入最终会造成权重更新的失败。

    scaled_input = (np.asfarray(all_values[1:]) / 255.0 * 0.99) + 0.01
    print(scaled_input)

    输出结果如下:                             

    [0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.208      0.62729412 0.99223529 0.62729412 0.20411765
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.19635294 0.934
     0.98835294 0.98835294 0.98835294 0.93011765 0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.21964706 0.89129412 0.99223529 0.98835294 0.93788235
     0.91458824 0.98835294 0.23129412 0.03329412 0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.04882353 0.24294118 0.87964706
     0.98835294 0.99223529 0.98835294 0.79423529 0.33611765 0.98835294
     0.99223529 0.48364706 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.64282353 0.98835294 0.98835294 0.98835294 0.99223529
     0.98835294 0.98835294 0.38270588 0.74376471 0.99223529 0.65835294
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.208      0.934
     0.99223529 0.99223529 0.74764706 0.45258824 0.99223529 0.89517647
     0.19247059 0.31670588 1.         0.66223529 0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.19635294 0.934      0.98835294 0.98835294 0.70494118
     0.05658824 0.30117647 0.47976471 0.09152941 0.01       0.01
     0.99223529 0.95341176 0.20411765 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.15752941 0.65058824
     0.99223529 0.91458824 0.81752941 0.33611765 0.01       0.01
     0.01       0.01       0.01       0.01       0.99223529 0.98835294
     0.65058824 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.03717647 0.70105882 0.98835294 0.94176471 0.28564706
     0.08376471 0.11870588 0.01       0.01       0.01       0.01
     0.01       0.01       0.99223529 0.98835294 0.76705882 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.23129412
     0.98835294 0.98835294 0.25458824 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.99223529 0.98835294 0.76705882 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.77870588 0.99223529 0.74764706
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       1.         0.99223529
     0.77094118 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.30505882 0.96505882 0.98835294 0.44482353 0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.99223529 0.98835294 0.58458824 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.34       0.98835294
     0.90294118 0.10705882 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.03717647 0.53411765
     0.99223529 0.73211765 0.05658824 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.34       0.98835294 0.87576471 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.03717647 0.51858824 0.98835294 0.88352941 0.28564706
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.34       0.98835294 0.57294118 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.19635294 0.65058824
     0.98835294 0.68164706 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.34388235 0.99223529
     0.88352941 0.01       0.01       0.01       0.01       0.01
     0.01       0.45258824 0.934      0.99223529 0.63894118 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.34       0.98835294 0.97670588 0.57682353
     0.19635294 0.12258824 0.34       0.70105882 0.88352941 0.99223529
     0.87576471 0.65835294 0.22741176 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.34       0.98835294 0.98835294 0.98835294 0.89905882 0.84470588
     0.98835294 0.98835294 0.98835294 0.77094118 0.51470588 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.11870588 0.78258824
     0.98835294 0.98835294 0.99223529 0.98835294 0.98835294 0.91458824
     0.57294118 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.10705882 0.50694118 0.98835294
     0.99223529 0.98835294 0.55741176 0.15364706 0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01      ]

     

    3、构建目标矩阵

    我们要求神经网络对图像进行分类,分配正确的标签,这些标签是0到9共10个数字中的一个,这意味着神经网络应该有10个输出层节点,每个节点对应一个可能的答案或标签,例如:如果答案是“0”,输出层第一个节点激发,而其余的输出节点则保持抑制状态。如下图所示:对于example“0”,可以看出输出层的最大信号来自于标签为“0”的节点,其余的输出节点产生非常小的信号输出。通常我们使用最大信号的输出节点对应的标签作为答案。

    如果训练样本的标签为“0”,则需要创建输出节点的目标数组,其中除了对应于标签“0”的节点,其余所有的节点的值都应该很小,例如                       [0.99,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01,0.01] 

    如下程序所示,根据目标数组,使用python实现目标数组

    onodes = 10
    targets = np.zeros(onodes) + 0.01
    targets[int(all_values[0])] = 0.99
    targets

    输出结果如下:

     

    4、神经网络的实现

    • 设计神经网络
    import numpy as np
    import scipy.special as S
    import matplotlib.pyplot as plt
    class neuralNetwork:
    #初始化神经网络,构造函数
        def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
            #设置每个输入、隐藏、输出层中的节点数(三层的神经网络)
            self.inodes = inputnodes
            self.hnodes = hiddennodes
            self.onodes = outputnodes
            
            #链接权重矩阵,wih和who
            # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
            # w11 w21
            # w12 w22 etc 
            self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
            self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
            
            #学习率
            self.lr = learningrate
            
            #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
            self.activation_function = lambda x: S.expit(x)
            
            pass
        
    #训练神经网络
        def train(self, inputs_list, targets_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            targets = np.array(targets_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #计算隐藏层中输出的信号(使用激活函数计算)
            hidden_outputs = self.activation_function(hidden_inputs)
            #将传输的信号计算到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #计算输出层中输出的信号(使用激活函数)
            final_outputs = self.activation_function(final_inputs)
            
            #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
            output_errors = targets - final_outputs
            #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
            hidden_errors = np.dot(self.who.T, output_errors)
            
            #反向传播,更新各层权重
            #更新隐层和输出层之间的权重
            self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
            #更新输入层和隐藏层之间的权重
            self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
            #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
            pass
        
    #查询神经网络:接受神经网络的输入,返回神经网络的输出
        def query(self, inputs_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #将信号从隐藏层输出
            hidden_outputs = self.activation_function(hidden_inputs)
            #将信号引入到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #将信号从输出层输出
            final_outputs = self.activation_function(final_inputs)
            
            #返回输出层的输出值
            return final_outputs
    • 初始化参数,类的实例化
    input_nodes = 784
    hidden_nodes = 100
    output_nodes = 10
    learning_rate = 0.3
    n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
    • 加载训练数据的CSV文件到程序中
    training_data_file = open("mnist_dataset/mnist_train_100.csv", 'r')
    training_data_list = training_data_file.readlines()
    training_data_file.close()
    • 对网络进行训练
    for record in training_data_list:
        all_values = record.split(',')
        inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
        targets = np.zeros(output_nodes) + 0.01
        targets[int(all_values[0])] = 0.99
        n.train(inputs, targets)
        pass
    • 测试训练后的神经网络模型
    test_data_file = open("mnist_dataset/mnist_test_10.csv", 'r')
    test_data_list = test_data_file.readlines()
    test_data_file.close()
    all_values = test_data_list[0].split(',')
    image_array = np.asfarray(all_values[1:]).reshape((28,28))
    plt.imshow(image_array, cmap='Greys', interpolation = 'None')
    n.query((np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01)

    测试的单个数据对应的数字: 

    输出结果:

    分析:由结果可知,节点的最大输出信号对应标签“7”,因此将此结果作为答案,即判断测试数据集中的这个手写数字是7。可以发现,这个结果不是太令人满意,因为答案对应的输出信号值不是很大,因为我们使用的数据集太小,因此进行二的实验。

     

    二、完整数据集进行神经网络的训练和测试

    数据集:

                 mnist_train.csv      :60000个样本

                  mnist_test.csv       :10000个样本

     

    1、神经网络的设计

    import numpy as np
    import scipy.special as S
    import matplotlib.pyplot as plt
    class neuralNetwork:
    #初始化神经网络,构造函数
        def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
            #设置每个输入、隐藏、输出层中的节点数
            self.inodes = inputnodes
            self.hnodes = hiddennodes
            self.onodes = outputnodes
            
            #链接权重矩阵,wih和who
            # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
            # w11 w21
            # w12 w22 etc 
            self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
            self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
            
            #学习率
            self.lr = learningrate
            
            #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
            self.activation_function = lambda x: S.expit(x)
            
            pass
        
    #训练神经网络
        def train(self, inputs_list, targets_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            targets = np.array(targets_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #计算隐藏层中输出的信号(使用激活函数计算)
            hidden_outputs = self.activation_function(hidden_inputs)
            #将传输的信号计算到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #计算输出层中输出的信号(使用激活函数)
            final_outputs = self.activation_function(final_inputs)
            
            #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
            output_errors = targets - final_outputs
            #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
            hidden_errors = np.dot(self.who.T, output_errors)
            
            #反向传播,更新各层权重
            #更新隐层和输出层之间的权重
            self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
            #更新输入层和隐藏层之间的权重
            self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
            #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
            pass
        
    #查询神经网络:接受神经网络的输入,返回神经网络的输出
        def query(self, inputs_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #将信号从隐藏层输出
            hidden_outputs = self.activation_function(hidden_inputs)
            #将信号引入到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #将信号从输出层输出
            final_outputs = self.activation_function(final_inputs)
            
            #返回输出层的输出值
            return final_outputs

    2、参数设置

    input_nodes = 784
    hidden_nodes = 200
    output_nodes = 10
    learning_rate = 0.3
    n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)

    3、导入mnist的训练数据集

     #将mnist的训练数据CSV文件加载到一个列表中
    training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
    training_data_list = training_data_file.readlines()
    training_data_file.close()

    4、训练神经网络

    #训练神经网络
    
    #epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,
    epochs = 5
    for e in range(epochs):
        for record in training_data_list:
            all_values = record.split(',')
            inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
            targets = np.zeros(output_nodes) + 0.01
            targets[int(all_values[0])] = 0.99
            n.train(inputs, targets)
            pass
        pass

    5、载入测试数据集

    #将mnist测试数据的CSV文件加载到一个列表中
    test_data_file = open("mnist_dataset/mnist_test.csv", 'r')
    test_data_list = test_data_file.readlines()
    test_data_file.close()

    6、测试训练的模型

    #scorecard用于记录训练好的神经网络在测试时的表现,初始为一个空列表
    scorecard = []
    
    #检测测试数据集中的所有数据
    for record in test_data_list:
        all_values = record.split(',')
        correct_label = int(all_values[0])
        inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
        outputs = n.query(inputs)
        outputs_max_label = np.argmax(outputs)
        if (outputs_max_label == correct_label):
            scorecard.append(1)
        else:
            scorecard.append(0)
            pass
        pass

     

    7、计算测试的得分

    #计算得分
    scorecard_array = np.asarray(scorecard)
    print("performace = ", scorecard_array.sum() / scorecard_array.size)

    结果:                                     

     

    总结:训练和测试用时需要几分钟,可以见接下来的图,每次得分不同,这是因为,我们生成的链接权重矩阵是随机的,因此每次训练、测试最后的得分不同。

    使用%%time计算训练和测试的时间如下(CPU环境下):

    训练时间:Wall time: 6min 42s

    测试时间: Wall time:1.86s

     

    三、使用自己写的手写数字作为数据集进行网络的测试

     

    1、对自己的手写数字进行数据的处理

    import numpy as np
    #python自带的库,主要用于读取和存储图像
    import imageio 
    #glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作
    import glob
    import matplotlib.pyplot as plt
    
    #定义一个列表,存储自己手写数字的数据
    our_own_dataset = []
    
    #对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中
    for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):
        print("loading...", image_file_name)
        #记录自己手写数字的正确标签
        label = int(image_file_name[-5:-4])
        #将图像数据从png文件加载到数组中
        img_array = imageio.imread(image_file_name, as_gray = True)
        #将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。
        img_data = 255.0 - img_array.reshape(784)
        img_data = (img_data / 255.0*0.99) + 0.01
        print(np.min(img_data))
        print(np.max(img_data))
        #将标签和对应的数据添加到测试数据中,即我们的数据集
        #np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度
        record = np.append(label,img_data)
        print(record)
        our_own_dataset.append(record)
        pass

     部分结果:

    loading... my_own_dataset\2828_my_own_2.png
    0.01
    1.0
    [2.         0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.07211765 0.52247059
     0.71658826 0.61952943 0.29729411 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.27400002 0.79423529 0.79423529 0.84470588 1.
     1.         0.59623533 0.01776471 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.23905884 0.70494121
     0.32835296 0.01       0.01       0.18858825 0.92235297 1.
     0.35552943 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.34388235 0.28952941 0.01       0.01
     0.01       0.01       0.50305885 1.         0.61176473 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.37105882 1.         0.61564708 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.43705884 1.
     0.42152941 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.68941176 0.86800003 0.09152941 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.21964706
     0.88741177 0.37494117 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01388235 0.68941176 0.55741179 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.46811765 0.63505882 0.02941176 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.36329412 0.68164706 0.09541176
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.27011764 0.69329411 0.12258823 0.01       0.01       0.01
     0.01       0.15752943 0.01776471 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.24294119 0.81364709 0.32447058
     0.01       0.01388235 0.02941176 0.14588237 0.64670593 0.4875294
     0.01388235 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.04882353
     0.46423531 1.         1.         1.         1.         1.
     1.         1.         1.         0.1847059  0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.08376471 0.46811765 0.5069412
     0.44482353 0.51082355 0.53023529 0.53023529 0.53023529 0.5069412
     0.29341176 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01      ]
    loading... my_own_dataset\2828_my_own_3.png
    0.01
    1.0
    [3.         0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.03329412
     0.12258823 0.01       0.44870588 0.61176473 0.56129414 0.23129413
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.27400002 0.60400003 0.80588233 0.46035293 0.01
     0.32058823 0.48364705 0.56905884 0.72435296 0.64282358 0.07600001
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.26235294
     0.5147059  0.23517647 0.02552941 0.01       0.01       0.01
     0.01       0.01       0.81752944 0.5147059  0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.21964706 0.08764706 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.62341177
     0.49529412 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.7515294  0.38658825 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.58847064 0.736      0.02164706 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.08376471 0.41764706 0.61952943 0.24682353 0.24294119 0.04882353
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.54576474 0.96117646
     1.         0.57682353 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.07600001 0.05270588 0.22352943 0.81364709
     0.59235299 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.05270588 0.37882352 0.32835296
     0.08376471 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.82141179 0.472      0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.35164705 0.55352944 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.05270588
     0.23517647 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.34       0.76705885 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.18082353 0.08764706 0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.02941176 0.87964708 0.5418824  0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.41764706 0.87964708 0.02552941 0.01       0.01
     0.01       0.01       0.01       0.01       0.13423531 0.42152941
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.53800005 0.79811764 0.11870588 0.01       0.01       0.08764706
     0.31282353 0.82917649 0.27788237 0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.53023529
     0.26235294 0.16917649 0.70494121 0.78258824 0.7282353  0.37105882
     0.02164706 0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.13035294
     0.31282353 0.14588237 0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01       0.01
     0.01       0.01       0.01       0.01       0.01      ]
    
    

     

    2、基于自己数据的网络训练和测试

    • 设计神经网络
    import numpy as np
    import scipy.special as S
    import matplotlib.pyplot as plt
    #python自带的库,主要用于读取和存储图像
    import imageio 
    #glob是python自带的一个文件操作相关模块,用于查找想要的文件,支持通配符操作
    import glob
    class neuralNetwork:
    #初始化神经网络,构造函数
        def __init__(self, inputnodes, hiddennodes, outputnodes, learningrate):
            #设置每个输入、隐藏、输出层中的节点数
            self.inodes = inputnodes
            self.hnodes = hiddennodes
            self.onodes = outputnodes
            
            #链接权重矩阵,wih和who
            # weights inside the arrays are w_i_j, where link is from node i to node j in the next layer
            # w11 w21
            # w12 w22 etc 
            self.wih = np.random.normal(0.0, pow(self.inodes, -0.5), (self.hnodes, self.inodes))
            self.who = np.random.normal(0.0, pow(self.hnodes, -0.5), (self.onodes, self.hnodes))
            
            #学习率
            self.lr = learningrate
            
            #创建激活函数(函数的另一种定义方法,这样以后可以直接调用)
            self.activation_function = lambda x: S.expit(x)
            
            pass
        
    #训练神经网络
        def train(self, inputs_list, targets_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            targets = np.array(targets_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #计算隐藏层中输出的信号(使用激活函数计算)
            hidden_outputs = self.activation_function(hidden_inputs)
            #将传输的信号计算到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #计算输出层中输出的信号(使用激活函数)
            final_outputs = self.activation_function(final_inputs)
            
            #计算输出层的误差:(target - actual)(预期目标输出值-实际计算得到的输出值)
            output_errors = targets - final_outputs
            #隐藏层的误差:是输出层误差按权重分割,在隐藏节点上重新组合
            hidden_errors = np.dot(self.who.T, output_errors)
            
            #反向传播,更新各层权重
            #更新隐层和输出层之间的权重
            self.who += self.lr*np.dot((output_errors*final_outputs*(1.0 - final_outputs)), np.transpose(hidden_outputs))
            #更新输入层和隐藏层之间的权重
            self.wih += self.lr*np.dot((hidden_errors*hidden_outputs*(1.0 - hidden_outputs)), np.transpose(inputs))
            #pass一般用于占位置,定义一个空函数程序会报错,当没有想好函数的内容可以用pass填充,使得程序正常运行
            pass
        
    #查询神经网络:接受神经网络的输入,返回神经网络的输出
        def query(self, inputs_list):
            #将输入列表转换成二维数组
            inputs = np.array(inputs_list, ndmin = 2).T
            
            #将输入信号计算到隐藏层
            hidden_inputs = np.dot(self.wih, inputs)
            #将信号从隐藏层输出
            hidden_outputs = self.activation_function(hidden_inputs)
            #将信号引入到输出层
            final_inputs = np.dot(self.who, hidden_outputs)
            #将信号从输出层输出
            final_outputs = self.activation_function(final_inputs)
            
            #返回输出层的输出值
            return final_outputs
    • 设置参数

    input_nodes = 784
    hidden_nodes = 200
    output_nodes = 10
    learning_rate = 0.1
    n = neuralNetwork(input_nodes, hidden_nodes, output_nodes, learning_rate)
    • 加载训练数据集训练
     #将mnist的训练数据CSV文件加载到一个列表中
    training_data_file = open("mnist_dataset/mnist_train.csv", 'r')
    training_data_list = training_data_file.readlines()
    training_data_file.close()
    
    #训练神经网络
    #epochs是用于训练数据集的次数,有些人把训练一次叫做一个世代,
    epochs = 10
    for e in range(epochs):
        for record in training_data_list:
            all_values = record.split(',')
            inputs = (np.asfarray(all_values[1:]) / 255.0*0.99) + 0.01
            targets = np.zeros(output_nodes) + 0.01
            targets[int(all_values[0])] = 0.99
            n.train(inputs, targets)
            pass
        pass
    • 导入自己的数据集
    #定义一个列表,存储自己手写数字的数据
    our_own_dataset = []
    #对每个自己的手写数字处理,获得MNIST的数据集对应的CSV格式数据,并存储到定义的列表中
    for image_file_name in glob.glob('my_own_dataset/2828_my_own_?.png'):
        #记录自己手写数字的正确标签
        label = int(image_file_name[-5:-4])
        #将图像数据从png文件加载到数组中
        img_array = imageio.imread(image_file_name, as_gray = True)
        #将28*28的方块数组变成很长的一段数值,正常情况下,像素值:0代表黑色,255代表白色,但MNIST数据集存储的像素值相反。
        img_data = 255.0 - img_array.reshape(784)
        img_data = (img_data / 255.0*0.99) + 0.01
        #将标签和对应的数据添加到测试数据中,即我们的数据集
        #np.append(arr,values,axis=None),将value插入到目标arr的后面,values和arr应该具有相同的维度
        record = np.append(label,img_data)
        our_own_dataset.append(record)
        pass
    • 测试单个手写数字
    #测试自己的手写数字数据集
    item = 2
    #显示图片
    plt.imshow(our_own_dataset[item][1:].reshape(28,28), cmap = 'Greys', interpolation='None')
    correct_label = our_own_dataset[item][0]
    inputs = our_own_dataset[item][1:]
    
    outputs = n.query(inputs)
    print(outputs)
    
    label = np.argmax(outputs)
    print("network says ", label)
    if (label == correct_label):
        print("match")
    else:
        print("no match")
        pass
    • 测试结果 

    其他测试结果:

                        

                           

     

    四、提高识别正确率的改进方法

     

    1、调整学习率

    可以将学习率(learning_rate)调大或者调小,进行训练测试,看最后的等分情况,即识别准确率,本设计(3层神经网络与MNIST数据集)不同学习率的具体得分情况如下图所示:

    可知,学习率在0.05到0.3之间可能会有较好的表现。个人训练的结果可能会有差异,因为代码运行的整个过程有一定的随机性。

     

    2、增加一定的训练次数

    增加一定的训练次数(也有人称训练一次为一个世代),可以提高训练模型的性能,从而提高后期测试时,模型的识别准确率。但值得注意的是:过多的训练,会使得网络出现过拟合现象,即网络过度拟合训练数据,从而降低训练出模型的识别准确率,这种过拟合现象在各种类型的机器学习中都会存在。

    不同次数训练(不同数目的世代)下模型的识别准确率的结果可以参考下图:

     

    尝试:可以同时改变学习率和训练次数进行尝试,但有一点需要明白的是:要正确、科学的得到最好的结果,需要为每个学习率和训练次数组合进行多次试验,尽量减小在梯度下降过程中随机性的影响,从而得到最优的结果。

     

     

    3、改变网络结构

    隐藏层节点前后的链接权重具有学习能力,可以试着改变中间隐藏层的节点数目,合理的进行改变,若设置为4,这样就不可能有足够的空间让网络去学习任何知识,将所有的输入转换成正确的输出。(这就想是让5L的瓶子盛50L的水一样,不能完成的任务)。

    如果隐藏层的节点选取过多,例如10000个,此时有太多的路径供学习选择,因此难以训练网络,此需要设置更多的训练次数来训练网络,这样会大大加重计算的算力,耗时。

    因此我们需要在可以容忍的运行时间内选择某个数目的隐藏层节点进行训练。本网络可参考下图:

     

     

     

    展开全文
  • 社区发现数据集

    万次阅读 多人点赞 2016-04-07 23:09:05
    社区发现数据集目录社区发现数据集目录 基于链接分析的数据集 基于链接与离散型属性的数据集 基于链接与文本型属性的数据集 其他常见的数据集链接基于链接分析的数据集 Zachary karate club Zachary 网络是通过对一...

    社区发现数据集

    目录

    基于链接分析的数据集

    • Zachary karate club

      Zachary 网络是通过对一个美国大学空手道俱乐部进行观测而构建出的一个社会网络.网络包含 34 个节点和 78 条边,其中个体表示俱乐部中的成员,而边表示成员之间存在的友谊关系.空手道俱乐部网络已经成为复杂网络社区结构探测中的一个经典问题[1]。【下载地址

    • American College football

      College Football 网络. Newman 根据美国大学生足球联赛而创建的一个复杂的社会网络.该网络包含 115个节点和 616 条边,其中网络中的结点代表足球队,两个结点之间的边表示两只球队之间进行过一场比赛.参赛的115支大学生代表队被分为12个联盟。比赛的流程是联盟内部的球队先进行小组赛,然后再是联盟之间球队的比赛。这表明联盟内部的球队之间进行的比赛次数多于联盟之间的球队之间进行的比赛的次数.联盟即可表示为该网络的真实社区结构[2]。【下载地址

    • Dolphin social network

      Dolphin 数据集是 D.Lusseau 等人使用长达 7 年的时间观察新西兰 Doubtful Sound海峡 62 只海豚群体的交流情况而得到的海豚社会关系网络。这个网络具有 62 个节点,159 条边。节点表示海豚,而边表示海豚间的频繁接触[3]。【下载地址

    • netscience dataset

      Netscience is a coauthorship network of scientists working on network theory and experiment. The dataset contains all components of the network, for a total of 1589 scientists [12]. 【下载地址, 访问密码:4bfc】


    基于链接与离散型属性的数据集

    • Political blogs

      该 数 据 集 由Lada Adamic于2005年编译完成, 表示博客的政治倾向。 包含1490个结点和19090条边。数据集中的每个结点都有一个属性描述(用0或者1表示),表示民主或者保守[4] 。【下载地址

    • DBLP Dataset

      Digital Bibliography Project (DBLP) is a computer science bibliography. In this data set, authors are considered as users, the paper titles of the authors are the text of users and the coauthorship relationship forms the links of users.
      DBLP每月更新的数据地址
      DBLP处理后的数据集数据地址
      DBLP数据集【使用说明1使用说明2

      • DBLP-10K
        DBLP Bibliography data from four research areas of database (DB), data mining (DM), information retrieval (IR) and artificial intelligence (AI) 3. We build a coauthor graph with top 5, 000 authors and their coauthor relationships. In addition, we use two relevant attributes: prolific and primary topic. For attribute “prolific”, authors with ≥ 20 papers are labeled as highly prolific; authors with ≥ 10 and < 20 papers are labeled as prolific and authors with < 10 papers are labeled as low prolific. For attribute “primary topic”, we use a topic modeling approach (PLSA) to extract 100 research topics from a document collection composed of paper titles from the selected authors. Each extracted topic consists of a probability distribution of keywords which are most representative of the topic. Then each author will have one out of 100 topics as his/her primary topic [5]. 【下载地址 访问密码 0674】
      • DBLP-1K, DBLP-5K
        两个数据集,则是直接从DBKP-10K数据集中选择TOP 1000、5000作者构成的数据集。DBLP-5K可参考文献 [6]
    • Facebook Friendship Datasets

      The datasets contain the Facebook networks (from a date in Sept. 2005) from these colleges: Caltech, Princeton, Georgetown and UNC Chapel Hill. The links represent the friendship on Facebook. Each user has the following attributes: ID, a student/faculty status flag, gender, major, second major/minor (if applicable), dormitory(house), year and high school [10].【下载地址, 访问密码:264c】.

    基于链接与文本型属性的数据集

    • Enron Email Dataset

      This dataset was collected and prepared by the CALO Project (A Cognitive Assistant that Learns and Organizes). It contains data from about 150 users, mostly senior management of Enron, organized into folders [7].【下载地址

      • Enron Mail subset
        A subset of about 1700 labeled email messages (4.5M). These were chosen in a semi-motivated fashion (focusing on business-related emails and the California Energy Crises and on emails that occurred later in the collection, trying to avoid very personal messages, jokes, and so on). Students in the ANLP course annotated the selected messages with the category labels. Each message was labeled by two people, but no claims of consistency, comprehensiveness, nor generality are made about these labelings. 该子数据集参照【分类】分为11类。【下载地址
        2005年3月版本的【Enron mail数据集
    • CiteSeer

      The CiteSeer dataset consists of 3312 scientific publications classified into one of six classes. The citation network consists of 4732 links. Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary. The dictionary consists of 3703 unique words. The README file in the dataset provides more details. Click here to download the tarball containing the dataset [8]. 【下载地址

    • Cora

      The Cora dataset consists of 2708 scientific publications classified into one of seven classes. The citation network consists of 5429 links. Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary. The dictionary consists of 1433 unique words. The README file in the dataset provides more details [8].【下载地址

    • WebKB

      The WebKB dataset consists of 877 scientific publications classified into one of five classes. The citation network consists of 1608 links. Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary. The dictionary consists of 1703 unique words. The README file in the dataset provides more details [9].【下载地址

    • Terrorists

      The WebKB dataset consists of 877 scientific publications classified into one of five classes. The citation network consists of 1608 links. Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary. The dictionary consists of 1703 unique words. The README file in the dataset provides more details. 【下载地址

    • Terrorist Attacks

      This dataset consists of 1293 terrorist attacks each assigned one of 6 labels indicating the type of the attack. Each attack is described by a 0/1-valued vector of attributes whose entries indicate the absence/presence of a feature. There are a total of 106 distinct features. The files in the dataset can be used to create two distinct graphs. The README file in the dataset provides more details.【下载地址

    • Flickr数据集

      The Flickr image sharing network consists of nodes which represent Flickr users, and edges indicate follow relations between users. We use tags of images uploaded by a given user as her attributes. In this network, the ground-truth communities are defined as user-created interest-based groups that have more than five members. 【下载地址, 访问密码:ffdb】

    其他常见的数据集链接

    • Social networks
      online social networks, edges represent interactions between people
    • Networks with ground-truth communities
      ground-truth network communities in social and information networks
    • Communication networks
      email communication networks with edges representing communication
    • Citation networks
      nodes represent papers, edges represent citations
    • Collaboration networks
      nodes represent scientists, edges represent collaborations (co-authoring a paper)
    • Web graphs
      nodes represent webpages and edges are hyperlinks
    • Amazon networks
      nodes represent products and edges link commonly co-purchased products
    • Internet networks
      nodes represent computers and edges communication
    • Road networks
      nodes represent intersections and edges roads connecting the intersections
    • Autonomous systems
      graphs of the internet
    • Signed networks
      networks with positive and negative edges (friend/foe, trust/distrust)
    • Location-based online social networks
      Social networks with geographic check-ins
    • Wikipedia networks and metadata
      Talk, editing and voting data from Wikipedia
    • Twitter and Memetracker
      Memetracker phrases, links and 467 million Tweets
    • Online communities
      Data from online communities such as Reddit and Flickr
    • Online reviews
      Data from online review systems such as BeerAdvocate and Amazon

    Mark Newman收集的数据集

    介绍及相关社区发现算法:http://www-personal.umich.edu/~mejn/
    数据集:http://www-personal.umich.edu/~mejn/netdata/

    Social and Information Network Analysis


    [1]: W. W. Zachary, An information flow model for conflict and fission in small groups, Journal of Anthropological Research 33, 452-473 (1977)
    [2]: M. Girvan and M. E. J. Newman, Proc. Natl. Acad. Sci. USA 99, 7821-7826 (2002).
    [3]: V.Lusseau, K .Schneider, OJ .Boisseau et al. The Bottlenose Dolphin Community of Doubtful Sound Features a Large Proportion of Long-Lasting Associations. Behavioral Ecology and Sociobiology, 2003, 54(4):392-405
    [4]: L. A. Adamic and N. Glance, “The political blogosphere and the 2004 US Election”, in Proceedings of the WWW-2005 Workshop on the Weblogging Ecosystem (2005)
    [5]: Zhou Y, Cheng H, Yu J X. Clustering large attributed graphs: An efficient incremental approach[C]//Data Mining (ICDM), 2010 IEEE 10th International Conference on. IEEE, 2010: 689-698.
    [6]: Zhou Y, Cheng H, Yu J X. Graph clustering based on structural/attribute similarities[J]. Proceedings of the VLDB Endowment, 2009, 2(1): 718-729.
    [7]: Klimt B, Yang Y. Introducing the Enron Corpus[C]//CEAS. 2004.
    [8]: Yang T, Jin R, Chi Y, et al. Combining link and content for community detection: a discriminative approach[C]//Proceedings of the 15th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2009: 927-936.
    [9]: Lu Q, Getoor L. Link-based classification[C]//ICML. 2003, 3: 496-503.
    [10]: Dang T A, Viennet E. Community detection based on structural and attribute similarities[C]//International Conference on Digital Society (ICDS). 2012: 7-12.
    [11]: Xirong Li, Cees G.M. Snoek, and Marcel Worring, Learning Social Tag Relevance by Neighbor Voting, in IEEE Transactions on Multimedia (T-MM), 2009
    [12]: Newman M E J. Finding community structure in networks using the eigenvectors of matrices[J]. Physical review E, 2006, 74(3): 036104.

    声明:本文仅对相关数据集进行说明,并提供相应的链接,如需转载,请注明本文链接:http://blog.csdn.net/wzgang123/article/details/51089521

    展开全文
  • 从上到下|图网络开放数据集

    千次阅读 2020-09-04 12:14:22
    从上到下|图网络开放数据集 很多学者和机构发布了许多与图相关的任务,以测试各种GNN的性能。这些任务一般都会提供数据集。 按照任务分类,可以把数据集分成以下几类: 引文网络 生化图 社交网络 知识图谱 开源...

    从上到下|图网络开放数据集

    很多学者和机构发布了许多与图相关的任务,以测试各种GNN的性能。这些任务一般都会提供数据集。


    按照任务分类,可以把数据集分成以下几类:

    • 引文网络
    • 生化图
    • 社交网络
    • 知识图谱
    • 开源数据集仓库


    参考资料:

    1. A Comprehensive Survey on Graph Neural Networks
    2. Introduction to Graph Neural Networks

    引文网络

    Pubmed/Cora/Citeseer

    引文网络,节点为论文、边为论文间的引用关系。这三个数据集通常用于链路预测或节点分类。


    这三个数据集均来自于:
    《Collective classification in network data》


    下载链接可从以下网址找到:
    https://linqs.soe.ucsc.edu/data

    DBLP

    DBLP是大型的计算机类文献索引库。原始的DBLP只是XML格式,清华唐杰教授的一篇论文将其进行处理并获得引文网络数据集。到目前为止已经发展到了第12个版本。


    DBLP引用网络论文:
    《ArnetMiner: Extraction and Mining of Academic Social Networks》

    • 原始数据可以从这里获得:

    https://dblp.uni-trier.de/xml/

    • 如果是想找处理过的DBLP引文网络数据集,可以从这里获得:

    https://www.aminer.cn/citation

    数据集 节点数 边数 特征 标签
    Cora 2,708 5,429 1,433 7
    Citeseer 3,327 4,732 3,703 6
    Pubmed 19,717 44,338 500 3
    DBLP_v12 4,894,081 45,564,149 - -

    生化图

    PPI

    蛋白质-蛋白质相互作用(protein-protein interaction, PPI)是指两个或两个以上的蛋白质分子通过非共价键形成 蛋白质复合体(protein complex)的过程。


    PPI数据集中共有24张图,其中训练用20张,验证/测试分别2张。


    节点最多可以有121种标签(比如蛋白质的一些性质、所处位置等)。每个节点有50个特征,包含定位基因集合、特征基因集合以及免疫特征。

    PPI论文
    《Predicting multicellular function through multi-layer tissue networks》
    PPI下载链接
    http://snap.stanford.edu/graphsage/ppi.zip

    NCI-1

    NCI-1是关于化学分子和化合物的数据集,节点代表原子,边代表化学键。NCI-1包含4100个化合物,任务是判断该化合物是否有阻碍癌细胞增长的性质。


    NCI-1论文
    《Comparison of descriptor spaces for chemical compound retrieval and classification》


    Graph Kernel Datasets提供下载

    MUTAG

    MUTAG数据集包含188个硝基化合物,标签是判断化合物是芳香族还是杂芳族。


    MUTAG论文
    《Structure-activity relationship of mutagenic aromatic and heteroaromatic nitro compounds. correlation with molecular orbital energies and hydrophobicity》

    Graph Kernel Datasets提供下载

    D&D/PROTEIN

    D&D在蛋白质数据库的非冗余子集中抽取了了1178个高分辨率蛋白质,使用简单的特征,如二次结构含量、氨基酸倾向、表面性质和配体;其中节点是氨基酸,如果两个节点之间的距离少于6埃(Angstroms),则用一条边连接。


    PROTEIN则是另一个蛋白质网络。任务是判断这类分子是否酶类。


    D&D论文:
    《Distinguishing enzyme structures from non-enzymes without alignments》
    D&D下载链接:
    https://github.com/snap-stanford/GraphRNN/tree/master/dataset/DD


    PROTEIN论文:
    《Protein function prediction via graph kernels》

    Graph Kernel Datasets提供下载

    PTC

    PTC全称是预测毒理学挑战,用来发展先进的SAR技术预测毒理学模型。这个数据集包含了针对啮齿动物的致癌性标记的化合物。


    根据实验的啮齿动物种类,一共有4个数据集:

    • PTC_FM(雌性小鼠)
    • PTC_FR(雌性大鼠)
    • PTC_MM(雄性小鼠)
    • PTC_MR(雄性大鼠)


    PTC论文:
    《Statistical evaluation of the predictive toxicology challenge 2000-2001》


    Graph Kernel Datasets提供下载


    QM9

    这个数据集有133,885个有机分子,包含几何、能量、电子等13个特征,最多有9个非氢原子(重原子)。来自GDB-17数据库。


    QM9论文:
    《Quantum chemistry structures and properties of 134 kilo molecules》
    QM9下载链接:
    http://quantum-machine.org/datasets/


    Alchemy

    Alchemy包含119,487个有机分子,其有12个量子力学特征(quantum mechanical properties),最多14个重原子(heavy atoms),从GDB MedChem数据库中取样。扩展了现有分子数据集多样性和容量。


    Alchemy论文:
    《Alchemy: A quantum chemistry dataset for benchmarking ai models》
    Alchemy下载链接:
    https://alchemy.tencent.com/


    数据集 图数 节点数 边数 特征 标签
    PPI 24 56,944 818,716 50 121
    NCI-1 4110 29.87 32.30 37 2
    MUTAG 188 17.93 19.79 7 2
    D&D 1178 284.31 715.65 82 2
    PROTEIN 1,113 39.06 72.81 4 2
    PTC_MR 344 14.29 14.69 - 2
    QM9 133,885 - - - -
    Alchemy 119,487 - - - -

    社交网络

    Reddit

    Reddit数据集是由来自Reddit论坛的帖子组成,如果两个帖子被同一人评论,那么在构图的时候,就认为这两个帖子是相关联的,标签是每个帖子对应的社区分类。

    Reddit论文:
    《Inductive representation learning on large graphs》
    Reddit下载链接:
    https://github.com/linanqiu/reddit-dataset

    BlogCatalog

    BlogCatalog数据集是一个社会关系网络,图是由博主及其社会关系(比如好友)组成,标签是博主的兴趣爱好。


    BlogCatalog论文:
    《Relational learning via latent social dimensions》
    BlogCatalog下载链接:
    http://socialcomputing.asu.edu/datasets/BlogCatalog

    数据集 节点数 边数 特征 标签
    Reddit 232965 11606919 602 41
    BlogCatalog 10312 333983 - 39

    知识图谱

    FB13/FB15K/FB15K237

    这三个数据集是Freebase的子集。其中:

    • FB13:包含13种关系、75043个实体。
    • FB15K:包含1345种关系、14951个实体
    • FB15K237:包含237种关系、14951个实体


    如果希望找到entity id对应的实体数据,可以通过以下渠道(并不是所有的实体都能找到):

    WN11/WN18/WN18RR

    这三个是WordNet的子集:

    • WN11:包含11种关系、38696个实体
    • WN18:包含18种关系、40943个实体
    • WN18RR:包含11种关系、40943个实体

    为了避免在评估模型时出现inverse relation test leakage,建议使用FB15K237/WN18RR来替代FB15K/WN18。更多建议阅读《Convolutional 2D Knowledge Graph Embeddings》

    FB15K/WN8论文
    《Translating Embeddings for Modeling Multi-relational Data》
    FB13/WN11论文
    《Reasoning With Neural Tensor Networks for Knowledge Base Completion》
    WN18RR论文
    《Convolutional 2D Knowledge Graph Embeddings》


    以上6个知识图谱数据集均可从这里下载:
    https://github.com/thunlp/OpenKE/tree/master/benchmarks


    数据集 关系 实体数
    FB13 13 75043
    FB15K 1345 14951
    FB15K237 237 14951
    WN11 11 38696
    WN18 18 40943
    WN18RR 11 40943

    开源的数据仓库

    Network Repository

    具有交互式可视化和挖掘工具的图数据仓库。具有以下特点:

    • 用表格的形式展示每一个图数据集的节点数、遍数、平均度数、最大度数等。
    • 可视化对比图数据集之间的参数。
    • 在线GraphVis,可视化图结构和详细参数。


    http://networkrepository.com


    ![](https://imgconvert.csdnimg.cn/aHR0cHM6Ly9jZG4ubmxhcmsuY29tL3l1cXVlLzAvMjAyMC9wbmcvMzQxNTU3LzE1OTkxNDgwMzAxMjMtZmRjZDAxNzktODMzNi00ZjhhLWFlYjUtMzA1ZmViYzQzNWYxLnBuZw?x-oss-process=image/format,png#align=left&display=inline&height=819&margin=[object Object]&name=image.png&originHeight=1638&originWidth=2354&size=894481&status=done&style=none&width=1177)

    Graph Kernel Datasets

    图核的基准数据集。提供了一个表格,可以快速得到每个数据集的节点数量、类别数量、是否有节点/边标签、节点/边特征。


    https://ls11-www.cs.tu-dortmund.de/staff/morris/graphkerneldatasets



    Relational Dataset Repository

    关系机器学习的数据集集合。能够以数据集大小、领域、数据类型等条件来检索数据集。


    https://relational.fit.cvut.cz



    Stanford Large Network Dataset Collection

    SNAP库用于大型社交、信息网络。包括:图分类数据库、社交网络、引用网络、亚马逊网络等等,非常丰富。


    https://snap.stanford.edu/data/


    Open Graph Benchmark

    OGB是真实基准数据集的集合,同时提供数据加载器和评估器(PyTorch)。可以自动下载、处理和切割;完全兼容PyG和DGL。


    https://ogb.stanford.edu/



    在这里插入图片描述

    展开全文
  • Network Representation 网络节点嵌入

    万次阅读 2016-08-10 21:21:07
    Network Representation ...Network Representation可以翻译为网络(节点)表征、网络(节点)向量、网络(节点)嵌入等… Aim to learn distributed vector representation for each vertex in a network.
  • Pythorch Geometric还包含大量常见的基准数据集,例如所有的Planetoid数据集(Cora、Citeseer、Pubmed),所有来自http://graphkernels.cs.tu-dortmund.de和清理后的版本,QM7和QM9数据集,以及一些3D网格/点云数据...
  • python实现RBF神经网络识别Mnist数据集 作者:ExcelMann,转载需注明。 话不多说,直接贴代码,代码有注释。 # Author:Xuangan, Xu # Data:2020-11-11 """ RBF神经网络 ----------------- 设计RBF神经网络实现手写...
  • python实现BP神经网络识别Mnist数据集 作者:ExcelMann,转载需注明。 话不多说,直接贴代码,代码有注释。 # Author:Xuangan, Xu # Data:2020-10-28 """ BP神经网络 ----------------- 利用梯度下降法,实现MNIST...
  • IDE:pycharm Python: Python3.6 OS: win10 tf : CPU版本 ...一、CIFAR10数据集 数据集代码下载 from tensorflow.models.tutorials.image.cifar10 import cifar10 cifar10.maybe_dow...
  • 深度学习开源数据集大全

    千次阅读 2019-01-01 19:48:11
    skymind.ai网站上有一份十分全面的开源数据集,涵盖自然图像数据集、面部数据集等多个领域,为方面大家找到自己需要的数据集,将skymind.ai整理的数据集编译如下:     自然图像数据集   MNIST: handwritten...
  • 人工智能大数据,公开的海量数据集下载,ImageNet数据集下载,数据挖掘机器学习数据集下载 ImageNet挑战赛中超越人类的计算机视觉系统 微软亚洲研究院视觉计算组基于深度卷积神经网络(CNN)的计算机视觉系统,在...
  • 本文介绍一些常用的深度学习关于图像处理方面的常用公开数据集的下载链接,以及数据集的简单介绍。 MNIST数据集 MNIST数据集MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片: 相当于深度学习...
  • 基于python的BP神经网络算法对mnist数据集的识别 目录: 1. mnist数据集 1.1 mnist数据集是什么 1.2 mnist数据集的读取** 2. 神经网络 2.1 批处理数据 2.2 前向传播 2.2.1 sigmoid和softmax函数 2.2.2 损失函数 ...
  • 亚马逊AWS高级技术顾问Will Badr介绍了8种寻找机器学习数据集的方法 1、Kaggle数据集   Kaggle的数据集中,包含了用于各种任务,不同规模的真实数据集,而且有许多不同的格式。此外,你还可以在这里找到与每个...
  • 1.karate美国空手道俱乐部 *2.Dolphin海豚网络 3.football网络
  • 利用一个训练好的网络在自己的数据集上进行训练,就是一个迁移学习的过程。它适用于自己的数据集比较小,且自己的数据集与原网络的训练集特征有较大重合的情况。其基本原理是只训练已有网络的一部分参数,从而得到较...
  • 最近研究faster rcnn,一开始使用的是公开的数据集训练测试自己的网络性能,后来老板项目需求,需要用自己的数据集,但是数据集又是另一个人在另一台电脑上标注生成的,要直接在服务器下训练还不是很方便,主要是xml...
  • 数据集合集】智能交通和无人驾驶相关一、无人驾驶数据集:1. The H3D Dataset:2. nuscenes:3. ApolloCar3D:4. KITTI Vision Benchmark Suite:5. Cityscape Dataset:6. Mapillary Vistas Dataset: 一、无人...
  • 神经网络实现Mnist数据集简单分类

    千次阅读 2018-07-31 22:28:19
    本文针对mnist手写数字集,搭建了四层简单的神经网络进行图片的分类,详细心得记录下来分享 我是采用的TensorFlow框架进行的训练 ...首先要加载数据集 #加载数据集 mnist = input_data.read_da...
  • LeNet-5模型是Yann LeCun教授与1998年在论文Gradient-based learning applied to document recognition中提出的,它是第一个成功应用...在MNIST数据集上,LeNet-5模型可以达到大约99.2%的正确率。 LeNet-5模型总共...
  • GCN使用的数据集Cora、Citeseer、Pubmed、Tox21格式

    万次阅读 多人点赞 2019-09-14 17:28:06
    本文分享一下图卷积网络GCN里用到的一些数据集的格式 Cora、Citeseer、Pubmed 数据集 来源 #图 #节点 #边 #特征 #标签(y) Cora “Collective classification in network data,” AI ...
  • 深度学习神经网络 MNIST数据集

    千次阅读 2020-03-01 15:47:49
    从mnist数据集中导入数据,并存在./data/中。 from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/',one_hot=True) 打印出训练,检验,测试的个数。 ...
  • 使用Tensorflow创建自己的数据集,并训练 自学入坑,尝试着写博客记录自己的学习过程,希望对其他人也有帮助 介绍环境 win10 + pycharm 介绍背景 小弟是某高校农业电气自动化学生,导师要求用卷积神经网络对...
  • 利用BP神经网络对语音特征信号数据集进行分类

    千次阅读 热门讨论 2017-05-21 11:19:01
    (当然那代码不能公开了)我这里用的是《MATLAB神经网络43个案例分析》这本书中的语音数据集。(PS:神经网络的学习笔记没时间整理,马上蓝桥杯国赛,比赛结束回学校又是课设,这学期为了机器学习专业课也就是上课...
  • GNN常用数据集之Cora数据集

    千次阅读 2020-01-02 09:33:37
    在学习图神经网络 GNN 之前,必然要了解一些GNN的常用数据集,这篇博客主要以Cora数据集为例介绍GNN的数据集格式与读取方式,并以一个项目实例进行说明。 GNN常用数据集:https://linqs.soe.ucsc.edu/data 1. ...
  • 在开始介绍下面的算法问题之前,我们首先从提出一个问题,给定一个某些节点具有分类标签网络结构,我们应该如何去预测网络中其他节点标签呢? 这种节点分类的方式称为半监督的节点分类。 一、网络中的相关性 在...
  • 数据集

    千次阅读 2018-07-09 17:45:07
    人工智能大数据,公开的海量数据集下载,ImageNet数据集下载,数据挖掘机器学习数据集下载ImageNet挑战赛中超越人类的计算机视觉系统微软亚洲研究院视觉计算组基于深度卷积神经网络(CNN)的计算机视觉系统,在ImageNet...
  • 科学家对这个问题进行了几十年的研究,直到最近,才取得了一些比较好的进展,如神经网络这样的方法则是构成这些飞跃的重要部分。 为了让你对图像识别究竟有多难有一个感性认识,举个例子,人类有时候对图像中包含的...
  • 下图表示football数据集节点部分信息 下图表示football数据集边的部分信息 根据上述两个图中的格式对football数据集的格式介绍可以介绍为如下所示: Creator "Mark Newman on Sat Jul 22 05:32:16 ...
  • 【神经网络与深度学习】使用MNIST数据集训练手写数字识别模型——[附完整训练代码]。发现csdn平台上似乎还没有一篇完整的介绍MNIST数据集、完整训练代码和训练好的模型文件,故发此文来对MNIST做一个详细的整合。 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 43,612
精华内容 17,444
关键字:

网络数据集节点标签