C ++ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ

рд╕рднреА рдХреЛ рдирдорд╕реНрдХрд╛рд░ред

рдЙрдиреНрд╣реЛрдВрдиреЗ рдПрдХ рддрдВрддреНрд░рд┐рдХрд╛ рдиреЗрдЯрд╡рд░реНрдХ рдХреЗ рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рд▓рд┐рдП рдПрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдЦрд╛ рдерд╛ред рдХреМрди рдкрд░рд╡рд╛рд╣ рдХрд░рддрд╛ рд╣реИ, рдХреГрдкрдпрд╛ред

рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдЦреБрдж рдХреЛ рдЗрд╕ рд╕реНрддрд░ рдХрд╛ рд╕рд╛рдзрди рдмрдирд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ред рд╕реА рдЧрд░реНрдорд┐рдпреЛрдВ рдореЗрдВ рд╡рд╣ рд╡реНрдпрд╛рдкрд╛рд░ рдореЗрдВ рдЙрддрд░ рдЧрдпрд╛ред рдпрд╣рд╛рдБ рдХреНрдпрд╛ рд╣реБрдЖ:

  • рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ C ++ рдореЗрдВ рд╕реНрдХреНрд░реИрдЪ рд╕реЗ рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рд╣реИ (рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ STL + OpenBLAS), C- рдЗрдВрдЯрд░рдлрд╝реЗрд╕, рдЬреАрдд / рд▓рд┐рдирдХреНрд╕;
  • JSON рдореЗрдВ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд░рдЪрдирд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╣реИ;
  • рдЖрдзрд╛рд░ рдкрд░рдд: рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЬреБрдбрд╝рд╛ рд╣реБрдЖ, рджреГрдврд╝, рдкреВрд▓рд┐рдВрдЧред рдЕрддрд┐рд░рд┐рдХреНрдд: рдЖрдХрд╛рд░, рдлрд╕рд▓ ..;
  • рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ: рдмреИрдЪрдиреЙрд░реНрдо, рдбреНрд░реЙрдкрдЖрдЙрдЯ, рд╡реЗрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ - рдПрдбрдо, рдПрдбрдЧреНрд░рд╛рдб ..;
  • OpenBLAS рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдХреЗ рд▓рд┐рдП CPU, CUDA / cuDNN рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрдиреНрд╣реЛрдВрдиреЗ рднрд╡рд┐рд╖реНрдп рдХреЗ рд▓рд┐рдП OpenCL рдкрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рднреА рд░рдЦрд╛;
  • рдкреНрд░рддреНрдпреЗрдХ рдкрд░рдд рдХреЗ рд▓рд┐рдП рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕реЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП - рд╕реАрдкреАрдпреВ рдпрд╛ рдЬреАрдкреАрдпреВ (рдФрд░ рдХреМрди рд╕рд╛);
  • рдЗрдирдкреБрдЯ рдбреЗрдЯрд╛ рдХрд╛ рдЖрдХрд╛рд░ рдХрдареЛрд░рддрд╛ рд╕реЗ рд╕реЗрдЯ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХрд╛рд░реНрдп / рдкреНрд░рд╢рд┐рдХреНрд╖рдг рдХреЗ рджреМрд░рд╛рди рдмрджрд▓ рд╕рдХрддрд╛ рд╣реИ;
  • рд╕реА ++ рдФрд░ рдкрд╛рдпрдерди рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлреЗрд╕ рдмрдирд╛рдпрд╛ред C # рдмрд╛рдж рдореЗрдВ рднреА рдЖрдПрдЧрд╛ред

рдкреБрд╕реНрддрдХрд╛рд▓рдп рдХреЛ рд╕реНрдХрд╛рдИрдиреЗрдЯ рдХрд╣рд╛ рдЬрд╛рддрд╛ рдерд╛ред (рд╕рдм рдХреБрдЫ рдирд╛рдореЛрдВ рдХреЗ рд╕рд╛рде рдЬрдЯрд┐рд▓ рд╣реИ, рдЕрдиреНрдп рд╡рд┐рдХрд▓реНрдк рдереЗ, рд▓реЗрдХрд┐рди рдХреБрдЫ рд╕рд╣реА рдирд╣реАрдВ рд╣реИ ..)


