19 -> std::vector<std::vector<size_t>>
29 if (fAttrStrides.empty()) {
30 fAttrStrides = std::vector<size_t>(fDim, 1);
32 if (fAttrDilations.empty()) {
33 fAttrDilations = std::vector<size_t>(fDim, 1);
36 if (fAttrKernelShape.empty()) {
37 fAttrKernelShape.resize(fDim);
38 for (
size_t i = 0; i < fDim; i++)
39 fAttrKernelShape[i] = fShapeW[i + 2] + (fAttrDilations[i] - 1) * (fShapeW[i + 2] - 1);
41 if (fAttrOutputPadding.empty())
42 fAttrOutputPadding = std::vector<size_t>(fDim, 0);
54 if (fAttrPads.empty() ) {
55 fAttrPads = std::vector<size_t>(2 * fDim, 0);
56 if (fAttrOutputShape.size() == fDim) {
60 std::runtime_error(
"ConvTranspose with output_shape explicitly set not yet supported.");
81 if (fAttrAutopad !=
"NOTSET") {
83 std::runtime_error(
"ConvTranspose with padding SAME_UPPER or SMAE_LOWER not supported");
86 if (fAttrOutputShape.empty()) {
87 fAttrOutputShape.resize(fDim);
88 for (
size_t i = 0; i < fDim; i++) {
90 fAttrOutputShape[i] = fAttrStrides[i] * (
inputShape[
j] - 1) + fAttrKernelShape[i] + fAttrOutputPadding[i] - fAttrPads[i] - fAttrPads[fDim+i];
96 std::runtime_error(
"ConvTranspose with output_shape explicitly set not yet supported.");
99 for (
size_t i = 0; i < fDim; i++)
100 outShape[i + 2] = fAttrOutputShape[i];
110 throw std::runtime_error(
"TMVA SOFIE Conv Transpose op Input Tensor " + fNX +
" is not found in model");
113 if (fShapeX.size() < 3 || fShapeX.size() > 5) {
115 throw std::runtime_error(
"TMVA SOFIE Conv Transpose Op input data tensor" + fNX +
116 " is not of 3,4 or 5 dimensions");
118 fDim = fShapeX.size() - 2;
120 throw std::runtime_error(
"TMVA SOFIE Conv op Input weight Tensor " + fNW +
" is not found in model");
123 if (fShapeW.size() < 3 || fShapeW.size() > 5) {
125 throw std::runtime_error(
"TMVA SOFIE Conv Transpose Op input weight tensor" + fNW +
126 " is not of 3,4 or 5 dimensions");
128 fShapeY = ShapeInference({fShapeX, fShapeW})[0];
133 throw std::runtime_error(
"TMVA SOFIE ConvTrans op Input Tensor " + fNB +
" is not found in model");
136 if (fShapeB.size() < 1)
137 throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Bias Tensor has empty shape");
147 if (
bsize != fShapeY[1] )
148 throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Bias Tensor has wrong shape: " +
153 if (fType !=
"float")
154 throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Broadcasting for non-float type tensors is not supported");
159 UTILITY::BroadcastConvBias<float>(
static_cast<float *
>(
original_data.get()),
bsize, fShapeY),
160 std::default_delete<
float[]>());
164 fNBroadcastedB = fNB;
168 fNBroadcastedB =
"Broadcasted" + fNB;
174 if (fShapeY != fShapeB)
175 throw std::runtime_error(
"TMVA SOFIE ConvTrans op: Broadcasting is not needed but bias has wrong shape" +
177 fNBroadcastedB = fNB;
182 size_t inputSize = 1;
183 for (
size_t i = 0; i < fDim; i++) {
184 inputSize *= fShapeX[2+ i];
193 fImcol = fNX +
"_xcol";
194 fOutputTensorNames.emplace_back(fConvK);
195 fOutputTensorNames.emplace_back(fImcol);
222 if (fShapeX.empty() || fShapeW.empty() || (fNB !=
"" && fShapeB.empty()) || fShapeY.empty()) {
223 throw std::runtime_error(
"TMVA SOFIE Conv Op called to Generate without being initialized first");
226 std::stringstream out;
228 size_t bsize = fShapeX[0];
229 size_t kDepth = (fDim > 2) ? fShapeW[2] : 1;
230 size_t kHeight = (fDim > 1) ? fShapeW[fDim] : 1;
231 size_t kWidth = fShapeW[fDim + 1];
233 size_t iDepth = (fDim > 2) ? fShapeX[2] : 1;
234 size_t iHeight = (fDim > 1) ? fShapeX[fDim] : 1;
235 size_t iWidth = fShapeX[fDim + 1];
237 size_t oDepth = (fDim > 2) ? fShapeY[2] : 1;
238 size_t oHeight = (fDim > 1) ? fShapeY[fDim] : 1;
239 size_t oWidth = fShapeY[fDim + 1];
241 out <<
"\n//---- operator ConvTranspose " <<
OpName <<
"\n";
248 out << SP << fType <<
" tensor_" << fNX <<
"_f[" << fShapeW[0] * fShapeW[1] *
kernelSize <<
"] = {0};\n";
254 size_t id = (fDim > 2) ? fDim - 3 : 2;
255 size_t ih = (fDim > 1) ? fDim - 2 : 1;
256 size_t iw = fDim - 1;
271 for (
size_t i = 0; i < fDim; i++)
277 out << SP <<
"for (std::size_t ic = 0; ic < " << fShapeW[0] <<
"; ic++) {\n";
278 out << SP << SP <<
"for (std::size_t oc = 0; oc < " << fShapeW[1] <<
"; oc++) {\n";
281 out << SP << SP << SP <<
"for (std::size_t kd = 0; kd < " << kDepth <<
"; kd++) {\n";
283 out << SP << SP << SP <<
"for (std::size_t kh = 0; kh < " <<
kHeight <<
"; kh++) {\n";
284 out << SP << SP << SP << SP <<
"for (std::size_t kw = 0; kw < " <<
kWidth <<
"; kw++) {\n";
286 out << SP << SP << SP << SP << SP <<
"tensor_" << fNX <<
"_f[ic * " <<
ocstrideDil <<
" + oc * " <<
icstrideDil;
303 out << SP << SP << SP << SP <<
"}\n";
305 out << SP << SP << SP <<
"}\n";
307 out << SP << SP << SP <<
"}\n";
309 out << SP << SP <<
"}\n";
312 out << SP <<
"char " <<
OpName <<
"_transA = 'N';\n";
313 out << SP <<
"char " <<
OpName <<
"_transB = 'T';\n";
316 out << SP <<
"int " <<
OpName <<
"_k = " << fShapeW[0] <<
";\n";
317 out << SP <<
"float " <<
OpName <<
"_alpha = 1.0;\n";
318 out << SP <<
"float " <<
OpName <<
"_beta = 0.0;\n";
325 out << SP <<
"for (size_t n = 0; n < " <<
bsize <<
"; n++) {\n";
335 if (fAttrPads[0] != fAttrPads[1]) {
336 std::cout <<
"TMVA SOFIE Operator Conv: asymmetric padding not supported. Assume an average padding "
338 fAttrPads[0] = (fAttrPads[0] + fAttrPads[1]) / 2;
343 if (fAttrPads[0] != fAttrPads[2] || fAttrPads[1] != fAttrPads[3]) {
344 std::cout <<
"TMVA SOFIE Operator ConvTranspose: asymmetric padding not supported. Assume an average padding "
346 fAttrPads[0] = (fAttrPads[0] + fAttrPads[2]) / 2;
347 fAttrPads[1] = (fAttrPads[1] + fAttrPads[3]) / 2;
351 if (fAttrPads[0] != fAttrPads[3] || fAttrPads[1] != fAttrPads[4] || fAttrPads[2] != fAttrPads[5]) {
352 std::cout <<
"TMVA SOFIE Operator ConvTranspose: asymmetric padding not supported. Assume an average padding "
354 fAttrPads[0] = (fAttrPads[0] + fAttrPads[3]) / 2;
355 fAttrPads[1] = (fAttrPads[1] + fAttrPads[4]) / 2;
356 fAttrPads[2] = (fAttrPads[2] + fAttrPads[5]) / 2;
360 if (fAttrGroup == 1) {
361 out << SP << SP <<
"size_t x_offset = n * " << fShapeX[1] *
iDepth *
iHeight *
iWidth <<
";\n";
362 out << SP << SP <<
"size_t out_offset = n * " << fShapeY[1] *
oDepth *
oHeight *
oWidth <<
";\n";
366 out << SP << SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
368 <<
"tensor_" << fNX <<
" + x_offset, &" <<
OpName <<
"_m,\n";
369 out << SP << SP << SP <<
"tensor_" << fNX <<
"_f, &" <<
OpName <<
"_n, &" <<
OpName <<
"_beta, tensor_"
370 << fNX <<
"_xcol, &" <<
OpName <<
"_m);\n";
376 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(tensor_" << fNX <<
"_xcol,"
381 out <<
"1, " << fAttrKernelShape[0] <<
",0," << fAttrPads[0] <<
",1," << fAttrStrides[0] <<
",1,"
382 << fAttrDilations[0];
384 out << fAttrKernelShape[0] <<
"," << fAttrKernelShape[1] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1]
385 <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrDilations[0] <<
","
386 << fAttrDilations[1];
387 out <<
", tensor_" << fNY <<
" + out_offset);\n\n ";
390 throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
391 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
396 << fShapeX[1] <<
"," <<
oDepth <<
"," <<
oHeight <<
"," <<
oWidth <<
"," << fAttrKernelShape[0] <<
","
397 << fAttrKernelShape[1] <<
"," << fAttrKernelShape[2] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1] <<
","
398 << fAttrPads[2] <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrStrides[2] <<
","
399 << fAttrDilations[0] <<
"," << fAttrDilations[1] <<
"," << fAttrDilations[2] <<
400 ",tensor_" << fNX <<
"_xcol);\n\n ";
412 out << SP << SP <<
"for (size_t g = 0; g < " << fAttrGroup <<
"; g++) {\n";
413 out << SP << SP <<
"size_t x_offset = n * " << fShapeX[1] *
iHeight *
iWidth <<
" + g * "
415 out << SP << SP <<
"size_t out_offset = n * " << fShapeY[1] *
oHeight *
oWidth <<
" + g * "
419 out << SP << SP <<
"BLAS::sgemm_(&" <<
OpName <<
"_transA, &" <<
OpName <<
"_transB, &" <<
OpName <<
"_m, &"
421 <<
"tensor_" << fNX <<
" + x_offset, &" <<
OpName
423 out << SP << SP << SP <<
"tensor_" << fNX <<
"_f, &" <<
OpName <<
"_n, &" <<
OpName
424 <<
"_beta, tensor_" << fNX <<
"_xcol , &" <<
OpName <<
"_m);\n";
427 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::col2im<float>(tensor_" << fNX <<
"_xcol,"
432 out <<
"1, " << fAttrKernelShape[0] <<
",0," << fAttrPads[0] <<
",1," << fAttrStrides[0] <<
",1,"
433 << fAttrDilations[0];
435 out << fAttrKernelShape[0] <<
"," << fAttrKernelShape[1] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1]
436 <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrDilations[0] <<
","
437 << fAttrDilations[1];
438 out <<
", tensor_" << fNY <<
" + out_offset);\n\n ";
441 throw std::runtime_error(
"TMVA SOFIE 3D Conv Transpose not yet supported");
443 out << SP << SP <<
"TMVA::Experimental::SOFIE::UTILITY::Im2col_3d<float>(tensor_" << fNX
448 << fShapeX[1] <<
"," <<
oDepth <<
"," <<
oHeight <<
"," <<
oWidth <<
"," << fAttrKernelShape[0] <<
","
449 << fAttrKernelShape[1] <<
"," << fAttrKernelShape[2] <<
"," << fAttrPads[0] <<
"," << fAttrPads[1] <<
","
450 << fAttrPads[2] <<
"," << fAttrStrides[0] <<
"," << fAttrStrides[1] <<
"," << fAttrStrides[2] <<
","
451 << fAttrDilations[0] <<
"," << fAttrDilations[1] <<
"," << fAttrDilations[2] <<
"," <<
"tensor_" << fNX
465 out << SP << SP <<
"}\n";
470 if (fNBroadcastedB !=
"") {
472 out << SP <<
"float " <<
OpName <<
"_gamma = 1.0;\n";
473 out << SP <<
"int " <<
OpName <<
"_incx = 1;\n";
474 out << SP <<
"int " <<
OpName <<
"_incy = 1;\n";
476 out << SP <<
"BLAS::saxpy_(&" <<
OpName <<
"_size, &" <<
OpName <<
"_gamma, tensor_" << fNBroadcastedB <<
", &"
477 <<
OpName <<
"_incx, tensor_" << fNY <<
", &" <<
OpName <<
"_incy);\n";