29 #include "tiny_dnn/core/params/fully_params.h"
35 fully_connected_op_internal(
const tensor_t& in_data,
39 const fully_params& params,
40 const bool layer_parallelize) {
41 for_i(layer_parallelize, in_data.size(), [&](
int sample) {
42 const vec_t& in = in_data[sample];
43 vec_t& out = out_data[sample];
45 for (serial_size_t i = 0; i < params.out_size_; i++) {
47 for (serial_size_t c = 0; c < params.in_size_; c++) {
48 out[i] += W[c * params.out_size_ + i] * in[c];
51 if (params.has_bias_) {
59 fully_connected_op_internal(
const tensor_t& prev_out,
65 const fully_params& params,
66 const bool layer_parallelize) {
67 for (serial_size_t sample = 0; sample < prev_out.size(); sample++) {
68 for (serial_size_t c = 0; c < params.in_size_; c++) {
71 prev_delta[sample][c] += vectorize::dot(&curr_delta[sample][0],
72 &W[c * params.out_size_],
76 for_(layer_parallelize, 0,
size_t(params.out_size_), [&](
const blocked_range& r) {
79 for (serial_size_t c = 0; c < params.in_size_; c++) {
80 vectorize::muladd(&curr_delta[sample][r.begin()],
81 prev_out[sample][c], r.end() - r.begin(),
82 &dW[sample][c * params.out_size_ + r.begin()]);
85 if (params.has_bias_) {
87 for (int i = r.begin(); i < r.end(); i++) {
88 db[sample][i] += curr_delta[sample][i];