精华内容
下载资源
问答
  • pytorch如何搭建GCN有关的网络

    千次阅读 2020-01-01 11:15:48
    前言:本人研究领域为交通方面,做科研需要搭建GCN有关的网络,比如GCN-GAN【1】,基于GCN的权值完成网络【2】,以及基于这些网络的新的GCN网络框架。但是搜索了一些网上使用pytorch搭建GCN网络的资料,只有github...

    前言:本人研究领域为交通方面,做科研需要搭建GCN有关的网络,比如GCN-GAN【1】,基于GCN的权值完成网络【2】,以及基于这些网络的新的GCN网络框架。但是搜索了一些网上使用pytorch搭建GCN网络的资料,只有github上面的无解释代码和最近几年发表的论文,有详细讲解的资料很少,这对于快速入门GCN实战,会有很大的门槛,鉴于此,经过几天的探索实战,我将自己的关于使用pytorch搭建GCN类型网络的经验分享在这里,对论文和代码如何对应做一个解释说明,包括卷积、池化之后特征矩阵、邻接矩阵等维度的变化,对常见的关于GCN和pytorch.geometric的资料进行总结说明,并且拿出一个框架代码进行详细注释,为使用GCN实战入门提供一点帮助,也方便自己日后查阅。

    一. 现有资料说明

    1.github网站https://github.com/rusty1s/pytorch_geometric上面是最近几年发表的论文源码pytorch的实现:

     

    目录examples下面是常见的论文里面提到的数据集的实验,包括根据酶结构进行图的分类,auto-encoder,诸如此类

    后面我会以里面的enzymes_topk_pool.py(使用topk pool池化方式根据酶的结构进行分类,是论文Graph U-Nets提到的一种池化方式)代码为例进行详细说明

    examples下面所有py代码的对应实验我也没有完全对应起来,但是都是github下面的论文里面提到的实验,在用到的时候可以自己找一找

    2. pytorch下面有一个geometric包专门用来搭建GCN网络,中文文档地址为:

    https://pytorch-geometric.readthedocs.io/en/latest/index.html

    有些上面提到的github中论文的源码会直接转跳到这个网站,但是这个文档的缺点是对于一些参数的说明比较难懂,很多一笔带过,不知道输出是什么,如何使用,这就需要我们将这个文档的源码和对应的论文结合起来看

    这个网站中的一些方法下面都列出了对应的论文和源码

    二. 代码详细说明

    下面就以github里面examples下面的enzymes_topk_pool.py代码为例,结合论文和源码进行参数设置、维度变化等的说明

    (1)首先是用到的包和数据加载部分,加载的数据是TUDataset里面的酶的结构数据,其中的batch_size=80表示每个批次有80张图,因为这是一个分类问题,所以对应的y值是每张图的类别值

    import os.path as osp
    
    import torch
    import torch.nn.functional as F
    from torch_geometric.datasets import TUDataset
    from torch_geometric.data import DataLoader
    from torch_geometric.nn import GraphConv, TopKPooling
    from torch_geometric.nn import global_mean_pool as gap, global_max_pool as gmp
    
    path = osp.join(osp.dirname(osp.realpath('__file__')), '..', 'data', 'ENZYMES')
    dataset = TUDataset(path, name='ENZYMES')
    dataset = dataset.shuffle()
    #print("dataset.num_classes=",dataset.num_classes)
    n = len(dataset) // 10
    test_dataset = dataset[:n]#这个表示拿出十分之一用来测试
    train_dataset = dataset[n:]#后面的十分之九用来训练
    test_loader = DataLoader(test_dataset, batch_size=80)#表示一个批次
    train_loader = DataLoader(train_dataset, batch_size=80)

    (2)DataLoader函数自动将数据分成了10份,返回的是一个迭代器,下面的代码将train_loader中的内容打印出来看看,并进行解释:

    for data in train_loader:
        
        print("data=",data)
        print("data.batch=",data.batch)
        print("data.batch.shape=",data.batch.shape)
        print("data.x.shape=",data.x.shape)
        print("data.num_features=",data.num_features)
        print("\n")

    这个循环的前两次循环的结果如下:

    data= Batch(batch=[2468], edge_index=[2, 9540], x=[2468, 3], y=[80])
    data.batch= tensor([ 0,  0,  0,  ..., 79, 79, 79])
    data.batch.shape= torch.Size([2468])
    data.x.shape= torch.Size([2468, 3])
    data.num_features= 3
    
    
    data= Batch(batch=[2588], edge_index=[2, 9854], x=[2588, 3], y=[80])
    data.batch= tensor([ 0,  0,  0,  ..., 79, 79, 79])
    data.batch.shape= torch.Size([2588])
    data.x.shape= torch.Size([2588, 3])
    data.num_features= 3
    

    可以看出data数据里面包含至少四部分,分别为batch,维度为1*2468维,表示这个batch中的80张图一共有2468个节点,batch这个变量里面的值表示该节点对应的是80张图里面的哪张图,从后面对batch值的打印也可以看到它的值为0-79共80个值

    edge_index里面存储的是邻接矩阵信息,具体如何构建的请参考链接【3】

    x是输入的特征矩阵,维度为2468*3,表示一共2468个节点,每个节点共3个特征

    y的维度为1*80,就表示这一batch中80张图每张图对应的分类类别

    (3)最后就是整个网络的构建和训练的代码:

    class Net(torch.nn.Module):
        def __init__(self):
            super(Net, self).__init__()
    
            self.conv1 = GraphConv(dataset.num_features, 128)#num_features表示节点的特征数,为3
            self.pool1 = TopKPooling(128, ratio=0.8)
            self.conv2 = GraphConv(128, 128)
            self.pool2 = TopKPooling(128, ratio=0.8)
            self.conv3 = GraphConv(128, 128)
            self.pool3 = TopKPooling(128, ratio=0.8)
    
            self.lin1 = torch.nn.Linear(256, 128)
            self.lin2 = torch.nn.Linear(128, 64)
            self.lin3 = torch.nn.Linear(64, dataset.num_classes)
    
        def forward(self, data):
            x, edge_index, batch = data.x, data.edge_index, data.batch
            #print("data.batch=",data.batch)
            print("raw_x.shape=",x.shape)
            x = F.relu(self.conv1(x, edge_index))
            print("conv1_x.shape=",x.shape)
            x, edge_index, _, batch, _, _ = self.pool1(x, edge_index, None, batch)
            print("x.shape=",x.shape)
            
            x_gmp=gmp(x, batch)
            x_gap=gap(x, batch)
            print("x_gmp.shape=",x_gmp.shape)
            print("x_gap.shape=",x_gap.shape)
            x1 = torch.cat([x_gmp, x_gap], dim=1)#表示在列上合并,增加更多的列
            print("x1.shape=",x1.shape)
    
            x = F.relu(self.conv2(x, edge_index))
            x, edge_index, _, batch, _, _ = self.pool2(x, edge_index, None, batch)
            x2 = torch.cat([gmp(x, batch), gap(x, batch)], dim=1)
            print("x2.shape=",x2.shape)
    
            x = F.relu(self.conv3(x, edge_index))
            x, edge_index, _, batch, _, _ = self.pool3(x, edge_index, None, batch)
            x3 = torch.cat([gmp(x, batch), gap(x, batch)], dim=1)
            print("x3.shape=",x3.shape)
    
            x = x1 + x2 + x3
            print("x+.shape=",x.shape)
    
            x = F.relu(self.lin1(x))
            x = F.dropout(x, p=0.5, training=self.training)
            x = F.relu(self.lin2(x))
            x = F.log_softmax(self.lin3(x), dim=-1)
            
            print("final_x.shape",x.shape)
            return x
    
    
    device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
    model = Net().to(device)
    optimizer = torch.optim.Adam(model.parameters(), lr=0.0005)
    
    
    def train(epoch):
        model.train()
    
        loss_all = 0
        for data in train_loader:
            print("raw_data.y.shape",data.y.shape)
            data = data.to(device)
            optimizer.zero_grad()
            output = model(data)
            print("data.y.shape=",data.y.shape)
            loss = F.nll_loss(output, data.y)
            loss.backward()
            loss_all += data.num_graphs * loss.item()
            optimizer.step()
            print("\n")
        return loss_all / len(train_dataset)
    
    
    def test(loader):
        model.eval()
    
        correct = 0
        for data in loader:
            data = data.to(device)
            pred = model(data).max(dim=1)[1]
            correct += pred.eq(data.y).sum().item()
            print("\n")
        return correct / len(loader.dataset)
    
    
    for epoch in range(1, 2):
        loss = train(epoch)
        train_acc = test(train_loader)
        test_acc = test(test_loader)
        print('Epoch: {:03d}, Loss: {:.5f}, Train Acc: {:.5f}, Test Acc: {:.5f}'.
              format(epoch, loss, train_acc, test_acc))
        print("\n")

    部分打印结果如下:

    raw_data.y.shape torch.Size([80])
    raw_x.shape= torch.Size([2468, 3])
    conv1_x.shape= torch.Size([2468, 128])
    x.shape= torch.Size([2004, 128])
    x_gmp.shape= torch.Size([80, 128])
    x_gap.shape= torch.Size([80, 128])
    x1.shape= torch.Size([80, 256])
    x2.shape= torch.Size([80, 256])
    x3.shape= torch.Size([80, 256])
    x+.shape= torch.Size([80, 256])
    final_x.shape torch.Size([80, 6])
    data.y.shape= torch.Size([80])

    根据打印结果对网络结构进行分析:

    先根据class Net画出整个变量的流向图:

    图中数字都表示维度

    可以看出主要用到GCN网络,Topk pool池化方式,global mean/max pool

    GCN网络使用的是论文【4】中提到的方法,根据当前l层得到l+1层主要的公式如下:

    前面的D和A是度矩阵和邻接矩阵跟单元矩阵I处理后的矩阵,整个H(l)的前半段可以看成是邻接矩阵A,这样的话需要学习的只有W这个参数矩阵。H(l)在输入层可以看成是特征矩阵X,这样上面的表达式就成了H(l+1)=AXW,假设输入的节点数为10,每个节点有3个特征,A的维度就为10*10,X为10*3,假设GCN的参数为(3,128),那么W的维度为3*128,最终经过一层GCN之后特征矩阵H的维度变成10*128。因此,GCN的两个重要参数in_channel 和out_channel其实表示的是W的维度,或者说in_channel是特征数,out_channel是输出的每个节点的特征数。

    因此,上图中输入的特征矩阵X(2468*3)经过一层GCN(3*128),输出的维度为2468*128,后面经过GCN的输出维度也是按照这样的方式计算。

    接着是Topk pool,这是【5】中实现的池化方式。

    思想主要是下面这张图:

    采用投影的方式,利用了一个可学习的投影向量p,输入的特征矩阵Xl的维度为num_node*num_feature,p的维度为num_feature*1,先是蓝色的x和黄色的p相乘,然后除以||p||,得到维度为num_node*1的y,在y中取前k个在p的投影方向上值最大的node对应的索引,得到对应的特征,然后和得到的投影值点乘,得到处理后的紫色的特征矩阵。下面就是根据索引得到新的邻接矩阵。

    Topk pool(128,0.8)中的参数128的意思是输入的每个节点的特征数,0.8表示保留80%的节点

    所以2468*128经过Topk pool(128,0.8)之后保留本batch中80%的2004个节点,每个节点的特征数仍然为128个,输出的维度为2004*128,可能有人会问2468*0.8为什么不是严格等于2004,这是因为这个pool是在本batch共80张图上做的,每个图的节点数乘以0.8都会取结果的上限整数,所以比2468*0.8=1974多几个节点。

    最后是gmp/gap:global max pool/global mean pool,这两个操作是在batch层次上进行的操作,输出的维度为80*128,80表示这个批次中有80张图,128表示每个节点的特征数

    以global mean pool为例,在某一张输入特征为Xn上面的操作是这样的:

    就是说在每个特征维度上,取所有节点在这个特征维度上面的最大值,如果输入的维度为num_node*num_feature

    那么这张图操作之后为1*num_feature

    那么为什么除了进行Topk pool之外,这里还要进行global pool呢,我觉得还是跟CNN中池化的作用一样,增加稀疏连接,加入正则化,防止模型过拟合。如果没有这个global pool的操作的话功能也是可以实现的,但是模型可能容易过拟合导致性能不好,就是说这里的global pool并不是必须的。其他的功能我还没有看出来,欢迎有更进一步理解的大佬指教。

     

    码字不易,如果有帮助到您,麻烦点个赞或者打赏一点,多少不限,谢谢!

     

    三. 参考资料:

    【1】GCN-GAN: A Non-linear Temporal Link Prediction Model for Weighted Dynamic Networks

    【2】Stochastic Weight Completion for Road Networks using Graph Convolutional Networks

    【3】pytorch.geometric中数据格式的构建:(后面补充)

    【4】SEMI-SUPERVISED CLASSIFICATION WITH GRAPH CONVOLUTIONAL NETWORKS

    【5】Graph U-Nets

    展开全文
  • 这是网卡有关信息配置文件,我们可以先查看一下master网卡信息(当然也可以用ifconfig命令查看): 要注意是网卡名称以及MAC地址。MAC地址(产品出产后Mac地址就固定了)用于在网络中唯一标示一个网卡,一...

    在克隆虚拟机之前,我们需要了解以下文件:

    1、/etc/udev/rules.d/70-persistent-net.rules

    这是网卡有关信息的配置文件,我们可以先查看一下master的网卡信息(当然也可以用ifconfig命令查看):

    要注意的是网卡名称以及MAC地址。MAC地址(产品出产后Mac地址就固定了)用于在网络中唯一标示一个网卡,一台设备若有一或多个网卡,则每个网卡都需要并都会有一个唯一的MAC地址。

    2、/etc/hosts

    这是配置ip地址和其对应主机名的文件,这里可以记录本机的或其他主机的ip及其对应主机名。

    master机的/etc/hosts:

    127.0.0.1即本机,本机有localhost,localhost.localdomain等别名。这么做的好处就是我们不用刻意地去记ip地址,在通信的时候可以直接使用别名代替ip地址。

    3、/etc/sysconfig/network

    此文件是为计算机起的一个名字hostname,是计算机的一个标识。还可以配置是否开启网络功能。

    master机的hostname为master1:


    接下来,让我们开始克隆吧。

     

    1、先将master机关机,然后在管理中选择克隆

    2、注意创建完整克隆

     

    下一步……

    3、取名为slave1,克隆成功

     

    我们先查看一下slave机的网卡信息

    可见多了一块网卡eth0,在通过ifconfig命令查看网络信息:

    再来到/etc/sysconfig/networking-scripts目录下查看所有文件:

    有趣的是,我们并找不到"ifcfg-eth1"这个文件。也就是说我们无法去管理eth1这块网卡,当克隆机多起来了,也就不好解决IP资源分配问题了。

     

    所以,我们需要手动地为"eth1"创建配置文件;并且现在slave机里有两块网卡,我们还需要删掉master机的网卡。

     

    4、修改/etc/udev/rules.d/70-persistent-net.rules文件

    5、修改/etc/sysconfig/networking-scripts/ifcfg-eth0文件

     

    6、然后重启网络服务会失败,重启下机子就好了

     

    到此,克隆虚拟机以及克隆后的有关网络配置就大功告成了,当然我们还可以再完善下~

     

    7、为slave机更名,修改/etc/sysconfig/network文件

    8、在master机和slave机中互相添加对方的IP信息,方便通信,修改/etc/hosts文件

    slave机:

    master机:

    9、测试

    master机ping通slave机

    slave机ping通master机

     

    展开全文
  • 都差点忘了说了,在看下面所有内容之前,对于python版本不了解,请一定先看看这个: 【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间区别 然后根据情况,选择自己需要python版本...

    都差点忘了说了,在看下面所有的内容之前,对于python版本不了解的,请一定先看看这个:

    【整理】总结Python2(Python 2.x版本)和Python3(Python 3.x版本)之间的区别

    然后根据情况,选择自己需要的python版本,然后才涉及到,如何学习的问题。

     

    【学习Python的基本流程】

    1.先学习Python的基础知识

    推荐资料:

    Dive Into Python

    中文主页是:

    http://woodpecker.org.cn/diveintopython/

     

    可以在线看:

    深入 Python :D ive Into Python 中文版

    也可以下载各种格式:

    留本地看。

     

    其他python资料,其实网上很多。

    但是作为入门,这个是经典。

    看完经典的,达到入门,就足够了。

     

    2.在实践中锻炼

    了解了Python基础后,剩下的,就是自己找找事情折腾。

    所以想要学好一门语言,最重要的一点,永远都是:多练。

    时间长了,自然熟能生巧,举一反三,触类旁通,见多识广。

     

    3.遇到问题,先尽量靠自己解决,实在解决不了,再靠网络和别人

     

    小问题靠自己查查Python自带手册;

    大问题,靠网络搜索,即使没找到解决方法,也能找到有效的提示,所以就足够了。

     

     

    【有效利用网络资源】

    在学习过程中,以及后续的折腾python的过程中,要学会充分利用网络上已有的资源。

    这里的网络资源,主要指的是第三方库函数,网络上已有的关于python方面的总结性资料。

    1. Python的第三方库

    python的第三方库,数量巨大,功能巨多,但是正是由于太多,不可能一一总结。

    但是python官网,人家已经整理出来了,都放到这里了:

    http://pypi.python.org/pypi?%3Aaction=index

    该页面由于库太多,看着很不方便。

    这里有分类查看:

    http://pypi.python.org/pypi?%3Aaction=browse

     

    如果需要某些方面的功能,可以去上述两个地址中,找找有没有现成的库,如果有的话,直接拿过来用,比你从头开发,要高效的多。

     

    2. 各种Python的总结方面的资料

    其中包括我写的Python语言总结,其中主要分两块:

    (1)python学习心得和体会

    总结了自己折腾python过程中的一些理解,和一些细节方面的注意事项。

    (2)crifan的Python库:crifanLib.py

    自己把一些常用的Python的函数,整理出来,供自己和别人使用。

    尤其是很多网络方面的函数,等你用到了,就会知道会省你不少精力的。

     

    有空多看看各种总结,有利于减少自己犯同样错误的几率。

     

    【如何利用Python自带手册 Python Manual】

    其中,关于查参考资料,特别要提示的一点是,对于很多不熟悉的python函数,最佳的学习方法,个人认为是先去Python自带手册中去查找。

    而Python自带手册,是你安装好Python之后,(我的是windows环境,通过exe安装的python 2.7版的),可以通过开始->Python 27-> Python Mannuals:

    python manual

    而找到。

    随便举个例子。

    比如涉及到网络编程,需要用到urllib2这个模块,你只是听说,但是不熟悉,想要搞懂urllib2。

    那么第一步,就可以先去通过manual找到urllib2:

    find urllib2

    然后再去看看其语法:

    urllib2.urlopen(url[, data][, timeout])
    Open the URL url, which can be either a string or a Request object.

    Warning

    HTTPS requests do not do any verification of the server’s certificate.

    data may be a string specifying additional data to send to the server, or None if no such data is needed. Currently HTTP requests are the only ones that use data; the HTTP request will be a POST instead of a GET when the data parameter is provided. data should be a buffer in the standard application/x-www-form-urlencoded format. The urllib.urlencode() function takes a mapping or sequence of 2-tuples and returns a string in this format. urllib2 module sends HTTP/1.1 requests with Connection:close header included.

    The optional timeout parameter specifies a timeout in seconds for blocking operations like the connection attempt (if not specified, the global default timeout setting will be used). This actually only works for HTTP, HTTPS and FTP connections.

    This function returns a file-like object with two additional methods:

    • geturl() — return the URL of the resource retrieved, commonly used to determine if a redirect was followed
    • info() — return the meta-information of the page, such as headers, in the form of an mimetools.Message instance (see Quick Reference to HTTP Headers)

    Raises URLError on errors.

    Note that None may be returned if no handler handles the request (though the default installed global OpenerDirector uses UnknownHandler to ensure this never happens).

    In addition, default installed ProxyHandler makes sure the requests are handled through the proxy when they are set.

    Changed in version 2.6: timeout was added.

    如此,对于其有个基本的了解后,再去网上详细看看别人的示例代码。

    这样,有助于你快速,准确的,学习此库函数。

    至少,我对于很多很多的python内置库函数,都是这样慢慢逐渐学习和了解的。

    展开全文
  • 有关CNN网络结构总结

    千次阅读 2018-04-27 21:38:09
    从神经网络到卷积神经网络(CNN)我们知道神经网络的结构是这样:那卷积神经网络跟它是什么关系呢?其实卷积神经网络依旧是层级网络,只是层功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就...

    从神经网络到卷积神经网络(CNN)
    我们知道神经网络的结构是这样的:

    那卷积神经网络跟它是什么关系呢?
    其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次。

     


    卷积神经网络的层级结构
          • 数据输入层/ Input layer
      • 卷积计算层/ CONV layer
      • ReLU激励层 / ReLU layer
      • 池化层 / Pooling layer
      • 全连接层 / FC layer

     

    1.数据输入层
    该层要做的处理主要是对原始图像数据进行预处理,其中包括:
      • 去均值:把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。
      • 归一化:幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。
      • PCA/白化:用PCA降维;白化是对数据各个特征轴上的幅度归一化

     

    去均值与归一化效果图:

     

    去相关与白化效果图:

     

     

    2.卷积计算层
    这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。
    在这个卷积层,有两个关键操作:
      • 局部关联。每个神经元看做一个滤波器(filter)
      • 窗口(receptive field)滑动, filter对局部数据计算

     

    先介绍卷积层遇到的几个名词:
      • 深度/depth(解释见下图)
      • 步长/stride (窗口一次滑动的长度)
      • 填充值/zero-padding

     

    填充值是什么呢?以下图为例子,比如有这么一个5*5的图片(一个格子一个像素),我们滑动窗口取2*2,步长取2,那么我们发现还剩下1个像素没法滑完,那怎么办呢?



    那我们在原先的矩阵加了一层填充值,使得变成6*6的矩阵,那么窗口就可以刚好把所有像素遍历完。这就是填充值的作用。


     

    卷积的计算(注意,下面蓝色矩阵周围有一圈灰色的框,那些就是上面所说到的填充值)


    这里的蓝色矩阵就是输入的图像,粉色矩阵就是卷积层的神经元,这里表示了有两个神经元(w0,w1)。绿色矩阵就是经过卷积运算后的输出矩阵,这里的步长设置为2。

     

    蓝色的矩阵(输入图像)对粉色的矩阵(filter)进行矩阵内积计算并将三个内积运算的结果与偏置值b相加(比如上面图的计算:2+(-2+1-2)+(1-2-2) + 1= 2 - 3 - 3 + 1 = -3),计算后的值就是绿框矩阵的一个元素。

     

    下面的动态图形象地展示了卷积层的计算过程:

     


    参数共享机制
      • 在卷积层中每个神经元连接数据窗的权重是固定的,每个神经元只关注一个特性。神经元就是图像处理中的滤波器,比如边缘检测专用的Sobel滤波器,即卷积层的每个滤波器都会有自己所关注一个图像特征,比如垂直边缘,水平边缘,颜色,纹理等等,这些所有神经元加起来就好比就是整张图像的特征提取器集合。
      • 需要估算的权重个数减少: AlexNet 1亿 => 3.5w
      • 一组固定的权重和不同窗口内数据做内积: 卷积

     


    3.激励层
    把卷积层输出结果做非线性映射。

    CNN采用的激励函数一般为ReLU(The Rectified Linear Unit/修正线性单元),它的特点是收敛快,求梯度简单,但较脆弱,图像如下。

     

    激励层的实践经验:
      ①不要用sigmoid!不要用sigmoid!不要用sigmoid!
      ② 首先试RELU,因为快,但要小心点
      ③ 如果2失效,请用Leaky ReLU或者Maxout
      ④ 某些情况下tanh倒是有不错的结果,但是很少


    4.池化层
    池化层夹在连续的卷积层中间, 用于压缩数据和参数的量,减小过拟合。
    简而言之,如果输入是图像的话,那么池化层的最主要作用就是压缩图像。

     

    这里再展开叙述池化层的具体作用。

    1. 特征不变性,也就是我们在图像处理中经常提到的特征的尺度不变性,池化操作就是图像的resize,平时一张狗的图像被缩小了一倍我们还能认出这是一张狗的照片,这说明这张图像中仍保留着狗最重要的特征,我们一看就能判断图像中画的是一只狗,图像压缩时去掉的信息只是一些无关紧要的信息,而留下的信息则是具有尺度不变性的特征,是最能表达图像的特征。

    2. 特征降维,我们知道一幅图像含有的信息是很大的,特征也很多,但是有些信息对于我们做图像任务时没有太多用途或者有重复,我们可以把这类冗余信息去除,把最重要的特征抽取出来,这也是池化操作的一大作用。

    3. 在一定程度上防止过拟合,更方便优化。


    池化层用的方法有Max pooling 和 average pooling,而实际用的较多的是Max pooling。

    这里就说一下Max pooling,其实思想非常简单。

    对于每个2*2的窗口选出最大的数作为输出矩阵的相应元素的值,比如输入矩阵第一个2*2窗口中最大的数是6,那么输出矩阵的第一个元素就是6,如此类推。


    5.全连接层
    两层之间所有神经元都有权重连接,通常全连接层在卷积神经网络尾部。也就是跟传统的神经网络神经元的连接方式是一样的:


    一般CNN结构依次为
      1. INPUT
      2. [[CONV -> RELU]*N -> POOL?]*M 
      3. [FC -> RELU]*K
      4. FC


    卷积神经网络之训练算法
      1. 同一般机器学习算法,先定义Loss function,衡量和实际结果之间差距。
      2. 找到最小化损失函数的W和b, CNN中用的算法是SGD(随机梯度下降)。


    卷积神经网络之优缺点
    优点
      • 共享卷积核,对高维数据处理无压力
      • 无需手动选取特征,训练好权重,即得特征分类效果好
    缺点
      • 需要调参,需要大样本量,训练最好要GPU
      • 物理含义不明确(也就说,我们并不知道没个卷积层到底提取到的是什么特征,而且神经网络本身就是一种难以解释的“黑箱模型”)


    卷积神经网络之典型CNN
      • LeNet,这是最早用于数字识别的CNN
      • AlexNet, 2012 ILSVRC比赛远超第2名的CNN,比
      • LeNet更深,用多层小卷积层叠加替换单大卷积层。
      • ZF Net, 2013 ILSVRC比赛冠军
      • GoogLeNet, 2014 ILSVRC比赛冠军
      • VGGNet, 2014 ILSVRC比赛中的模型,图像识别略差于GoogLeNet,但是在很多图像转化学习问题(比如object detection)上效果奇好


    卷积神经网络之 fine-tuning
    何谓fine-tuning?
    fine-tuning就是使用已用于其他目标、预训练好模型的权重或者部分权重,作为初始值开始训练。

    那为什么我们不用随机选取选几个数作为权重初始值?原因很简单,第一,自己从头训练卷积神经网络容易出现问题;第二,fine-tuning能很快收敛到一个较理想的状态,省时又省心。

    那fine-tuning的具体做法是?
      • 复用相同层的权重,新定义层取随机权重初始值
      • 调大新定义层的的学习率,调小复用层学习率


    卷积神经网络的常用框架

    Caffe
      • 源于Berkeley的主流CV工具包,支持C++,python,matlab
      • Model Zoo中有大量预训练好的模型供使用
    Torch
      • Facebook用的卷积神经网络工具包
      • 通过时域卷积的本地接口,使用非常直观
      • 定义新网络层简单
    TensorFlow
      • Google的深度学习框架
      • TensorBoard可视化很方便
      • 数据和模型并行化好,速度快

     

    总结
    卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式,只要用已知的模式对卷积网络加以训练,网络就具有输入输出对之间的映射能力。

    CNN一个非常重要的特点就是头重脚轻(越往输入权值越小,越往输出权值越多),呈现出一个倒三角的形态,这就很好地避免了BP神经网络中反向传播的时候梯度损失得太快。

    卷积神经网络CNN主要用来识别位移、缩放及其他形式扭曲不变性的二维图形。由于CNN的特征检测层通过训练数据进行学习,所以在使用CNN时,避免了显式的特征抽取,而隐式地从训练数据中进行学习;再者由于同一特征映射面上的神经元权值相同,所以网络可以并行学习,这也是卷积网络相对于神经元彼此相连网络的一大优势。卷积神经网络以其局部权值共享的特殊结构在语音识别和图像处理方面有着独特的优越性,其布局更接近于实际的生物神经网络,权值共享降低了网络的复杂性,特别是多维输入向量的图像可以直接输入网络这一特点避免了特征提取和分类过程中数据重建的复杂度。

     


    以下是我自己在学习CNN的时候遇到的一些困惑,以及查阅一些资料后得到的一些答案。

    第一个问题:为什么不用BP神经网络去做呢?
    1.全连接,权值太多,需要很多样本去训练,计算困难
      • 应对之道:减少权值的尝试,局部连接,权值共享

      卷积神经网络有两种神器可以降低参数数目。
      第一种神器叫做局部感知野,一般认为人对外界的认知是从局部到全局的,而图像的空间联系也是局部的像素联系较为紧密,而距离较远的像素相关性则较弱。因而,每个神经元其实没有必要对全局图像进行感知,只需要对局部进行感知,然后在更高层将局部的信息综合起来就得到了全局的信息。
      第二级神器,即权值共享。

     


    2.边缘过渡不平滑
      • 应对之道:采样窗口彼此重叠

     


    第二个问题:LeNet里的隐层的神经元个数怎么确定呢?
    它和原图像,也就是输入的大小(神经元个数)、滤波器的大小和滤波器在图像中的滑动步长都有关!

    LeNet-5共有7层,不包含输入,每层都包含可训练参数(连接权重)。输入图像为32*32大小。

    例如,我的图像是1000x1000像素,而滤波器大小是10x10,假设滤波器没有重叠,也就是步长为10,这样隐层的神经元个数就是(1000x1000 )/ (10x10)=100x100个神经元了。

    那重叠了怎么算?比如上面图的C2中28*28是如何得来的?这里的步长就是1,窗口大小是5*5,所以窗口滑动肯定发生了重叠。下图解释了28的由来。

     

     

    第三个问题:S2层是一个下采样层是干嘛用的?为什么是下采样?
    也就是上面所说的池化层,只是叫法不同而已。这层利用图像局部相关性的原理,对图像进行子抽样,可以减少数据处理量同时保留有用信息,相当于图像压缩。

    展开全文
  • 有关网络

    2014-04-03 18:35:52
    网络地址=IP地址&子网掩码(按位与)冲突域:网卡向通信线路发送帧时,若检测到碰撞,就称发生了冲突。所有会发生冲突主机构成了冲突域。总线型局域网会发生冲突,现在通常使用交换机,一个电脑连一个端口,这时每...
  • DOS 有关网络的……

    千次阅读 2012-07-09 15:23:43
    netstat -n 查看端口的网络连接情况,常用netstat -an netstat -v 查看正在进行的工作 netstat -p 协议名 例:netstat -p tcq/ip 查看某协议使用情况(查看tcp/ip协议使用情况) netstat -s 查看正在使用的...
  • 在学习网络编程时候,用到了bind函数,这个函数第二个参数是一个指向结构体 指针,我看书上这个指针类型是 SA*,这个是什么类型 代码是 Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); 第二个参数...
  • 有关网络编程一些面试

    千次阅读 2016-05-25 02:43:39
     从上图可以看到:底层东西已经被内核实现了,即我们通常意义上内核协议栈(传输层,网络层,链路层),最上面Application(应用层)是我们用户所要实现,它是属于用户进程一部分,工作在用户空间,那么...
  • 对了,我在网上查到一个程序可以实现大容量文件的网络传输,但是不是自动的,需要自己一个一个选择,并且一次只能发送一个文件,我想在这个程序上改可以吗? PS:本人学VC++不久,请大侠们多多指教,谢谢大家!!!
  • 有关卷积神经网络的一点看法

    千次阅读 2019-01-05 22:09:27
    第二部分是网络层,这里我们可以使用传统的网络,比如全连接的前馈神经网络。 1:卷积 对于第一部分,如果你学过图像处理这个东西的话,那么这部分对你来讲并没有那么难。因为卷积的实质就是滤波,而池化的实质是...
  • 最近学习网络方面东西,不知道咋看。主要问题,假如网卡工作在物理层,它应该可以把0101这样在网线上按位传数据组成一字节一字节,之后需要把这些组成数据帧,组数据帧这个过程是在哪进行,网卡直接处理完...
  • 2.网桥能够互连两个采用不同数据链路层协议、不同传输介质与不同传输速率的网络;3.网桥以接收、存储、地址过滤与转发的方式实现互连的网络之间的通信;4.网桥需要互连的网络在数据链路层以上采用相同的协议;5.网桥...
  • 一、与网络配置有关的配置文件 1.1网络接口配置文件(网卡) 1.2网络接口路由配置文件 1.3本地主机名配置文件 1.4 主机名与IP地址映射文件 1.5 域名与网络地址映射文件 1.6 域名服务客户端控制文件 1.7 本地...
  • 一、华为公司面试新员工的有关计算机网络的题目和答案  RFC1918文件规定了保留作为局域网使用私有地址:   10.0.0.0 - 10.255.255.255 (10/8 prefix)   172.16.0.0 - 172.31.255.255 ...
  • linux 服务器网络有关的内核参数

    千次阅读 2014-04-15 12:34:06
    几乎所有内核模块,包括内核核心模块和驱动程序,都在/proc
  • 网络接口配置文件: $ cat /etc/network/interfaces auto lo iface lo inet loopback #将lo接口配置为一个本地回环(loopback)地址; auto eth0 #系统启动时会被配置#iface eth0 inet dhcp  #将eth
  • android 有关网络连接Permission区别

    千次阅读 2013-07-15 20:45:53
    写程序时候,很是奇怪为什么连接网络时候,需要permission有ACCESS_NETWORK_STATE 和INTERNET区别。 有人是这么解释: android.permission.INTERNET,连接网络权限 INTERNET android.ACCESS_NETWORK_STATE...
  • 有关socket网络编程中一些概念理解   所谓服务器即提供服务器一端。换句话那个设备具有提供服务能力那么这台设备就应该是服务器。 所谓客户端即需要被服务一端。换句话那个设备不能自己实现需要功能...
  • unity3d与网络有关的类及其基本操作
  • 收集的有关网络安全常用链接

    千次阅读 2013-07-04 11:31:43
    Networking and Network Security IP to ASN Mapping (http://www.team-cymru.org/Services/ip-to-asn.html) Peering DB (http://www.peeringdb.com) AS topology maps (http://irl.cs.ucla.edu/topology/)
  • 有关网络安全

    2014-08-23 20:14:59
    简单讲是HTTP安全版,即HTTP下加入SSL层。 SSL,Secure Socket Layer,安全套接字层。它位于传输层与应用层之间,由网景公司(已被美国在线并购)研发,用于加密传输数据,...1)客户对服务器身份认证: SSL服务器
  • caffe初探2:有关网络设计探索

    千次阅读 2016-09-27 10:18:01
    续caffe初探1大笑大笑大笑有兴趣朋友可以关注笔者博客,笔者作为一个初涉深度学习领域和cafferookie,很高兴同大家一起学习和...众所周知,在卷及神经网络中,网络架构是最重要一部分,网络的构造与模型效果
  • 如何完成卷积神经网络有关的毕业设计

    千次阅读 热门讨论 2017-07-21 18:36:25
    因为我毕业设计主题是卷积神经网络,所以在这里我话题也仅仅局限于卷积神经网络这方面内容。准备篇 先介绍我毕业设计,我毕业设计简而言之是完成一个实现图像分类任务卷积神经网络的项目,其中包括训练...
  • 有关网络打印

    千次阅读 2010-01-11 13:05:00
    VFP搜索打印机顺序: 报表默认打印机(报表内保存) -> VFP默认了打印机( Set Printer To 设置) -> Windows 默认打印机所以要使用网络打印机时,首先设计报表时不要保存报表打印机环境,方法如下:VFP9.0以下: Use...
  • 网络有关的DOS命令

    千次阅读 2006-03-27 10:17:00
    作为一个生活在网络管理员或者黑客来说,ping命令是第一个必须掌握DOS命令,它所利用原理是这样网络机器都有唯一确定IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小数据包...
  • 有关使用网络地址转换器一些问题发布日期: 2004年10月01日 本页内容简介NAT 操作NAT 与安全有关在 NAT 后方使用服务器一些问题总结更多信息简介网络地址转换器 (NAT) 允许专用网络计算机访问 Internet 资源...
  • Linux环境下有关网络的一些配置Posted by 孙新贺配置DHCP客户端$ sudo vi /etc/network/interfaces默认内容是auto loiface lo inet loopback需要修改为:auto lo eth0iface lo inet loopbackiface eth0 inet dbcp...
  • 等待解密
  • 有关网络包长度与校验和研究

    千次阅读 2016-01-10 11:34:48
    网络通畅时,也就是拥塞窗口和接收窗口足够大,那么为了提高吞吐量,一个ip数据报会携带尽可能多数据,但是由于数据链路层MAC帧对帧数据长度有限制,最小64字节,最大1500字节,一般情况下tcp包是没有option...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,172
精华内容 9,268
关键字:

有关的网络