MNIST рдЙрджрд╛рд╣рд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ PyTorch рдХреЗ рд╕рд╛рде рддреБрд▓рдирд╛:

PyTorch: рд╕рдЯреАрдХрддрд╛: 98%, рд╕рдордп: 140 рд╕реЗрдХрдВрдб
рд╕реНрдХрд╛рдИрдиреЗрдЯ: рд╕рдЯреАрдХрддрд╛: 95%, рд╕рдордп: 150 рд╕реЗрдХрдВрдб

рдорд╢реАрди: i5-2300, GF1060ред рдЯреЗрд╕реНрдЯ рдХреЛрдбред



рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛




рдпрд╣ рд╕рдВрдЪрд╛рд▓рди рдХреЗ рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ рдЬреЛ рдиреЗрдЯрд╡рд░реНрдХ рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдкреНрд░рддреНрдпреЗрдХ рд╢рд╛рдЦрд╛ рдХреЗ рд▓рд┐рдП, рдПрдХ рдирдпрд╛ рдзрд╛рдЧрд╛ред рдиреЗрдЯрд╡рд░реНрдХ рдХрд╛ рдкреНрд░рддреНрдпреЗрдХ рдиреЛрдб (рдиреЛрдб) рдЧрдгрдирд╛ рдХреА рдПрдХ рдкрд░рдд рд╣реИред

рдХрд╛рдо рдХреА рд╡рд┐рд╢реЗрд╖рддрд╛рдПрдВ рд╣реИрдВ:

  • рд╕рдХреНрд░рд┐рдпрдг рдлрд╝рдВрдХреНрд╢рди, рдмреИрдЪ рджреНрд╡рд╛рд░рд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХрд░рдг, рдбреНрд░реЙрдкрдЖрдЙрдЯ - рд╡реЗ рд╕рднреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкрд░рддреЛрдВ рдХреЗ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рд┐рдд рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдпреЗ рдХрд╛рд░реНрдп рдЕрд▓рдЧ-рдЕрд▓рдЧ рдкрд░рддреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рдирд╣реАрдВ рд╣реИрдВред рд╢рд╛рдпрдж рдмреИрдЪрдиреЗрдо рдХреЛ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдПрдХ рдЕрд▓рдЧ рдкрд░рдд рдореЗрдВ рдЪреБрдирд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП;
  • рд╕реЙрдлреНрдЯрдореИрдХреНрд╕ рднреА рдПрдХ рдЕрд▓рдЧ рдкрд░рдд рдирд╣реАрдВ рд╣реИ, рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд▓реЙрд╕рдлрдВрдХреНрд╢рди рдкрд░рдд рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИред рдЬрд┐рд╕рдореЗрдВ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреНрд░рдХрд╛рд░ рдХреА рддреНрд░реБрдЯрд┐ рдЧрдгрдирд╛ рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╕рдордп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ;
  • "рд▓реЙрд╕рдлрд╝рдВрдХреНрд╢рди" рдкрд░рдд рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЖрдк рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЖрдЧреЗ / рдкрд┐рдЫрдбрд╝реЗ рдЪрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ (рдиреАрдЪреЗ рдЗрд╕ рдкрд░рдд рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ);
  • рдХреЛрдИ "рд╕рдорддрд▓" рдкрд░рдд рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ "рдлреБрд▓реАрдХреЛрдиреЗрдХреНрдЯ" рдкрд░рдд рдЦреБрдж рдЗрдирдкреБрдЯ рд╕рд░рдгреА рдЦреАрдВрдЪрддреА рд╣реИ;
  • рд╡реЗрдЯ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝рд░ рдХреЛ рдкреНрд░рддреНрдпреЗрдХ рд╡реЗрдЯ рд▓реЗрдпрд░ рдХреЗ рд▓рд┐рдП рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП; рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, 'рдПрдбреИрдо' рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рднреА рджреНрд╡рд╛рд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

