| 38 | } |
| 39 | |
| 40 | void ForwardSliceRowTest(std::shared_ptr<singa::Device> dev) { |
| 41 | size_t a = 2u, b = 1u, c = 3u; |
| 42 | singa::LayerConf conf; |
| 43 | conf.set_type("singa_slice"); |
| 44 | auto slice_conf = conf.mutable_slice_conf(); |
| 45 | slice_conf->set_axis(0); |
| 46 | slice_conf->add_slice_point(a); |
| 47 | singa::Slice layer; |
| 48 | layer.Setup({c}, conf); |
| 49 | layer.ToDevice(dev); |
| 50 | |
| 51 | singa::Tensor t({a + b, c}, dev); |
| 52 | singa::Uniform(-1.f, 1.f, &t); |
| 53 | auto grads = layer.Forward(singa::kTrain, {t}); |
| 54 | EXPECT_EQ(grads.size(), 2u); |
| 55 | |
| 56 | t.ToHost(); |
| 57 | const float* tptr = t.data<float>(); |
| 58 | |
| 59 | grads[0].ToHost(); |
| 60 | const float* outa = grads[0].data<float>(); |
| 61 | for (size_t i = 0; i < a; i++) |
| 62 | for (size_t j = 0; j < c; j++) |
| 63 | EXPECT_FLOAT_EQ(outa[i * c + j], tptr[i * c + j]); |
| 64 | grads[1].ToHost(); |
| 65 | const float* outb = grads[1].data<float>(); |
| 66 | for (size_t i = 0; i < b; i++) |
| 67 | for (size_t j = 0; j < c; j++) |
| 68 | EXPECT_FLOAT_EQ(outb[i * c + j], tptr[(i + a) * c + j]); |
| 69 | } |
| 70 | |
| 71 | void ForwardSliceColumnTest(std::shared_ptr<singa::Device> dev) { |
| 72 | size_t a = 2u, b = 1u, c = 3u; |