28#include "tiny_dnn/util/util.h"
35 static float_t f(
const vec_t&
y,
const vec_t&
t) {
39 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
45 static vec_t df(
const vec_t&
y,
const vec_t&
t) {
50 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
51 d[
i] = factor * (
y[
i] -
t[
i]);
60 static float_t f(
const vec_t&
y,
const vec_t&
t) {
64 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
65 d += std::abs(
y[
i] -
t[
i]);
70 static vec_t df(
const vec_t&
y,
const vec_t&
t) {
75 for(serial_size_t
i = 0;
i <
y.size(); ++
i) {
94 static float_t f(
const vec_t&
y,
const vec_t&
t) {
99 for(serial_size_t
i = 0;
i <
y.size(); ++
i) {
107 static vec_t df(
const vec_t&
y,
const vec_t&
t) {
113 for(serial_size_t
i = 0;
i <
y.size(); ++
i) {
129 static float_t f(
const vec_t&
y,
const vec_t&
t) {
133 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
139 static vec_t df(
const vec_t&
y,
const vec_t&
t) {
143 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
153 static float_t f(
const vec_t&
y,
const vec_t&
t) {
157 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
158 d += -
t[
i] * std::log(
y[
i]);
163 static vec_t df(
const vec_t&
y,
const vec_t&
t) {
167 for(serial_size_t
i = 0;
i <
y.size(); ++
i)
175vec_t gradient(
const vec_t&
y,
const vec_t&
t) {
181std::vector<vec_t> gradient(
const std::vector<vec_t>& y,
const std::vector<vec_t>& t) {
182 std::vector<vec_t> grads;
184 assert(y.size() == t.size());
186 for (serial_size_t i = 0; i < y.size(); i++)
187 grads.push_back(gradient<E>(y[i], t[i]));
192inline void apply_cost_if_defined(std::vector<vec_t>& sample_gradient,
193 const std::vector<vec_t>& sample_cost) {
194 if (sample_gradient.size() == sample_cost.size()) {
196 const serial_size_t channel_count =
static_cast<serial_size_t
>(sample_gradient.size());
197 for (
size_t channel = 0; channel < channel_count; ++channel) {
198 if (sample_gradient[channel].size() == sample_cost[channel].size()) {
199 const size_t element_count = sample_gradient[channel].size();
202 for (
size_t element = 0; element < element_count; ++element) {
203 sample_gradient[channel][element] *= sample_cost[channel][element];
212std::vector<tensor_t> gradient(
const std::vector<tensor_t>& y,
213 const std::vector<tensor_t>& t,
214 const std::vector<tensor_t>& t_cost) {
216 const serial_size_t sample_count =
static_cast<serial_size_t
>(y.size());
217 const serial_size_t channel_count =
static_cast<serial_size_t
>(y[0].size());
219 std::vector<tensor_t> gradients(sample_count);
221 CNN_UNREFERENCED_PARAMETER(channel_count);
222 assert(y.size() == t.size());
223 assert(t_cost.empty() || t_cost.size() == t.size());
226 for (serial_size_t sample = 0; sample < sample_count; ++sample) {
227 assert(y[sample].size() == channel_count);
228 assert(t[sample].size() == channel_count);
229 assert(t_cost.empty() || t_cost[sample].empty() ||
230 t_cost[sample].size() == channel_count);
232 gradients[sample] = gradient<E>(y[sample], t[sample]);
234 if (sample < t_cost.size()) {
235 apply_cost_if_defined(gradients[sample], t_cost[sample]);
Definition loss_function.h:92
Definition loss_function.h:58
Definition loss_function.h:151
Definition loss_function.h:127
Simple image utility class.
Definition image.h:94
Definition loss_function.h:33