рдЙрджрд╛рд╣рд░рдг


MNIST




C ++ рдХреЛрдб рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
//   sn::Net snet; snet.addNode("Input", sn::Input(), "C1") .addNode("C1", sn::Convolution(15, 0, sn::calcMode::CUDA), "C2") .addNode("C2", sn::Convolution(15, 0, sn::calcMode::CUDA), "P1") .addNode("P1", sn::Pooling(sn::calcMode::CUDA), "FC1") .addNode("FC1", sn::FullyConnected(128, sn::calcMode::CUDA), "FC2") .addNode("FC2", sn::FullyConnected(10, sn::calcMode::CUDA), "LS") .addNode("LS", sn::LossFunction(sn::lossType::softMaxToCrossEntropy), "Output"); ............. // -  //   for (int k = 0; k < 1000; ++k){ targetLayer.clear(); srand(clock()); //   for (int i = 0; i < batchSz; ++i){ ............. } //     float accurat = 0; snet.training(lr, inLayer, outLayer, targetLayer, accurat); } 


рдкреВрд░реНрдг рдХреЛрдб рдпрд╣рд╛рдБ рдЙрдкрд▓рдмреНрдз рд╣реИ ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рдмрдЧрд▓ рдореЗрдВ рд╕реНрдерд┐рдд рднрдВрдбрд╛рд░ рдореЗрдВ рдХреБрдЫ рдЪрд┐рддреНрд░ рдЬреЛрдбрд╝реЗред рдореИрдВрдиреЗ рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП opencv рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдореИрдВрдиреЗ рдЗрд╕реЗ рдХрд┐рдЯ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдирд╣реАрдВ рдХрд┐рдпрд╛ред

рдЙрд╕реА рдпреЛрдЬрдирд╛ рдХрд╛ рдПрдХ рдФрд░ рдиреЗрдЯрд╡рд░реНрдХ, рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ред



рдРрд╕рд╛ рдиреЗрдЯрд╡рд░реНрдХ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдб:
  //   sn::Net snet; snet.addNode("Input", sn::Input(), "C1 C2 C3") .addNode("C1", sn::Convolution(15, 0, sn::calcMode::CUDA), "P1") .addNode("P1", sn::Pooling(sn::calcMode::CUDA), "FC1") .addNode("C2", sn::Convolution(12, 0, sn::calcMode::CUDA), "P2") .addNode("P2", sn::Pooling(sn::calcMode::CUDA), "FC3") .addNode("C3", sn::Convolution(12, 0, sn::calcMode::CUDA), "P3") .addNode("P3", sn::Pooling(sn::calcMode::CUDA), "FC5") .addNode("FC1", sn::FullyConnected(128, sn::calcMode::CUDA), "FC2") .addNode("FC2", sn::FullyConnected(10, sn::calcMode::CUDA), "LS1") .addNode("LS1", sn::LossFunction(sn::lossType::softMaxToCrossEntropy), "Summ") .addNode("FC3", sn::FullyConnected(128, sn::calcMode::CUDA), "FC4") .addNode("FC4", sn::FullyConnected(10, sn::calcMode::CUDA), "LS2") .addNode("LS2", sn::LossFunction(sn::lossType::softMaxToCrossEntropy), "Summ") .addNode("FC5", sn::FullyConnected(128, sn::calcMode::CUDA), "FC6") .addNode("FC6", sn::FullyConnected(10, sn::calcMode::CUDA), "LS3") .addNode("LS3", sn::LossFunction(sn::lossType::softMaxToCrossEntropy), "Summ") .addNode("Summ", sn::Summator(), "Output"); ............. 


