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
ca096908
Commit
ca096908
authored
Jul 01, 2019
by
Yuxin Wu
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
update docs
parent
6c482180
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
31 additions
and
14 deletions
+31
-14
docs/tutorial/summary.md
docs/tutorial/summary.md
+13
-10
examples/basics/mnist-convnet.py
examples/basics/mnist-convnet.py
+18
-4
No files found.
docs/tutorial/summary.md
View file @
ca096908
...
@@ -8,10 +8,10 @@ The default logging behavior should be good enough for normal use cases, so you
...
@@ -8,10 +8,10 @@ The default logging behavior should be good enough for normal use cases, so you
This is how TensorFlow summaries eventually get logged/saved/printed:
This is how TensorFlow summaries eventually get logged/saved/printed:
1.
__What to Log__: Define what you want to log in the graph
.
1.
__What to Log__: Define what you want to log in the graph
, by just calling
`tf.summary.xxx`
.
When you call
`tf.summary.xxx`
in your graph code, TensorFlow adds an op to
When you call
`tf.summary.xxx`
in your graph code, TensorFlow adds an op to
`tf.GraphKeys.SUMMARIES`
collection (by default).
`tf.GraphKeys.SUMMARIES`
collection (by default).
Tensorpack
further removes summaries
not from the first training tower.
Tensorpack
will further remove summaries (in the default collection)
not from the first training tower.
2.
__When to Log__:
[
MergeAllSummaries
](
../modules/callbacks.html#tensorpack.callbacks.MergeAllSummaries
)
2.
__When to Log__:
[
MergeAllSummaries
](
../modules/callbacks.html#tensorpack.callbacks.MergeAllSummaries
)
callback is one of the
[
default callbacks
](
../modules/train.html#tensorpack.train.DEFAULT_CALLBACKS
)
.
callback is one of the
[
default callbacks
](
../modules/train.html#tensorpack.train.DEFAULT_CALLBACKS
)
.
It runs ops in the
`tf.GraphKeys.SUMMARIES`
collection (by default) every epoch (by default),
It runs ops in the
`tf.GraphKeys.SUMMARIES`
collection (by default) every epoch (by default),
...
@@ -25,28 +25,31 @@ This is how TensorFlow summaries eventually get logged/saved/printed:
...
@@ -25,28 +25,31 @@ This is how TensorFlow summaries eventually get logged/saved/printed:
*
A
[
JSONWriter
](
../modules/callbacks.html#tensorpack.callbacks.JSONWriter
)
*
A
[
JSONWriter
](
../modules/callbacks.html#tensorpack.callbacks.JSONWriter
)
saves scalars to a JSON file.
saves scalars to a JSON file.
All the "what, when, where" can be customized in either the graph or with the callbacks/monitors setting.
All the "what, when, where" can be customized in either the graph or with the callbacks/monitors setting:
You can call
`tf.summary.xxx(collections=[...])`
to add your custom summaries a different collection,
and use the
`MergeAllSummaries(key=...)`
callback to write them to monitors.
1.
You can call
`tf.summary.xxx(collections=[...])`
to add your custom summaries a different collection.
1.
You can use the
`MergeAllSummaries(key=...)`
callback to write a different collection of summaries to monitors.
1.
You can use
`PeriodicCallback`
or
`MergeAllSummaries(period=...)`
to make the callback execute less or more frequent.
1.
You can tell the trainer to use different monitors.
The design goal to disentangle "what, when, where" is to make components reusable.
The design goal to disentangle "what, when, where" is to make components reusable.
Suppose you have
`M`
items to log
Suppose you have
`M`
items to log
(possibly from differently places, not necessarily the graph)
(possibly from differently places, not necessarily the graph)
and
`N`
backends to log your data to, you
and
`N`
backends to log your data to, you
automatically obtain all the
`MxN`
combinations.
automatically obtain all the
`MxN`
combinations.
Despite of that, if you only care about logging one specific
item
(e.g. for
Despite of that, if you only care about logging one specific
tensor in the graph
(e.g. for
debugging purpose), you can check out the
debugging purpose), you can check out the
[
FAQ
](
http://tensorpack.readthedocs.io/tutorial/faq.html#how-to-print-dump-intermediate-results-in-training
)
[
FAQ
](
http://tensorpack.readthedocs.io/tutorial/faq.html#how-to-print-dump-intermediate-results-in-training
)
for easier options.
for easier options.
### Noisy TensorFlow Summaries
### Noisy TensorFlow Summaries
Since TF summaries are evaluated infrequently (every epoch) by default,
Since TF summaries are evaluated infrequently (every epoch) by default,
if the content is data-dependent (e.g., training loss),
if the content is data-dependent (e.g., training loss),
the infrequently-sampled values could have high variance.
the infrequently-sampled values could have high variance.
To address this issue, you can:
To address this issue, you can:
1.
Change "When to Log": log more frequently, but note that certain summaries can be expensive to
1.
Change "When to Log": log more frequently, but note that certain
large
summaries can be expensive to
log. You may want to use a separate collection for frequent logging.
log. You may want to use a separate collection for frequent logging.
2.
Change "What to Log": you can call
2.
Change "What to Log": you can call
[
tfutils.summary.add_moving_summary
](
../modules/tfutils.html#tensorpack.tfutils.summary.add_moving_summary
)
[
tfutils.summary.add_moving_summary
](
../modules/tfutils.html#tensorpack.tfutils.summary.add_moving_summary
)
...
...
examples/basics/mnist-convnet.py
View file @
ca096908
...
@@ -17,6 +17,7 @@ IMAGE_SIZE = 28
...
@@ -17,6 +17,7 @@ IMAGE_SIZE = 28
class
Model
(
ModelDesc
):
class
Model
(
ModelDesc
):
# See tutorial at https://tensorpack.readthedocs.io/tutorial/training-interface.html#with-modeldesc-and-trainconfig
def
inputs
(
self
):
def
inputs
(
self
):
"""
"""
Define all the inputs (with type, shape, name) that the graph will need.
Define all the inputs (with type, shape, name) that the graph will need.
...
@@ -25,8 +26,8 @@ class Model(ModelDesc):
...
@@ -25,8 +26,8 @@ class Model(ModelDesc):
tf
.
TensorSpec
((
None
,),
tf
.
int32
,
'label'
)]
tf
.
TensorSpec
((
None
,),
tf
.
int32
,
'label'
)]
def
build_graph
(
self
,
image
,
label
):
def
build_graph
(
self
,
image
,
label
):
"""This function should build the model which takes the input variables
"""This function should build the model which takes the input variables
(defined above)
and return cost at the end"""
and return cost at the end
.
"""
# In tensorflow, inputs to convolution function are assumed to be
# In tensorflow, inputs to convolution function are assumed to be
# NHWC. Add a single channel here.
# NHWC. Add a single channel here.
...
@@ -35,7 +36,10 @@ class Model(ModelDesc):
...
@@ -35,7 +36,10 @@ class Model(ModelDesc):
image
=
image
*
2
-
1
# center the pixels values at zero
image
=
image
*
2
-
1
# center the pixels values at zero
# The context manager `argscope` sets the default option for all the layers under
# The context manager `argscope` sets the default option for all the layers under
# this context. Here we use 32 channel convolution with shape 3x3
# this context. Here we use 32 channel convolution with shape 3x3
# See tutorial at https://tensorpack.readthedocs.io/tutorial/symbolic.html
with
argscope
(
Conv2D
,
kernel_size
=
3
,
activation
=
tf
.
nn
.
relu
,
filters
=
32
):
with
argscope
(
Conv2D
,
kernel_size
=
3
,
activation
=
tf
.
nn
.
relu
,
filters
=
32
):
# LinearWrap is just a syntax sugar.
# See tutorial at https://tensorpack.readthedocs.io/tutorial/symbolic.html
logits
=
(
LinearWrap
(
image
)
logits
=
(
LinearWrap
(
image
)
.
Conv2D
(
'conv0'
)
.
Conv2D
(
'conv0'
)
.
MaxPooling
(
'pool0'
,
2
)
.
MaxPooling
(
'pool0'
,
2
)
...
@@ -58,6 +62,8 @@ class Model(ModelDesc):
...
@@ -58,6 +62,8 @@ class Model(ModelDesc):
# 1. written to tensosrboard
# 1. written to tensosrboard
# 2. written to stat.json
# 2. written to stat.json
# 3. printed after each epoch
# 3. printed after each epoch
# You can also just call `tf.summary.scalar`. But moving summary has some other benefits.
# See tutorial at https://tensorpack.readthedocs.io/tutorial/summary.html
train_error
=
tf
.
reduce_mean
(
1
-
correct
,
name
=
'train_error'
)
train_error
=
tf
.
reduce_mean
(
1
-
correct
,
name
=
'train_error'
)
summary
.
add_moving_summary
(
train_error
,
accuracy
)
summary
.
add_moving_summary
(
train_error
,
accuracy
)
...
@@ -88,6 +94,8 @@ class Model(ModelDesc):
...
@@ -88,6 +94,8 @@ class Model(ModelDesc):
def
get_data
():
def
get_data
():
# We don't need any fancy data loading for this simple example.
# See dataflow tutorial at https://tensorpack.readthedocs.io/tutorial/dataflow.html
train
=
BatchData
(
dataset
.
Mnist
(
'train'
),
128
)
train
=
BatchData
(
dataset
.
Mnist
(
'train'
),
128
)
test
=
BatchData
(
dataset
.
Mnist
(
'test'
),
256
,
remainder
=
True
)
test
=
BatchData
(
dataset
.
Mnist
(
'test'
),
256
,
remainder
=
True
)
...
@@ -110,18 +118,24 @@ if __name__ == '__main__':
...
@@ -110,18 +118,24 @@ if __name__ == '__main__':
config
=
TrainConfig
(
config
=
TrainConfig
(
model
=
Model
(),
model
=
Model
(),
# The input source for training. FeedInput is slow, this is just for demo purpose.
# The input source for training. FeedInput is slow, this is just for demo purpose.
# In practice it's best to use QueueInput or others. See tutorials for details.
# In practice it's best to use QueueInput or others.
# See tutorial at https://tensorpack.readthedocs.io/tutorial/extend/input-source.html
data
=
FeedInput
(
dataset_train
),
data
=
FeedInput
(
dataset_train
),
# We use a few simple callbacks in this demo.
# See tutorial at https://tensorpack.readthedocs.io/tutorial/callback.html
callbacks
=
[
callbacks
=
[
ModelSaver
(),
# save the model after every epoch
ModelSaver
(),
# save the model after every epoch
InferenceRunner
(
# run inference(for validation) after every epoch
InferenceRunner
(
# run inference(for validation) after every epoch
dataset_test
,
# the DataFlow instance used for validation
dataset_test
,
# the DataFlow instance used for validation
ScalarStats
(
# produce `val_accuracy` and `val_cross_entropy_loss`
ScalarStats
(
# produce `val_accuracy` and `val_cross_entropy_loss`
[
'cross_entropy_loss'
,
'accuracy'
],
prefix
=
'val'
)),
[
'cross_entropy_loss'
,
'accuracy'
],
prefix
=
'val'
)),
# MaxSaver
has to come after InferenceRunner
# MaxSaver
needs to come after InferenceRunner to obtain its score
MaxSaver
(
'val_accuracy'
),
# save the model with highest accuracy
MaxSaver
(
'val_accuracy'
),
# save the model with highest accuracy
],
],
steps_per_epoch
=
steps_per_epoch
,
steps_per_epoch
=
steps_per_epoch
,
max_epoch
=
100
,
max_epoch
=
100
,
)
)
# Use a simple trainer in this demo.
# More trainers with multi-gpu or distributed functionalities are available.
# See tutorial at https://tensorpack.readthedocs.io/tutorial/trainer.html
launch_train_with_config
(
config
,
SimpleTrainer
())
launch_train_with_config
(
config
,
SimpleTrainer
())
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