zoukankan      html  css  js  c++  java
  • 卷积神经网络CNN

    卷积神经网络组成:  INPUT -> CONV -> ReLU -> POOL -> FC

    卷积操作:

    • 输入大小为:W1 x H1 x D1
    • 指定的超参数:filter个数(K),filter大小(F),步长(S),边界填充(P)

    输出:

    • W2 = (W1 - F + 2P)/S + 1
    • H2 = (H1 - F + 2P)/S + 1
    • D2 = K

    Input: rows * rows *  channels, N filter_rows*filter_rows filters with stride=stride, pade=pad

    Output:  output_rows = (rows+2*pad-filter_rows)/stride + 1

    MAX POOLING更常用,AVE POOLING用得少了

    反向传播:

    对于CONV,其每一层正向传播:out = x * w + b,

    其中:

    • out.size == [depth_out, out_height, out_width)
    • w.size == [depth_out, depth_x, filter_height, filter_width]
    • x.size == [sample, depth_x, height, width]
    • b.size == [depth_out]

    则对应的反向传播计算:

    dw[k_depth_out, k_depth_x, :, :] =
    sum {
    x[k_sample, k_depth_x,
    (k_height
    +stride*k_out_height):(k_height+stride*k_out_height+stride),
    (k_width +stride*k_out_width ):(k_width +stride*k_out_width +stride)] * dout[k_depth_out, k_out_height, k_out_width] * STEP }

    ???   dout = x * dw => dw = dout/x   ???

    因为CNN并不是假设dout均匀分配给各个x[k],而是假设x[k]越大,特征越显著,对应的w[k]贡献就越大,此时修改对应的w[k],效果也越显著

    关于POOL操作

    对于均值POOL,反向传播平均分配给前一级网络。

    对于MAX POOL,只返回到最大位置

    如何巧妙设计网络结构

    设:R为filter半径,N为out put depth

    用小半径,多层处理,参数个数 = (2*R+1) * N = 2*R*N + N

    用一个卷积层,参数个数 = (2*R*N+1)^2 = 4*R^2*N^2 + 4*R*N + 1

    明显参数个数, 分多层小filter << 用一个大卷积层

    但根据计算,predict的运算量,分多层小filter > 用一个大卷积层

    非线性程度,运算量分多层小filter > 用一个大卷积层

  • 相关阅读:
    CentOS安装thrift
    6个用于大数据分析的最好工具
    我的助理辞职了!——给不听话的下属看看
    用Redis bitmap统计活跃用户、留存
    Java从入门到精通——数据库篇Oracle 11g服务详解
    Java从入门到精通——数据库篇之OJDBC版本区别
    非常有用!eclipse与myeclipse恢复已删除的文件和代码
    Redis 代理服务Twemproxy
    Redis集群明细文档
    正则表达式
  • 原文地址:https://www.cnblogs.com/xbit/p/9563442.html
Copyright © 2011-2022 走看看