рдЙрджрд╛рд╣рд░рдгреЛрдВ рдореЗрдВ рдпрд╣ рдирд╣реАрдВ рд╣реИ, рдЖрдк рдпрд╣рд╛рдВ рд╕реЗ рдХреЙрдкреА рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд╛рдпрдерди рдореЗрдВ, рдХреЛрдб рднреА рджрд┐рдЦрддрд╛ рд╣реИ
  //   snet = snNet.Net() snet.addNode("Input", Input(), "C1 C2 C3") \ .addNode("C1", Convolution(15, 0, calcMode.CUDA), "P1") \ .addNode("P1", Pooling(calcMode.CUDA), "FC1") \ .addNode("C2", Convolution(12, 0, calcMode.CUDA), "P2") \ .addNode("P2", Pooling(calcMode.CUDA), "FC3") \ .addNode("C3", Convolution(12, 0, calcMode.CUDA), "P3") \ .addNode("P3", Pooling(calcMode.CUDA), "FC5") \ \ .addNode("FC1", FullyConnected(128, calcMode.CUDA), "FC2") \ .addNode("FC2", FullyConnected(10, calcMode.CUDA), "LS1") \ .addNode("LS1", LossFunction(lossType.softMaxToCrossEntropy), "Summ") \ \ .addNode("FC3", FullyConnected(128, calcMode.CUDA), "FC4") \ .addNode("FC4", FullyConnected(10, calcMode.CUDA), "LS2") \ .addNode("LS2", LossFunction(lossType.softMaxToCrossEntropy), "Summ") \ \ .addNode("FC5", FullyConnected(128, calcMode.CUDA), "FC6") \ .addNode("FC6", FullyConnected(10, calcMode.CUDA), "LS3") \ .addNode("LS3", LossFunction(lossType.softMaxToCrossEntropy), "Summ") \ \ .addNode("Summ", LossFunction(lossType.softMaxToCrossEntropy), "Output") ............. 


CIFAR-10




рдпрд╣рд╛рдВ рдореБрдЭреЗ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдмреИрдЪрдореЛрди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдирд╛ рдерд╛ред рдпрд╣ рдЧреНрд░рд┐рдб 1000 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдпреЛрдВ, рдмреИрдЪ 100 рдкрд░ 50% рд╕рдЯреАрдХрддрд╛ рддрдХ рд╕реАрдЦрддрд╛ рд╣реИред

