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
81847660
Commit
81847660
authored
Dec 06, 2015
by
Davis King
Browse files
Added conv_ spec and did a little cleanup.
parent
adc022c7
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
161 additions
and
37 deletions
+161
-37
dlib/dnn/layers.h
dlib/dnn/layers.h
+53
-37
dlib/dnn/layers_abstract.h
dlib/dnn/layers_abstract.h
+108
-0
No files found.
dlib/dnn/layers.h
View file @
81847660
...
...
@@ -21,6 +21,16 @@ namespace dlib
class
con_
{
public:
con_
(
)
:
_num_filters
(
1
),
_nr
(
3
),
_nc
(
3
),
_stride_y
(
1
),
_stride_x
(
1
)
{}
con_
(
long
num_filters_
,
long
nr_
,
...
...
@@ -28,22 +38,28 @@ namespace dlib
int
stride_y_
=
1
,
int
stride_x_
=
1
)
:
num_filters
(
num_filters_
),
nr
(
nr_
),
nc
(
nc_
),
stride_y
(
stride_y_
),
stride_x
(
stride_x_
)
_
num_filters
(
num_filters_
),
_
nr
(
nr_
),
_
nc
(
nc_
),
_
stride_y
(
stride_y_
),
_
stride_x
(
stride_x_
)
{}
long
num_filters
()
const
{
return
_num_filters
;
}
long
nr
()
const
{
return
_nr
;
}
long
nc
()
const
{
return
_nc
;
}
long
stride_y
()
const
{
return
_stride_y
;
}
long
stride_x
()
const
{
return
_stride_x
;
}
con_
(
const
con_
&
item
)
:
params
(
item
.
params
),
num_filters
(
item
.
num_filters
),
nr
(
item
.
nr
),
nc
(
item
.
nc
),
stride_y
(
item
.
stride_y
),
stride_x
(
item
.
stride_x
),
_
num_filters
(
item
.
_
num_filters
),
_
nr
(
item
.
_
nr
),
_
nc
(
item
.
_
nc
),
_
stride_y
(
item
.
_
stride_y
),
_
stride_x
(
item
.
_
stride_x
),
filters
(
item
.
filters
),
biases
(
item
.
biases
)
{
...
...
@@ -61,11 +77,11 @@ namespace dlib
// this->conv is non-copyable and basically stateless, so we have to write our
// own copy to avoid trying to copy it and getting an error.
params
=
item
.
params
;
num_filters
=
item
.
num_filters
;
nr
=
item
.
nr
;
nc
=
item
.
nc
;
stride_y
=
item
.
stride_y
;
stride_x
=
item
.
stride_x
;
_
num_filters
=
item
.
_
num_filters
;
_
nr
=
item
.
_
nr
;
_
nc
=
item
.
_
nc
;
_
stride_y
=
item
.
_
stride_y
;
_
stride_x
=
item
.
_
stride_x
;
filters
=
item
.
filters
;
biases
=
item
.
biases
;
return
*
this
;
...
...
@@ -74,16 +90,16 @@ namespace dlib
template
<
typename
SUBNET
>
void
setup
(
const
SUBNET
&
sub
)
{
long
num_inputs
=
nr
*
nc
*
sub
.
get_output
().
k
();
long
num_outputs
=
num_filters
;
long
num_inputs
=
_
nr
*
_
nc
*
sub
.
get_output
().
k
();
long
num_outputs
=
_
num_filters
;
// allocate params for the filters and also for the filter bias values.
params
.
set_size
(
num_inputs
*
num_filters
+
num_filters
);
params
.
set_size
(
num_inputs
*
_
num_filters
+
_
num_filters
);
dlib
::
rand
rnd
(
"con_"
+
cast_to_string
(
num_outputs
+
num_inputs
));
randomize_parameters
(
params
,
num_inputs
+
num_outputs
,
rnd
);
filters
=
alias_tensor
(
num_filters
,
sub
.
get_output
().
k
(),
nr
,
nc
);
biases
=
alias_tensor
(
1
,
num_filters
);
filters
=
alias_tensor
(
_
num_filters
,
sub
.
get_output
().
k
(),
_
nr
,
_
nc
);
biases
=
alias_tensor
(
1
,
_
num_filters
);
// set the initial bias values to zero
biases
(
params
,
filters
.
size
())
=
0
;
...
...
@@ -95,8 +111,8 @@ namespace dlib
conv
(
output
,
sub
.
get_output
(),
filters
(
params
,
0
),
stride_y
,
stride_x
);
_
stride_y
,
_
stride_x
);
tt
::
add
(
1
,
output
,
1
,
biases
(
params
,
filters
.
size
()));
}
...
...
@@ -118,11 +134,11 @@ namespace dlib
{
serialize
(
"con_"
,
out
);
serialize
(
item
.
params
,
out
);
serialize
(
item
.
num_filters
,
out
);
serialize
(
item
.
nr
,
out
);
serialize
(
item
.
nc
,
out
);
serialize
(
item
.
stride_y
,
out
);
serialize
(
item
.
stride_y
,
out
);
serialize
(
item
.
_
num_filters
,
out
);
serialize
(
item
.
_
nr
,
out
);
serialize
(
item
.
_
nc
,
out
);
serialize
(
item
.
_
stride_y
,
out
);
serialize
(
item
.
_
stride_y
,
out
);
serialize
(
item
.
filters
,
out
);
serialize
(
item
.
biases
,
out
);
}
...
...
@@ -134,11 +150,11 @@ namespace dlib
if
(
version
!=
"con_"
)
throw
serialization_error
(
"Unexpected version found while deserializing dlib::con_."
);
deserialize
(
item
.
params
,
in
);
deserialize
(
item
.
num_filters
,
in
);
deserialize
(
item
.
nr
,
in
);
deserialize
(
item
.
nc
,
in
);
deserialize
(
item
.
stride_y
,
in
);
deserialize
(
item
.
stride_y
,
in
);
deserialize
(
item
.
_
num_filters
,
in
);
deserialize
(
item
.
_
nr
,
in
);
deserialize
(
item
.
_
nc
,
in
);
deserialize
(
item
.
_
stride_y
,
in
);
deserialize
(
item
.
_
stride_y
,
in
);
deserialize
(
item
.
filters
,
in
);
deserialize
(
item
.
biases
,
in
);
}
...
...
@@ -146,11 +162,11 @@ namespace dlib
private:
resizable_tensor
params
;
long
num_filters
;
long
nr
;
long
nc
;
int
stride_y
;
int
stride_x
;
long
_
num_filters
;
long
_
nr
;
long
_
nc
;
int
_
stride_y
;
int
_
stride_x
;
alias_tensor
filters
,
biases
;
tt
::
tensor_conv
conv
;
...
...
dlib/dnn/layers_abstract.h
View file @
81847660
...
...
@@ -329,6 +329,8 @@ namespace dlib
unsigned
long
num_outputs
);
/*!
requires
- num_outputs > 0
ensures
- #get_num_outputs() == num_outputs
!*/
...
...
@@ -363,6 +365,112 @@ namespace dlib
template
<
typename
SUBNET
>
using
fc
=
add_layer
<
fc_
,
SUBNET
>
;
// ----------------------------------------------------------------------------------------
class
con_
{
/*!
WHAT THIS OBJECT REPRESENTS
This is an implementation of the EXAMPLE_LAYER_ interface defined above.
In particular, it defines a convolution layer that takes an input tensor
(nominally representing an image) and convolves it with a set of filters
and then outputs the results.
!*/
public:
con_
(
);
/*!
ensures
- #num_filters() == 1
- #nr() == 3
- #nc() == 3
- #stride_y() == 1
- #stride_x() == 1
!*/
con_
(
long
num_filters_
,
long
nr_
,
long
nc_
,
int
stride_y_
=
1
,
int
stride_x_
=
1
);
/*!
requires
- num_filters_ > 0
- nr_ > 0
- nc_ > 0
- stride_y_ > 0
- stride_x_ > 0
ensures
- #num_filters() == num_filters_
- #nr() == nr_
- #nc() == nc_
- #stride_y() == stride_y_
- #stride_x() == stride_x_
!*/
long
num_filters
(
)
const
;
/*!
ensures
- returns the number of filters contained in this layer. The k dimension
of the output tensors produced by this layer will be equal to the number
of filters.
!*/
long
nr
(
)
const
;
/*!
ensures
- returns the number of rows in the filters in this layer.
!*/
long
nc
(
)
const
;
/*!
ensures
- returns the number of columns in the filters in this layer.
!*/
long
stride_y
(
)
const
;
/*!
ensures
- returns the vertical stride used when convolving the filters over an
image. That is, each filter will be moved stride_y() pixels down at a
time when it moves over the image.
!*/
long
stride_x
(
)
const
;
/*!
ensures
- returns the horizontal stride used when convolving the filters over an
image. That is, each filter will be moved stride_x() pixels right at a
time when it moves over the image.
!*/
template
<
typename
SUBNET
>
void
setup
(
const
SUBNET
&
sub
);
template
<
typename
SUBNET
>
void
forward
(
const
SUBNET
&
sub
,
resizable_tensor
&
output
);
template
<
typename
SUBNET
>
void
backward
(
const
tensor
&
gradient_input
,
SUBNET
&
sub
,
tensor
&
params_grad
);
const
tensor
&
get_layer_params
()
const
;
tensor
&
get_layer_params
();
/*!
These functions are implemented as described in the EXAMPLE_LAYER_ interface.
!*/
};
void
serialize
(
const
con_
&
item
,
std
::
ostream
&
out
);
void
deserialize
(
con_
&
item
,
std
::
istream
&
in
);
/*!
provides serialization support
!*/
template
<
typename
SUBNET
>
using
con
=
add_layer
<
con_
,
SUBNET
>
;
// ----------------------------------------------------------------------------------------
class
relu_
...
...
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