PaddleFL icon indicating copy to clipboard operation
PaddleFL copied to clipboard

【咨询】dynamic_gru算法出现问题

Open silence-will20 opened this issue 2 years ago • 0 comments

代码片段:

        conv_1 = pfl_mpc.layers.conv2d(
           input=x, num_filters=6, filter_size=3, act='relu', padding=1)
        pool_1 = pfl_mpc.layers.pool2d(
            input=conv_1, pool_size=2, pool_stride=2)
        conv_2 = pfl_mpc.layers.conv2d(
            input=pool_1, num_filters=12, filter_size=3, act='relu', padding=1)
        pool_2 = pfl_mpc.layers.pool2d(
            input=conv_2, pool_size=2, pool_stride=2)
        f = pfl_mpc.layers.fc(pool_2, 1, 3, act='relu')
        f = layers.squeeze(f, [4])
        f = layers.transpose(f, [0, 1, 3, 2])
        for i in range(BATCH_SIZE): // 将batch_size中的数据一个一个取出
            f_t = f[:, i:i+1, :, :]
            f_t = layers.squeeze(f_t, [1])
            sequenceout_t = pfl_mpc.layers.fc(input=f_t, size=12*3)
            sequenceout_t = layers.transpose(sequenceout_t, [1, 0, 2])
            sequenceout_t = pfl_mpc.layers.dynamic_gru(input=sequenceout_t, size=12) // 将数据放入dynamic_gru函数之中,也是该函数发出报错,只接受lod_level=1的数据输入 
            if i == 0:
                sequenceout = layers.unsqueeze(sequenceout_t, [1])
            else:
                sequenceout_t = layers.unsqueeze(sequenceout_t, [1])
                sequenceout = layers.concat(input=[sequenceout, sequenceout_t], axis=1)
                sequenceout_t = layers.squeeze(sequenceout_t, [1])
        featureout = pfl_mpc.layers.batch_norm(input=sequenceout, act='relu')
        fc_out = pfl_mpc.layers.fc(input=featureout, size=100)
        fc_out = pfl_mpc.layers.fc(input=fc_out, size=10)
        cost, softmax = pfl_mpc.layers.softmax_with_cross_entropy(
            logits=fc_out, label=y, soft_label=True, return_softmax=True)
        return cost, softmax

1、报错: Expected lods.size() == 1UL, but received lods.size():0 != 1UL:1. 报错中,查看负责检查lods.size()的语句是:

      auto lods = lod_tensor.lod();
      PADDLE_ENFORCE_EQ(lods.size(), 1UL, "Only support one level sequence now.");

可以得知这里的lods.size()就是lod数组的第0维大小,检查是否等于1UL,就是检查是否第0维大小是1,即是否属于lod_level=1的类型。

2、paddlefl中MpcVariable类型的数据无法调用LoDTensor中的成员函数,无法直接修改和继承lod信息。请问这二者之间有什么关系,能否互相转换以及自动生成lod数组呢?

silence-will20 avatar Feb 13 '23 03:02 silence-will20