рдпрд╣ рдХреЛрдб рдирд┐рдХрд▓рд╛
 sn::Net snet; snet.addNode("Input", sn::Input(), "C1") .addNode("C1", sn::Convolution(15, -1, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "C2") .addNode("C2", sn::Convolution(15, 0, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "P1") .addNode("P1", sn::Pooling(sn::calcMode::CUDA), "C3") .addNode("C3", sn::Convolution(25, -1, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "C4") .addNode("C4", sn::Convolution(25, 0, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "P2") .addNode("P2", sn::Pooling(sn::calcMode::CUDA), "C5") .addNode("C5", sn::Convolution(40, -1, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "C6") .addNode("C6", sn::Convolution(40, 0, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "P3") .addNode("P3", sn::Pooling(sn::calcMode::CUDA), "FC1") .addNode("FC1", sn::FullyConnected(2048, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "FC2") .addNode("FC2", sn::FullyConnected(128, sn::calcMode::CUDA, sn::batchNormType::beforeActive), "FC3") .addNode("FC3", sn::FullyConnected(10, sn::calcMode::CUDA), "LS") .addNode("LS", sn::LossFunction(sn::lossType::softMaxToCrossEntropy), "Output"); 


рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдХрд┐рд╕реА рднреА рдЪрд┐рддреНрд░ рд╡рд░реНрдЧреЛрдВ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред



рдЙреж тАФ рд╢реБрджреНрдз рддрд┐рдирд┐


рдЕрдВрддрд┐рдо рдЙрджрд╛рд╣рд░рдгред рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рд╕рд░рд▓реАрдХреГрдд рджреЗрд╢реА рдпреВ-рдиреЗрдЯред



рдореБрдЭреЗ рдереЛрдбрд╝рд╛ рд╕рдордЭрд╛рдЗрдП: рд▓реЗрдпрд░ DC1 ... - рд░рд┐рд╡рд░реНрд╕ рдХрдирд╡рд▓реНрд╢рди, рд▓реЗрдпрд░реНрд╕ Concat1 ... - рдЪреИрдирд▓ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреА рд▓реЗрдпрд░реНрд╕,
Rsz1 ... - рд╡рд┐рдкрд░реАрдд рдЪрд░рдг рдореЗрдВ рдЪреИрдирд▓реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рд╕рд╣рдордд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЪреИрдирд▓реЛрдВ рдХреА рд░рд╛рд╢рд┐ рд╕реЗ рддреНрд░реБрдЯрд┐ рдХреЙрдиреИрдЯ рдкрд░рдд рд╕реЗ рд╡рд╛рдкрд╕ рдЬрд╛рддреА рд╣реИред

C ++ рдХреЛрдбред
  sn::Net snet; snet.addNode("In", sn::Input(), "C1") .addNode("C1", sn::Convolution(10, -1, sn::calcMode::CUDA), "C2") .addNode("C2", sn::Convolution(10, 0, sn::calcMode::CUDA), "P1 Crop1") .addNode("Crop1", sn::Crop(sn::rect(0, 0, 487, 487)), "Rsz1") .addNode("Rsz1", sn::Resize(sn::diap(0, 10), sn::diap(0, 10)), "Conc1") .addNode("P1", sn::Pooling(sn::calcMode::CUDA), "C3") .addNode("C3", sn::Convolution(10, -1, sn::calcMode::CUDA), "C4") .addNode("C4", sn::Convolution(10, 0, sn::calcMode::CUDA), "P2 Crop2") .addNode("Crop2", sn::Crop(sn::rect(0, 0, 247, 247)), "Rsz2") .addNode("Rsz2", sn::Resize(sn::diap(0, 10), sn::diap(0, 10)), "Conc2") .addNode("P2", sn::Pooling(sn::calcMode::CUDA), "C5") .addNode("C5", sn::Convolution(10, 0, sn::calcMode::CUDA), "C6") .addNode("C6", sn::Convolution(10, 0, sn::calcMode::CUDA), "DC1") .addNode("DC1", sn::Deconvolution(10, sn::calcMode::CUDA), "Rsz3") .addNode("Rsz3", sn::Resize(sn::diap(0, 10), sn::diap(10, 20)), "Conc2") .addNode("Conc2", sn::Concat("Rsz2 Rsz3"), "C7") .addNode("C7", sn::Convolution(10, 0, sn::calcMode::CUDA), "C8") .addNode("C8", sn::Convolution(10, 0, sn::calcMode::CUDA), "DC2") .addNode("DC2", sn::Deconvolution(10, sn::calcMode::CUDA), "Rsz4") .addNode("Rsz4", sn::Resize(sn::diap(0, 10), sn::diap(10, 20)), "Conc1") .addNode("Conc1", sn::Concat("Rsz1 Rsz4"), "C9") .addNode("C9", sn::Convolution(10, 0, sn::calcMode::CUDA), "C10"); sn::Convolution convOut(1, 0, sn::calcMode::CUDA); convOut.act = sn::active::sigmoid; snet.addNode("C10", convOut, "Output"); 


рдкреВрд░реНрдг рдХреЛрдб рдФрд░ рдЪрд┐рддреНрд░ рдпрд╣рд╛рдБ рд╣реИрдВ ред


рдЗрд╕ рддрд░рд╣ рд╕реЗ рдУрдкрди рд╕реЛрд░реНрд╕ рдореИрдереНрд╕ред
рдореИрдВрдиреЗ MNIST рдкрд░ рд╕рднреА рдкрд░рддреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛; TF рдиреЗ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рдореВрд▓реНрдпрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдорд╛рдирдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рд░реНрдп рдХрд┐рдпрд╛ред


рдЖрдЧреЗ рдХреНрдпрд╛ рд╣реИ

рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЪреМрдбрд╝рд╛рдИ рдореЗрдВ рдирд╣реАрдВ рдмрдврд╝реЗрдЧреА, рдпрд╛рдиреА рдХреЛрдИ рдУрдкреЗрдХреЗрдВрд╡, рд╕реЙрдХреЗрдЯреНрд╕ рдЗрддреНрдпрд╛рджрд┐ рдирд╣реАрдВ, рддрд╛рдХрд┐ рдлреБрд▓рд╛рдпрд╛ рди рдЬрд╛рдПред
рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд╣реАрдВ рдмрджрд▓реЗрдЧрд╛ / рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рд╣реЛрдЧрд╛, рдореИрдВ рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдирд╣реАрдВ рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рдФрд░ рдХрднреА рдирд╣реАрдВ, рд▓реЗрдХрд┐рди рдЕрдВрддрд┐рдо рд▓реЗрдХрд┐рди рдХрдо рд╕реЗ рдХрдо рдирд╣реАрдВред

рдХреЗрд╡рд▓ рдЧрд╣рд░рд╛рдИ рдореЗрдВ: рдореИрдВ OpenCL рдкрд░ рдЧрдгрдирд╛ рдХрд░реВрдБрдЧрд╛, C # рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕, RNN рдиреЗрдЯрд╡рд░реНрдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ ...
MKL рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдЗрд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдиреЗрдЯрд╡рд░реНрдХ рдереЛрдбрд╝рд╛ рдЧрд╣рд░рд╛ рд╣реИ - рдпрд╣ рд╡реАрдбрд┐рдпреЛ рдХрд╛рд░реНрдб рдкрд░ рд╡реИрд╕реЗ рднреА рддреЗрдЬрд╝ рд╣реИ, рдФрд░ рдФрд╕рдд рдкреНрд░рджрд░реНрд╢рди рдХрд╛рд░реНрдб рдмрд┐рд▓реНрдХреБрд▓ рднреА рдХрдо рдирд╣реАрдВ рд╣реИред

рдЕрдиреНрдп рдЪреМрдЦрдЯреЛрдВ рдХреЗ рд╕рд╛рде рддреМрд▓ рдХрд╛ рдЖрдпрд╛рдд / рдирд┐рд░реНрдпрд╛рдд - рдкрд╛рдпрдерди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (рдЕрднреА рддрдХ рд▓рд╛рдЧреВ рдирд╣реАрдВ)ред рд░реЛрдбрдореИрдк рд╣реЛрдЧрд╛ рдЕрдЧрд░ рд▓реЛрдЧреЛрдВ рдореЗрдВ рджрд┐рд▓рдЪрд╕реНрдкреА рдкреИрджрд╛ рд╣реЛред

рдХреГрдкрдпрд╛ рдХреЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХреМрди рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рд╕реАрдорд╛рдПрдВ рд╣реИрдВ рддрд╛рдХрд┐ рд╡рд░реНрддрдорд╛рди рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдЯреВрдЯ рди рдЬрд╛рдПред

рдЖрдк рдЕрдЬрдЧрд░ рдХреЛ рдЕрд╕рдВрднрд╡рддрд╛ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдбреЙрдХ рдФрд░ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

рдкрд╛рдпрдерди рд╕реЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП:

* рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ libskynet - рд╕реАрдкреАрдпреВ
* рдкрд╛рдЗрдк рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ libskynet-cu - CUDA9.2 + cuDNN7.3.1

рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЧрд╛рдЗрдб ред

рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдПрдордЖрдИрдЯреА рд▓рд╛рдЗрд╕реЗрдВрд╕ред

рдЖрдкрдХрд╛ рдзрдиреНрдпрд╡рд╛рдж

Source: https://habr.com/ru/post/hi425717/


All Articles