caffe,SCST强化学习网络中,在修改网络的时候显示报错,调用的(共享)参数维度不匹配(笔记)

问题如下:

I0807 22:23:04.734895 29440 net.cpp:465] Sharing parameters 'predict_param_0' owned by layer 'beam', param index 7
F0807 22:23:04.734915 29440 net.cpp:484] Check failed: this_blob->shape() == owner_blob->shape() Cannot share param 'predict_param_0' owned by layer 'beam' with layer 'predict'; shape mismatch.  Owner layer param shape is 1000 2048 (2048000); sharing layer expects shape 10010 2000 (20020000)
*** Check failure stack trace: ***

在我使用caffe来实现scst网络的时候,修改双层lstm,并其中添加了一些全连接层。如下所示:

layer {
  name: "fc_att_0"
  type: "InnerProduct"
  bottom: "fc8_0"
  top: "fc8_reshape_0"
  param {
    name: "fc_param_0"
        }
  inner_product_param {
    num_output: 1000
    bias_term: false
    weight_filler {
       type: "gaussian"
       std: 0.00999999977648
       }
     }
   }

 为了进一步获得想要得到的含有权重的图像信息,将其进行全连接操作来增加纬度以便接下来的处理,并且设置共享参数为name: "fc_param_0"。在实现caption的20个相同的单元中,网络结构基本一致,所以可以象LSTM层一样共享参数。整个网络scst是为了得到奖励reward。所以要先得到baseline的值。这里可以用greedy或者beamsearch得到。在原作者定义的层beam中。网络如下

layer {
  name: "beam"
  type: "BeamSearch"
  bottom: "num_boxes"
  bottom: "spatial_features"
  bottom: "fc"
  bottom: "context"
  top: "caption"
  top: "log_prob"
  top: "log_prob_sequence"
  param {
    name: "embed_param"
  }
  param {
    name: "lstm0_param_0"
  }
  param {
    name: "lstm0_param_1"
  }
  param {
    name: "hidden_att_param_0"
  }
  param {
    name: "predict_att_param_0"
  }
  param {
    name: "lstm1_param_0"
  }
  param {
    name: "lstm1_param_1"
  }
  param {
    name: "fc_param_0" (之前这一行是没有的,自己在源网络中定义了其他共享的参数一定要在层之前把参数空间传进去,才不会报错,否则网络找不到共享的参数)
  }
  param {
    name: "predict_param_0"
  }
  param {
    name: "predict_param_1"
  }
  beam_search_param {
    net_param {
      layer {
        name: "input"
        type: "Input"
        top: "num_boxes"
        top: "spatial_features"
        top: "fc"
        top: "context"
        top: "input"
        input_param {
          shape {
            dim: 12
            dim: 1
          }
          shape {
            dim: 12
            dim: 100
            dim: 2048
          }
          shape {
            dim: 12
            dim: 100
            dim: 512
          }
          shape {
            dim: 12
            dim: 2048
          }
          shape {
            dim: 12
            dim: 1
          }
        }
      }
      layer {
        name: "lstm0_hidden_prev"
        type: "DummyData"
        top: "lstm0_hidden_prev"
        dummy_data_param {
          shape {
            dim: 12
            dim: 1000
          }
        }
      }
      layer {
        name: "lstm0_mem_cell_prev"
        type: "DummyData"
        top: "lstm0_mem_cell_prev"
        dummy_data_param {
          shape {
            dim: 12
            dim: 1000
          }
        }
      }

其中定义了每个时间步网络的操作,并且限定了如lstm和innerproduct等层共享参数名称和排序。之前为出现这个错误就是应为在设置全局参数时,调用作者的beam层中的拥有参数(owner layer)。网络由于没有定义name: "fc_param_0"的参数名,所以按照顺序加载了一个1000*2048的错误参数,为解决这个为题,应该在上述程序开辟一个新的param空间,这样就不会出错。

注:防止以后出错写的笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值