Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
OpenDAS
dlib
Commits
bc2f02d7
Commit
bc2f02d7
authored
Nov 09, 2015
by
Davis King
Browse files
Implemented the CPU side of the tools in cuda_dlib.h and also cleaned some
things up a bit.
parent
2bc5202b
Changes
3
Show whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
125 additions
and
120 deletions
+125
-120
dlib/dnn/cpu_dlib.cpp
dlib/dnn/cpu_dlib.cpp
+55
-31
dlib/dnn/cpu_dlib.h
dlib/dnn/cpu_dlib.h
+11
-31
dlib/dnn/cuda_dlib.h
dlib/dnn/cuda_dlib.h
+59
-58
No files found.
dlib/dnn/cpu_dlib.cpp
View file @
bc2f02d7
...
...
@@ -12,6 +12,19 @@ namespace dlib
namespace
cpu
{
// -----------------------------------------------------------------------------------
void
multiply
(
tensor
&
dest
,
const
tensor
&
src
)
{
const
auto
d
=
dest
.
host
();
const
auto
s
=
src
.
host
();
for
(
size_t
i
=
0
;
i
<
src
.
size
();
++
i
)
d
[
i
]
*=
s
[
i
];
}
// -----------------------------------------------------------------------------------
void
affine_transform
(
...
...
@@ -21,7 +34,11 @@ namespace dlib
const
float
B
)
{
// TODO
dest
.
copy_size
(
src
);
const
auto
d
=
dest
.
host
();
const
auto
s
=
src
.
host
();
for
(
size_t
i
=
0
;
i
<
src
.
size
();
++
i
)
d
[
i
]
=
A
*
s
[
i
]
+
B
;
}
// -----------------------------------------------------------------------------------
...
...
@@ -33,7 +50,36 @@ namespace dlib
const
tensor
&
B
)
{
// TODO
DLIB_CASSERT
(
((
A
.
num_samples
()
==
1
&&
B
.
num_samples
()
==
1
)
||
(
A
.
num_samples
()
==
src
.
num_samples
()
&&
B
.
num_samples
()
==
src
.
num_samples
()))
&&
A
.
nr
()
==
B
.
nr
()
&&
B
.
nr
()
==
src
.
nr
()
&&
A
.
nc
()
==
B
.
nc
()
&&
B
.
nc
()
==
src
.
nc
()
&&
A
.
k
()
==
B
.
k
()
&&
B
.
k
()
==
src
.
k
(),
""
);
dest
.
copy_size
(
src
);
auto
d
=
dest
.
host
();
auto
s
=
src
.
host
();
const
auto
a
=
A
.
host
();
const
auto
b
=
B
.
host
();
if
(
A
.
num_samples
()
==
1
)
{
const
long
num
=
src
.
size
()
/
src
.
num_samples
();
for
(
size_t
i
=
0
;
i
<
src
.
num_samples
();
++
i
)
{
for
(
long
j
=
0
;
j
<
num
;
++
j
)
{
*
d
=
a
[
j
]
*
(
*
s
)
+
b
[
j
];
d
++
;
s
++
;
}
}
}
else
{
for
(
size_t
i
=
0
;
i
<
src
.
size
();
++
i
)
d
[
i
]
=
a
[
i
]
*
s
[
i
]
+
b
[
i
];
}
}
// -----------------------------------------------------------------------------------
...
...
@@ -397,41 +443,19 @@ namespace dlib
// -----------------------------------------------------------------------------------
dropout
::
dropout
(
float
drop_rate
)
{
}
dropout
::
dropout
(
float
drop_rate
,
int
seed
)
{
}
void
dropout
::
operator
()
(
resizable_tensor
&
dest
,
resizable_tensor
&
random_mask
,
const
tensor
&
src
)
{
}
void
dropout
::
get_gradient
(
const
tensor
&
gradient_input
,
const
tensor
&
random_mask
,
tensor
&
grad
void
threshold
(
tensor
&
data
,
float
thresh
)
{
const
auto
d
=
data
.
host
();
for
(
size_t
i
=
0
;
i
<
data
.
size
();
++
i
)
d
[
i
]
=
d
[
i
]
>
thresh
?
1
:
0
;
}
// -----------------------------------------------------------------------------------
}
}
...
...
dlib/dnn/cpu_dlib.h
View file @
bc2f02d7
...
...
@@ -12,6 +12,13 @@ namespace dlib
namespace
cpu
{
// -----------------------------------------------------------------------------------
void
multiply
(
tensor
&
dest
,
const
tensor
&
src
);
// -----------------------------------------------------------------------------------
void
affine_transform
(
...
...
@@ -74,37 +81,10 @@ namespace dlib
// -----------------------------------------------------------------------------------
class
dropout
{
public:
// not copyable
dropout
(
const
dropout
&
)
=
delete
;
dropout
&
operator
=
(
const
dropout
&
)
=
delete
;
// but is movable
dropout
(
dropout
&&
item
)
:
dropout
()
{
swap
(
item
);
}
dropout
&
operator
=
(
dropout
&&
item
)
{
swap
(
item
);
return
*
this
;
}
dropout
(
float
drop_rate
=
0.5
);
dropout
(
float
drop_rate
,
int
seed
);
void
swap
(
dropout
&
item
)
{
// TODO
}
void
operator
()
(
resizable_tensor
&
dest
,
resizable_tensor
&
random_mask
,
const
tensor
&
src
);
void
get_gradient
(
const
tensor
&
gradient_input
,
const
tensor
&
random_mask
,
tensor
&
grad
void
threshold
(
tensor
&
data
,
float
thresh
);
};
// -----------------------------------------------------------------------------------
...
...
dlib/dnn/cuda_dlib.h
View file @
bc2f02d7
...
...
@@ -12,8 +12,20 @@ namespace dlib
namespace
cuda
{
// TODO, remove this
void
add_arrays
(
const
gpu_data
&
a
,
const
gpu_data
&
b
,
gpu_data
&
out
);
// -----------------------------------------------------------------------------------
void
multiply
(
tensor
&
dest
,
const
tensor
&
src
);
/*!
requires
- have_same_dimensions(dest,src) == true
ensures
- #dest == dest*src
That is, for all valid i:
#dest.host()[i] == dest.host()[i]*src.host()[i]
!*/
// -----------------------------------------------------------------------------------
...
...
@@ -39,15 +51,22 @@ namespace dlib
);
/*!
requires
- A.num_samples() == 1
-
if (
A.num_samples() == 1
) then
- B.num_samples() == 1
- else
- A.num_samples() == src.num_samples()
- B.num_samples() == src.num_samples()
- A.nr() == B.nr() == src.nr()
- A.nc() == B.nc() == src.nc()
- A.k() == B.k() == src.k()
ensures
- have_same_dimensions(#dest,src) == true
- if (A.num_samples() == 1) then
- #dest == A*src + B
(done for each sample in src)
- else
- for all valid i:
- #dest.host()[i] == A.host()[i]*src.host()[i] + B.host()[i]
!*/
// -----------------------------------------------------------------------------------
...
...
@@ -108,9 +127,9 @@ namespace dlib
ensures
- Let f(src,gamma,beta) == dot(gradient_input, dest output of
batch_normalize(dest,means,vars,src,gamma,beta))
- Adds the gradient of f() with respect to src to #src
- Adds the gradient of f() with respect to gamma to #gamma
- Adds the gradient of f() with respect to beta to #beta
- Adds the gradient of f() with respect to src to #src
_grad.
- Adds the gradient of f() with respect to gamma to #gamma
_grad.
- Adds the gradient of f() with respect to beta to #beta
_grad.
!*/
void
batch_normalize_conv
(
...
...
@@ -147,59 +166,41 @@ namespace dlib
tensor
&
gamma_grad
,
tensor
&
beta_grad
);
// -----------------------------------------------------------------------------------
class
dropout
{
/*!
!*/
public:
// not copyable
dropout
(
const
dropout
&
)
=
delete
;
dropout
&
operator
=
(
const
dropout
&
)
=
delete
;
// but is movable
dropout
(
dropout
&&
item
)
:
dropout
()
{
swap
(
item
);
}
dropout
&
operator
=
(
dropout
&&
item
)
{
swap
(
item
);
return
*
this
;
}
dropout
(
float
drop_rate
=
0.5
);
dropout
(
float
drop_rate
,
int
seed
);
void
swap
(
dropout
&
item
)
{
// TODO
}
void
operator
()
(
resizable_tensor
&
dest
,
resizable_tensor
&
random_mask
,
const
tensor
&
src
);
/*!
requires
- vars and means should be the output of a call to
batch_normalize_conv(dest,means,vars,src,gamma,beta)
- have_same_dimensions(gradient_input, src) == true
- have_same_dimensions(src, src_grad) == true
- src.num_samples() > 1
- gamma.num_samples()==gamma.nr()==gamma.nc() == 1
- have_same_dimensions(gamma, gamma_grad) == true
- have_same_dimensions(gamma, beta_grad) == true
- gamma.k() == src.k()
- have_same_dimensions(means, gamma) == true
- have_same_dimensions(vars, gamma) == true
ensures
- have_same_dimensions(src, #dest) == true
- have_same_dimensions(src, #random_mask) == true
- Let f(src,gamma,beta) == dot(gradient_input, dest output of
batch_normalize_conv(dest,means,vars,src,gamma,beta))
- Adds the gradient of f() with respect to src to #src_grad.
- Adds the gradient of f() with respect to gamma to #gamma_grad.
- Adds the gradient of f() with respect to beta to #beta_grad.
!*/
void
get_gradient
(
const
tensor
&
gradient_input
,
const
tensor
&
random_mask
,
tensor
&
grad
// -----------------------------------------------------------------------------------
void
threshold
(
tensor
&
data
,
float
thresh
);
/*!
requires
- have_same_dimensions(gradient_input, random_mask) == true
- have_same_dimensions(gradient_input, grad) == true
ensures
- let OUT and MASK be the output of (*this)(OUT,MASK,src)
- let f(src) == dot(gradient_input,OUT)
- Then this function computes the gradient of f() with respect to src
and adds it to grad.
- Sets all elements of data to 1 or 0 depending on if they are above or
below the given threshold. Specifically, for all valid i:
- #data.host()[i] == data.host()[i]>thresh ? 1 : 0
!*/
};
// -----------------------------------------------------------------------------------
// -----------------------------------------------------------------------------------
-
}
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment