| 193 | } |
| 194 | |
| 195 | core::TensorValue se_res2net( |
| 196 | core::ModuleBuildContext & ctx, |
| 197 | const core::TensorValue & input, |
| 198 | const SERes2NetWeights & block, |
| 199 | common::ConstantTensorCache & constants) { |
| 200 | auto y = tdnn(ctx, input, block.tdnn1, constants); |
| 201 | core::TensorValue merged; |
| 202 | core::TensorValue previous; |
| 203 | constexpr int64_t scale = 8; |
| 204 | constexpr int64_t width = 64; |
| 205 | for (int64_t i = 0; i < scale; ++i) { |
| 206 | auto chunk = modules::SliceModule({1, i * width, width}).build(ctx, y); |
| 207 | core::TensorValue out; |
| 208 | if (i == 0) { |
| 209 | out = chunk; |
| 210 | } else if (i == 1) { |
| 211 | out = tdnn(ctx, chunk, block.res2net[0], constants); |
| 212 | } else { |
| 213 | out = tdnn(ctx, modules::ResidualAddModule{}.build(ctx, chunk, previous), block.res2net[static_cast<size_t>(i - 1)], constants); |
| 214 | } |
| 215 | previous = out; |
| 216 | merged = merged.valid() ? modules::ConcatModule({1}).build(ctx, merged, out) : out; |
| 217 | } |
| 218 | y = tdnn(ctx, merged, block.tdnn2, constants); |
| 219 | y = modules::SqueezeExcite1dModule({512, 128, true}).build( |
| 220 | ctx, |
| 221 | y, |
| 222 | {binding::conv1d_data(constants, block.se_conv1.weight, block.se_conv1.bias), |
| 223 | binding::conv1d_data(constants, block.se_conv2.weight, block.se_conv2.bias)}); |
| 224 | return modules::ResidualAddModule{}.build(ctx, y, input); |
| 225 | } |
| 226 | |
| 227 | core::TensorValue attentive_statistics_pool( |
| 228 | core::ModuleBuildContext & ctx, |
no test coverage detected