Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
S
seminar-breakout
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Shashank Suhas
seminar-breakout
Commits
491e7144
Commit
491e7144
authored
Oct 22, 2016
by
Yuxin Wu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
loadcaffe supports BN
parent
59cd3c77
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
67 additions
and
35 deletions
+67
-35
tensorpack/utils/loadcaffe.py
tensorpack/utils/loadcaffe.py
+67
-35
No files found.
tensorpack/utils/loadcaffe.py
View file @
491e7144
...
@@ -19,59 +19,91 @@ __all__ = ['load_caffe', 'get_caffe_pb']
...
@@ -19,59 +19,91 @@ __all__ = ['load_caffe', 'get_caffe_pb']
CAFFE_PROTO_URL
=
"https://github.com/BVLC/caffe/raw/master/src/caffe/proto/caffe.proto"
CAFFE_PROTO_URL
=
"https://github.com/BVLC/caffe/raw/master/src/caffe/proto/caffe.proto"
def
get_processor
():
class
CaffeLayerProcessor
(
object
):
ret
=
{}
def
__init__
(
self
,
net
):
def
process_conv
(
layer_name
,
param
,
input_data_shape
):
self
.
net
=
net
assert
len
(
param
)
==
2
self
.
layer_names
=
net
.
_layer_names
self
.
param_dict
=
{}
self
.
processors
=
{
'Convolution'
:
self
.
proc_conv
,
'InnerProduct'
:
self
.
proc_fc
,
'BatchNorm'
:
self
.
proc_bn
,
'Scale'
:
self
.
proc_scale
}
def
process
(
self
):
for
idx
,
layer
in
enumerate
(
self
.
net
.
layers
):
param
=
layer
.
blobs
name
=
self
.
layer_names
[
idx
]
if
layer
.
type
in
self
.
processors
:
logger
.
info
(
"Processing layer {} of type {}"
.
format
(
name
,
layer
.
type
))
dic
=
self
.
processors
[
layer
.
type
](
idx
,
name
,
param
)
self
.
param_dict
.
update
(
dic
)
elif
len
(
layer
.
blobs
)
!=
0
:
logger
.
warn
(
"{} layer contains parameters but is not supported!"
.
format
(
layer
.
type
))
return
self
.
param_dict
def
proc_conv
(
self
,
idx
,
name
,
param
):
assert
len
(
param
)
<=
2
assert
param
[
0
]
.
data
.
ndim
==
4
# caffe: ch_out, ch_in, h, w
# caffe: ch_out, ch_in, h, w
return
{
layer_name
+
'/W'
:
param
[
0
]
.
data
.
transpose
(
2
,
3
,
1
,
0
),
W
=
param
[
0
]
.
data
.
transpose
(
2
,
3
,
1
,
0
)
layer_name
+
'/b'
:
param
[
1
]
.
data
}
if
len
(
param
)
==
1
:
ret
[
'Convolution'
]
=
process_conv
return
{
name
+
'/W'
:
W
}
else
:
return
{
name
+
'/W'
:
W
,
name
+
'/b'
:
param
[
1
]
.
data
}
# TODO caffe has an 'transpose' option for fc/W
def
proc_fc
(
self
,
idx
,
name
,
param
):
def
process_fc
(
layer_name
,
param
,
input_data_shape
):
# TODO caffe has an 'transpose' option for fc/W
assert
len
(
param
)
==
2
assert
len
(
param
)
==
2
if
len
(
input_data_shape
)
==
3
:
prev_layer_name
=
self
.
net
.
bottom_names
[
name
][
0
]
logger
.
info
(
"{} is right after spatial data."
.
format
(
layer_name
))
prev_layer_output
=
self
.
net
.
blobs
[
prev_layer_name
]
.
data
if
prev_layer_output
.
ndim
==
4
:
logger
.
info
(
"FC layer {} takes spatial data."
.
format
(
name
))
W
=
param
[
0
]
.
data
W
=
param
[
0
]
.
data
# original: outx(CxHxW)
# original: outx(CxHxW)
W
=
W
.
reshape
((
-
1
,)
+
input_data_shape
)
.
transpose
(
2
,
3
,
1
,
0
)
W
=
W
.
reshape
((
-
1
,)
+
prev_layer_output
.
shape
[
1
:]
)
.
transpose
(
2
,
3
,
1
,
0
)
# become: (HxWxC)xout
# become: (HxWxC)xout
else
:
else
:
W
=
param
[
0
]
.
data
.
transpose
()
W
=
param
[
0
]
.
data
.
transpose
()
return
{
layer_name
+
'/W'
:
W
,
return
{
name
+
'/W'
:
W
,
layer_name
+
'/b'
:
param
[
1
]
.
data
}
name
+
'/b'
:
param
[
1
]
.
data
}
ret
[
'InnerProduct'
]
=
process_fc
def
proc_bn
(
self
,
idx
,
name
,
param
):
assert
param
[
2
]
.
data
[
0
]
==
1.0
return
{
name
+
'/mean/EMA'
:
param
[
0
]
.
data
,
name
+
'/variance/EMA'
:
param
[
1
]
.
data
}
def
proc_scale
(
self
,
idx
,
name
,
param
):
bottom_name
=
self
.
net
.
bottom_names
[
name
][
0
]
# find te bn layer before this scaling
for
i
,
layer
in
enumerate
(
self
.
net
.
layers
):
if
layer
.
type
==
'BatchNorm'
:
name2
=
self
.
layer_names
[
i
]
bottom_name2
=
self
.
net
.
bottom_names
[
name2
][
0
]
if
bottom_name2
==
bottom_name
:
# scaling and BN share the same bottom, should merge
logger
.
info
(
"Merge {} and {} into one BatchNorm layer"
.
format
(
name
,
name2
))
return
{
name
+
'/beta'
:
param
[
1
]
.
data
,
name
+
'/gamma'
:
param
[
0
]
.
data
}
# assume this scaling layer is part of some BN
logger
.
error
(
"Could not find a BN layer corresponding to this Scale layer!"
)
raise
ValueError
()
return
ret
def
load_caffe
(
model_desc
,
model_file
):
def
load_caffe
(
model_desc
,
model_file
):
"""
"""
return a dict of params
return a dict of params
"""
"""
param_dict
=
{}
param_processors
=
get_processor
()
with
change_env
(
'GLOG_minloglevel'
,
'2'
):
with
change_env
(
'GLOG_minloglevel'
,
'2'
):
import
caffe
import
caffe
caffe
.
set_mode_cpu
()
caffe
.
set_mode_cpu
()
net
=
caffe
.
Net
(
model_desc
,
model_file
,
caffe
.
TEST
)
net
=
caffe
.
Net
(
model_desc
,
model_file
,
caffe
.
TEST
)
layer_names
=
net
.
_layer_names
param_dict
=
CaffeLayerProcessor
(
net
)
.
process
()
blob_names
=
net
.
blobs
.
keys
()
for
layername
,
layer
in
zip
(
layer_names
,
net
.
layers
):
try
:
prev_blob_name
=
blob_names
[
blob_names
.
index
(
layername
)
-
1
]
prev_data_shape
=
net
.
blobs
[
prev_blob_name
]
.
data
.
shape
[
1
:]
except
ValueError
:
prev_data_shape
=
None
logger
.
info
(
"Processing layer {} of type {}"
.
format
(
layername
,
layer
.
type
))
if
layer
.
type
in
param_processors
:
param_dict
.
update
(
param_processors
[
layer
.
type
](
layername
,
layer
.
blobs
,
prev_data_shape
))
else
:
if
len
(
layer
.
blobs
)
!=
0
:
logger
.
warn
(
"Layer type {} not supported!"
.
format
(
layer
.
type
))
logger
.
info
(
"Model loaded from caffe. Params: "
+
\
logger
.
info
(
"Model loaded from caffe. Params: "
+
\
" "
.
join
(
sorted
(
param_dict
.
keys
())))
" "
.
join
(
sorted
(
param_dict
.
keys
())))
return
param_dict
return
param_dict
...
...
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