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
ModelZoo
ResNet50_tensorflow
Commits
d160e2fd
Commit
d160e2fd
authored
Mar 12, 2020
by
Mark Daoust
Browse files
Delete deprecated tutorials directory.
parent
bf6d6f6f
Changes
49
Hide whitespace changes
Inline
Side-by-side
Showing
9 changed files
with
0 additions
and
1542 deletions
+0
-1542
tutorials/rnn/ptb/BUILD
tutorials/rnn/ptb/BUILD
+0
-69
tutorials/rnn/ptb/__init__.py
tutorials/rnn/ptb/__init__.py
+0
-22
tutorials/rnn/ptb/ptb_word_lm.py
tutorials/rnn/ptb/ptb_word_lm.py
+0
-529
tutorials/rnn/ptb/reader.py
tutorials/rnn/ptb/reader.py
+0
-127
tutorials/rnn/ptb/reader_test.py
tutorials/rnn/ptb/reader_test.py
+0
-68
tutorials/rnn/ptb/util.py
tutorials/rnn/ptb/util.py
+0
-96
tutorials/rnn/quickdraw/BUILD
tutorials/rnn/quickdraw/BUILD
+0
-42
tutorials/rnn/quickdraw/create_dataset.py
tutorials/rnn/quickdraw/create_dataset.py
+0
-211
tutorials/rnn/quickdraw/train_model.py
tutorials/rnn/quickdraw/train_model.py
+0
-378
No files found.
tutorials/rnn/ptb/BUILD
deleted
100644 → 0
View file @
bf6d6f6f
# Description:
# Python support for TensorFlow.
package
(
default_visibility
=
[
"//tensorflow:internal"
])
licenses
([
"notice"
])
# Apache 2.0
exports_files
([
"LICENSE"
])
py_library
(
name
=
"package"
,
srcs
=
[
"__init__.py"
,
],
srcs_version
=
"PY2AND3"
,
deps
=
[
":reader"
,
],
)
py_library
(
name
=
"reader"
,
srcs
=
[
"reader.py"
],
srcs_version
=
"PY2AND3"
,
deps
=
[
"//tensorflow:tensorflow_py"
],
)
py_test
(
name
=
"reader_test"
,
size
=
"small"
,
srcs
=
[
"reader_test.py"
],
srcs_version
=
"PY2AND3"
,
deps
=
[
":reader"
,
"//tensorflow:tensorflow_py"
,
],
)
py_library
(
name
=
"util"
,
srcs
=
[
"util.py"
],
srcs_version
=
"PY2AND3"
,
deps
=
[
"//tensorflow:tensorflow_py"
],
)
py_binary
(
name
=
"ptb_word_lm"
,
srcs
=
[
"ptb_word_lm.py"
,
],
srcs_version
=
"PY2AND3"
,
deps
=
[
":reader"
,
":util"
,
"//tensorflow:tensorflow_py"
,
],
)
filegroup
(
name
=
"all_files"
,
srcs
=
glob
(
[
"**/*"
],
exclude
=
[
"**/METADATA"
,
"**/OWNERS"
,
],
),
visibility
=
[
"//tensorflow:__subpackages__"
],
)
tutorials/rnn/ptb/__init__.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Makes helper libraries available in the ptb package."""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
reader
import
util
tutorials/rnn/ptb/ptb_word_lm.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Example / benchmark for building a PTB LSTM model.
Trains the model described in:
(Zaremba, et. al.) Recurrent Neural Network Regularization
http://arxiv.org/abs/1409.2329
There are 3 supported model configurations:
===========================================
| config | epochs | train | valid | test
===========================================
| small | 13 | 37.99 | 121.39 | 115.91
| medium | 39 | 48.45 | 86.16 | 82.07
| large | 55 | 37.87 | 82.62 | 78.29
The exact results may vary depending on the random initialization.
The hyperparameters used in the model:
- init_scale - the initial scale of the weights
- learning_rate - the initial value of the learning rate
- max_grad_norm - the maximum permissible norm of the gradient
- num_layers - the number of LSTM layers
- num_steps - the number of unrolled steps of LSTM
- hidden_size - the number of LSTM units
- max_epoch - the number of epochs trained with the initial learning rate
- max_max_epoch - the total number of epochs for training
- keep_prob - the probability of keeping weights in the dropout layer
- lr_decay - the decay of the learning rate for each epoch after "max_epoch"
- batch_size - the batch size
- rnn_mode - the low level implementation of lstm cell: one of CUDNN,
BASIC, or BLOCK, representing cudnn_lstm, basic_lstm, and
lstm_block_cell classes.
The data required for this example is in the data/ dir of the
PTB dataset from Tomas Mikolov's webpage:
$ wget http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz
$ tar xvf simple-examples.tgz
To run:
$ python ptb_word_lm.py --data_path=simple-examples/data/
"""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
time
import
numpy
as
np
import
tensorflow
as
tf
import
reader
import
util
from
tensorflow.python.client
import
device_lib
from
distutils.version
import
StrictVersion
flags
=
tf
.
flags
logging
=
tf
.
logging
flags
.
DEFINE_string
(
"model"
,
"small"
,
"A type of model. Possible options are: small, medium, large."
)
flags
.
DEFINE_string
(
"data_path"
,
None
,
"Where the training/test data is stored."
)
flags
.
DEFINE_string
(
"save_path"
,
None
,
"Model output directory."
)
flags
.
DEFINE_bool
(
"use_fp16"
,
False
,
"Train using 16-bit floats instead of 32bit floats"
)
flags
.
DEFINE_integer
(
"num_gpus"
,
1
,
"If larger than 1, Grappler AutoParallel optimizer "
"will create multiple training replicas with each GPU "
"running one replica."
)
flags
.
DEFINE_string
(
"rnn_mode"
,
None
,
"The low level implementation of lstm cell: one of CUDNN, "
"BASIC, and BLOCK, representing cudnn_lstm, basic_lstm, "
"and lstm_block_cell classes."
)
FLAGS
=
flags
.
FLAGS
BASIC
=
"basic"
CUDNN
=
"cudnn"
BLOCK
=
"block"
def
data_type
():
return
tf
.
float16
if
FLAGS
.
use_fp16
else
tf
.
float32
class
PTBInput
(
object
):
"""The input data."""
def
__init__
(
self
,
config
,
data
,
name
=
None
):
self
.
batch_size
=
batch_size
=
config
.
batch_size
self
.
num_steps
=
num_steps
=
config
.
num_steps
self
.
epoch_size
=
((
len
(
data
)
//
batch_size
)
-
1
)
//
num_steps
self
.
input_data
,
self
.
targets
=
reader
.
ptb_producer
(
data
,
batch_size
,
num_steps
,
name
=
name
)
class
PTBModel
(
object
):
"""The PTB model."""
def
__init__
(
self
,
is_training
,
config
,
input_
):
self
.
_is_training
=
is_training
self
.
_input
=
input_
self
.
_rnn_params
=
None
self
.
_cell
=
None
self
.
batch_size
=
input_
.
batch_size
self
.
num_steps
=
input_
.
num_steps
size
=
config
.
hidden_size
vocab_size
=
config
.
vocab_size
with
tf
.
device
(
"/cpu:0"
):
embedding
=
tf
.
get_variable
(
"embedding"
,
[
vocab_size
,
size
],
dtype
=
data_type
())
inputs
=
tf
.
nn
.
embedding_lookup
(
embedding
,
input_
.
input_data
)
if
is_training
and
config
.
keep_prob
<
1
:
inputs
=
tf
.
nn
.
dropout
(
inputs
,
config
.
keep_prob
)
output
,
state
=
self
.
_build_rnn_graph
(
inputs
,
config
,
is_training
)
softmax_w
=
tf
.
get_variable
(
"softmax_w"
,
[
size
,
vocab_size
],
dtype
=
data_type
())
softmax_b
=
tf
.
get_variable
(
"softmax_b"
,
[
vocab_size
],
dtype
=
data_type
())
logits
=
tf
.
nn
.
xw_plus_b
(
output
,
softmax_w
,
softmax_b
)
# Reshape logits to be a 3-D tensor for sequence loss
logits
=
tf
.
reshape
(
logits
,
[
self
.
batch_size
,
self
.
num_steps
,
vocab_size
])
# Use the contrib sequence loss and average over the batches
loss
=
tf
.
contrib
.
seq2seq
.
sequence_loss
(
logits
,
input_
.
targets
,
tf
.
ones
([
self
.
batch_size
,
self
.
num_steps
],
dtype
=
data_type
()),
average_across_timesteps
=
False
,
average_across_batch
=
True
)
# Update the cost
self
.
_cost
=
tf
.
reduce_sum
(
loss
)
self
.
_final_state
=
state
if
not
is_training
:
return
self
.
_lr
=
tf
.
Variable
(
0.0
,
trainable
=
False
)
tvars
=
tf
.
trainable_variables
()
grads
,
_
=
tf
.
clip_by_global_norm
(
tf
.
gradients
(
self
.
_cost
,
tvars
),
config
.
max_grad_norm
)
optimizer
=
tf
.
train
.
GradientDescentOptimizer
(
self
.
_lr
)
self
.
_train_op
=
optimizer
.
apply_gradients
(
zip
(
grads
,
tvars
),
global_step
=
tf
.
train
.
get_or_create_global_step
())
self
.
_new_lr
=
tf
.
placeholder
(
tf
.
float32
,
shape
=
[],
name
=
"new_learning_rate"
)
self
.
_lr_update
=
tf
.
assign
(
self
.
_lr
,
self
.
_new_lr
)
def
_build_rnn_graph
(
self
,
inputs
,
config
,
is_training
):
if
config
.
rnn_mode
==
CUDNN
:
return
self
.
_build_rnn_graph_cudnn
(
inputs
,
config
,
is_training
)
else
:
return
self
.
_build_rnn_graph_lstm
(
inputs
,
config
,
is_training
)
def
_build_rnn_graph_cudnn
(
self
,
inputs
,
config
,
is_training
):
"""Build the inference graph using CUDNN cell."""
inputs
=
tf
.
transpose
(
inputs
,
[
1
,
0
,
2
])
self
.
_cell
=
tf
.
contrib
.
cudnn_rnn
.
CudnnLSTM
(
num_layers
=
config
.
num_layers
,
num_units
=
config
.
hidden_size
,
input_size
=
config
.
hidden_size
,
dropout
=
1
-
config
.
keep_prob
if
is_training
else
0
)
params_size_t
=
self
.
_cell
.
params_size
()
self
.
_rnn_params
=
tf
.
get_variable
(
"lstm_params"
,
initializer
=
tf
.
random_uniform
(
[
params_size_t
],
-
config
.
init_scale
,
config
.
init_scale
),
validate_shape
=
False
)
c
=
tf
.
zeros
([
config
.
num_layers
,
self
.
batch_size
,
config
.
hidden_size
],
tf
.
float32
)
h
=
tf
.
zeros
([
config
.
num_layers
,
self
.
batch_size
,
config
.
hidden_size
],
tf
.
float32
)
self
.
_initial_state
=
(
tf
.
contrib
.
rnn
.
LSTMStateTuple
(
h
=
h
,
c
=
c
),)
outputs
,
h
,
c
=
self
.
_cell
(
inputs
,
h
,
c
,
self
.
_rnn_params
,
is_training
)
outputs
=
tf
.
transpose
(
outputs
,
[
1
,
0
,
2
])
outputs
=
tf
.
reshape
(
outputs
,
[
-
1
,
config
.
hidden_size
])
return
outputs
,
(
tf
.
contrib
.
rnn
.
LSTMStateTuple
(
h
=
h
,
c
=
c
),)
def
_get_lstm_cell
(
self
,
config
,
is_training
):
if
config
.
rnn_mode
==
BASIC
:
return
tf
.
contrib
.
rnn
.
BasicLSTMCell
(
config
.
hidden_size
,
forget_bias
=
0.0
,
state_is_tuple
=
True
,
reuse
=
not
is_training
)
if
config
.
rnn_mode
==
BLOCK
:
return
tf
.
contrib
.
rnn
.
LSTMBlockCell
(
config
.
hidden_size
,
forget_bias
=
0.0
)
raise
ValueError
(
"rnn_mode %s not supported"
%
config
.
rnn_mode
)
def
_build_rnn_graph_lstm
(
self
,
inputs
,
config
,
is_training
):
"""Build the inference graph using canonical LSTM cells."""
# Slightly better results can be obtained with forget gate biases
# initialized to 1 but the hyperparameters of the model would need to be
# different than reported in the paper.
def
make_cell
():
cell
=
self
.
_get_lstm_cell
(
config
,
is_training
)
if
is_training
and
config
.
keep_prob
<
1
:
cell
=
tf
.
contrib
.
rnn
.
DropoutWrapper
(
cell
,
output_keep_prob
=
config
.
keep_prob
)
return
cell
cell
=
tf
.
contrib
.
rnn
.
MultiRNNCell
(
[
make_cell
()
for
_
in
range
(
config
.
num_layers
)],
state_is_tuple
=
True
)
self
.
_initial_state
=
cell
.
zero_state
(
config
.
batch_size
,
data_type
())
state
=
self
.
_initial_state
# Simplified version of tf.nn.static_rnn().
# This builds an unrolled LSTM for tutorial purposes only.
# In general, use tf.nn.static_rnn() or tf.nn.static_state_saving_rnn().
#
# The alternative version of the code below is:
#
# inputs = tf.unstack(inputs, num=self.num_steps, axis=1)
# outputs, state = tf.nn.static_rnn(cell, inputs,
# initial_state=self._initial_state)
outputs
=
[]
with
tf
.
variable_scope
(
"RNN"
):
for
time_step
in
range
(
self
.
num_steps
):
if
time_step
>
0
:
tf
.
get_variable_scope
().
reuse_variables
()
(
cell_output
,
state
)
=
cell
(
inputs
[:,
time_step
,
:],
state
)
outputs
.
append
(
cell_output
)
output
=
tf
.
reshape
(
tf
.
concat
(
outputs
,
1
),
[
-
1
,
config
.
hidden_size
])
return
output
,
state
def
assign_lr
(
self
,
session
,
lr_value
):
session
.
run
(
self
.
_lr_update
,
feed_dict
=
{
self
.
_new_lr
:
lr_value
})
def
export_ops
(
self
,
name
):
"""Exports ops to collections."""
self
.
_name
=
name
ops
=
{
util
.
with_prefix
(
self
.
_name
,
"cost"
):
self
.
_cost
}
if
self
.
_is_training
:
ops
.
update
(
lr
=
self
.
_lr
,
new_lr
=
self
.
_new_lr
,
lr_update
=
self
.
_lr_update
)
if
self
.
_rnn_params
:
ops
.
update
(
rnn_params
=
self
.
_rnn_params
)
for
name
,
op
in
ops
.
items
():
tf
.
add_to_collection
(
name
,
op
)
self
.
_initial_state_name
=
util
.
with_prefix
(
self
.
_name
,
"initial"
)
self
.
_final_state_name
=
util
.
with_prefix
(
self
.
_name
,
"final"
)
util
.
export_state_tuples
(
self
.
_initial_state
,
self
.
_initial_state_name
)
util
.
export_state_tuples
(
self
.
_final_state
,
self
.
_final_state_name
)
def
import_ops
(
self
):
"""Imports ops from collections."""
if
self
.
_is_training
:
self
.
_train_op
=
tf
.
get_collection_ref
(
"train_op"
)[
0
]
self
.
_lr
=
tf
.
get_collection_ref
(
"lr"
)[
0
]
self
.
_new_lr
=
tf
.
get_collection_ref
(
"new_lr"
)[
0
]
self
.
_lr_update
=
tf
.
get_collection_ref
(
"lr_update"
)[
0
]
rnn_params
=
tf
.
get_collection_ref
(
"rnn_params"
)
if
self
.
_cell
and
rnn_params
:
params_saveable
=
tf
.
contrib
.
cudnn_rnn
.
RNNParamsSaveable
(
self
.
_cell
,
self
.
_cell
.
params_to_canonical
,
self
.
_cell
.
canonical_to_params
,
rnn_params
,
base_variable_scope
=
"Model/RNN"
)
tf
.
add_to_collection
(
tf
.
GraphKeys
.
SAVEABLE_OBJECTS
,
params_saveable
)
self
.
_cost
=
tf
.
get_collection_ref
(
util
.
with_prefix
(
self
.
_name
,
"cost"
))[
0
]
num_replicas
=
FLAGS
.
num_gpus
if
self
.
_name
==
"Train"
else
1
self
.
_initial_state
=
util
.
import_state_tuples
(
self
.
_initial_state
,
self
.
_initial_state_name
,
num_replicas
)
self
.
_final_state
=
util
.
import_state_tuples
(
self
.
_final_state
,
self
.
_final_state_name
,
num_replicas
)
@
property
def
input
(
self
):
return
self
.
_input
@
property
def
initial_state
(
self
):
return
self
.
_initial_state
@
property
def
cost
(
self
):
return
self
.
_cost
@
property
def
final_state
(
self
):
return
self
.
_final_state
@
property
def
lr
(
self
):
return
self
.
_lr
@
property
def
train_op
(
self
):
return
self
.
_train_op
@
property
def
initial_state_name
(
self
):
return
self
.
_initial_state_name
@
property
def
final_state_name
(
self
):
return
self
.
_final_state_name
class
SmallConfig
(
object
):
"""Small config."""
init_scale
=
0.1
learning_rate
=
1.0
max_grad_norm
=
5
num_layers
=
2
num_steps
=
20
hidden_size
=
200
max_epoch
=
4
max_max_epoch
=
13
keep_prob
=
1.0
lr_decay
=
0.5
batch_size
=
20
vocab_size
=
10000
rnn_mode
=
BLOCK
class
MediumConfig
(
object
):
"""Medium config."""
init_scale
=
0.05
learning_rate
=
1.0
max_grad_norm
=
5
num_layers
=
2
num_steps
=
35
hidden_size
=
650
max_epoch
=
6
max_max_epoch
=
39
keep_prob
=
0.5
lr_decay
=
0.8
batch_size
=
20
vocab_size
=
10000
rnn_mode
=
BLOCK
class
LargeConfig
(
object
):
"""Large config."""
init_scale
=
0.04
learning_rate
=
1.0
max_grad_norm
=
10
num_layers
=
2
num_steps
=
35
hidden_size
=
1500
max_epoch
=
14
max_max_epoch
=
55
keep_prob
=
0.35
lr_decay
=
1
/
1.15
batch_size
=
20
vocab_size
=
10000
rnn_mode
=
BLOCK
class
TestConfig
(
object
):
"""Tiny config, for testing."""
init_scale
=
0.1
learning_rate
=
1.0
max_grad_norm
=
1
num_layers
=
1
num_steps
=
2
hidden_size
=
2
max_epoch
=
1
max_max_epoch
=
1
keep_prob
=
1.0
lr_decay
=
0.5
batch_size
=
20
vocab_size
=
10000
rnn_mode
=
BLOCK
def
run_epoch
(
session
,
model
,
eval_op
=
None
,
verbose
=
False
):
"""Runs the model on the given data."""
start_time
=
time
.
time
()
costs
=
0.0
iters
=
0
state
=
session
.
run
(
model
.
initial_state
)
fetches
=
{
"cost"
:
model
.
cost
,
"final_state"
:
model
.
final_state
,
}
if
eval_op
is
not
None
:
fetches
[
"eval_op"
]
=
eval_op
for
step
in
range
(
model
.
input
.
epoch_size
):
feed_dict
=
{}
for
i
,
(
c
,
h
)
in
enumerate
(
model
.
initial_state
):
feed_dict
[
c
]
=
state
[
i
].
c
feed_dict
[
h
]
=
state
[
i
].
h
vals
=
session
.
run
(
fetches
,
feed_dict
)
cost
=
vals
[
"cost"
]
state
=
vals
[
"final_state"
]
costs
+=
cost
iters
+=
model
.
input
.
num_steps
if
verbose
and
step
%
(
model
.
input
.
epoch_size
//
10
)
==
10
:
print
(
"%.3f perplexity: %.3f speed: %.0f wps"
%
(
step
*
1.0
/
model
.
input
.
epoch_size
,
np
.
exp
(
costs
/
iters
),
iters
*
model
.
input
.
batch_size
*
max
(
1
,
FLAGS
.
num_gpus
)
/
(
time
.
time
()
-
start_time
)))
return
np
.
exp
(
costs
/
iters
)
def
get_config
():
"""Get model config."""
config
=
None
if
FLAGS
.
model
==
"small"
:
config
=
SmallConfig
()
elif
FLAGS
.
model
==
"medium"
:
config
=
MediumConfig
()
elif
FLAGS
.
model
==
"large"
:
config
=
LargeConfig
()
elif
FLAGS
.
model
==
"test"
:
config
=
TestConfig
()
else
:
raise
ValueError
(
"Invalid model: %s"
,
FLAGS
.
model
)
if
FLAGS
.
rnn_mode
:
config
.
rnn_mode
=
FLAGS
.
rnn_mode
if
FLAGS
.
num_gpus
!=
1
or
StrictVersion
(
tf
.
__version__
)
<
StrictVersion
(
"1.3.0"
)
:
config
.
rnn_mode
=
BASIC
return
config
def
main
(
_
):
if
not
FLAGS
.
data_path
:
raise
ValueError
(
"Must set --data_path to PTB data directory"
)
gpus
=
[
x
.
name
for
x
in
device_lib
.
list_local_devices
()
if
x
.
device_type
==
"GPU"
]
if
FLAGS
.
num_gpus
>
len
(
gpus
):
raise
ValueError
(
"Your machine has only %d gpus "
"which is less than the requested --num_gpus=%d."
%
(
len
(
gpus
),
FLAGS
.
num_gpus
))
raw_data
=
reader
.
ptb_raw_data
(
FLAGS
.
data_path
)
train_data
,
valid_data
,
test_data
,
_
=
raw_data
config
=
get_config
()
eval_config
=
get_config
()
eval_config
.
batch_size
=
1
eval_config
.
num_steps
=
1
with
tf
.
Graph
().
as_default
():
initializer
=
tf
.
random_uniform_initializer
(
-
config
.
init_scale
,
config
.
init_scale
)
with
tf
.
name_scope
(
"Train"
):
train_input
=
PTBInput
(
config
=
config
,
data
=
train_data
,
name
=
"TrainInput"
)
with
tf
.
variable_scope
(
"Model"
,
reuse
=
None
,
initializer
=
initializer
):
m
=
PTBModel
(
is_training
=
True
,
config
=
config
,
input_
=
train_input
)
tf
.
summary
.
scalar
(
"Training Loss"
,
m
.
cost
)
tf
.
summary
.
scalar
(
"Learning Rate"
,
m
.
lr
)
with
tf
.
name_scope
(
"Valid"
):
valid_input
=
PTBInput
(
config
=
config
,
data
=
valid_data
,
name
=
"ValidInput"
)
with
tf
.
variable_scope
(
"Model"
,
reuse
=
True
,
initializer
=
initializer
):
mvalid
=
PTBModel
(
is_training
=
False
,
config
=
config
,
input_
=
valid_input
)
tf
.
summary
.
scalar
(
"Validation Loss"
,
mvalid
.
cost
)
with
tf
.
name_scope
(
"Test"
):
test_input
=
PTBInput
(
config
=
eval_config
,
data
=
test_data
,
name
=
"TestInput"
)
with
tf
.
variable_scope
(
"Model"
,
reuse
=
True
,
initializer
=
initializer
):
mtest
=
PTBModel
(
is_training
=
False
,
config
=
eval_config
,
input_
=
test_input
)
models
=
{
"Train"
:
m
,
"Valid"
:
mvalid
,
"Test"
:
mtest
}
for
name
,
model
in
models
.
items
():
model
.
export_ops
(
name
)
metagraph
=
tf
.
train
.
export_meta_graph
()
if
StrictVersion
(
tf
.
__version__
)
<
StrictVersion
(
"1.1.0"
)
and
FLAGS
.
num_gpus
>
1
:
raise
ValueError
(
"num_gpus > 1 is not supported for TensorFlow versions "
"below 1.1.0"
)
soft_placement
=
False
if
FLAGS
.
num_gpus
>
1
:
soft_placement
=
True
util
.
auto_parallel
(
metagraph
,
m
)
with
tf
.
Graph
().
as_default
():
tf
.
train
.
import_meta_graph
(
metagraph
)
for
model
in
models
.
values
():
model
.
import_ops
()
sv
=
tf
.
train
.
Supervisor
(
logdir
=
FLAGS
.
save_path
)
config_proto
=
tf
.
ConfigProto
(
allow_soft_placement
=
soft_placement
)
with
sv
.
managed_session
(
config
=
config_proto
)
as
session
:
for
i
in
range
(
config
.
max_max_epoch
):
lr_decay
=
config
.
lr_decay
**
max
(
i
+
1
-
config
.
max_epoch
,
0.0
)
m
.
assign_lr
(
session
,
config
.
learning_rate
*
lr_decay
)
print
(
"Epoch: %d Learning rate: %.3f"
%
(
i
+
1
,
session
.
run
(
m
.
lr
)))
train_perplexity
=
run_epoch
(
session
,
m
,
eval_op
=
m
.
train_op
,
verbose
=
True
)
print
(
"Epoch: %d Train Perplexity: %.3f"
%
(
i
+
1
,
train_perplexity
))
valid_perplexity
=
run_epoch
(
session
,
mvalid
)
print
(
"Epoch: %d Valid Perplexity: %.3f"
%
(
i
+
1
,
valid_perplexity
))
test_perplexity
=
run_epoch
(
session
,
mtest
)
print
(
"Test Perplexity: %.3f"
%
test_perplexity
)
if
FLAGS
.
save_path
:
print
(
"Saving model to %s."
%
FLAGS
.
save_path
)
sv
.
saver
.
save
(
session
,
FLAGS
.
save_path
,
global_step
=
sv
.
global_step
)
if
__name__
==
"__main__"
:
tf
.
app
.
run
()
tutorials/rnn/ptb/reader.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Utilities for parsing PTB text files."""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
collections
import
os
import
sys
import
tensorflow
as
tf
Py3
=
sys
.
version_info
[
0
]
==
3
def
_read_words
(
filename
):
with
tf
.
gfile
.
GFile
(
filename
,
"r"
)
as
f
:
if
Py3
:
return
f
.
read
().
replace
(
"
\n
"
,
"<eos>"
).
split
()
else
:
return
f
.
read
().
decode
(
"utf-8"
).
replace
(
"
\n
"
,
"<eos>"
).
split
()
def
_build_vocab
(
filename
):
data
=
_read_words
(
filename
)
counter
=
collections
.
Counter
(
data
)
count_pairs
=
sorted
(
counter
.
items
(),
key
=
lambda
x
:
(
-
x
[
1
],
x
[
0
]))
words
,
_
=
list
(
zip
(
*
count_pairs
))
word_to_id
=
dict
(
zip
(
words
,
range
(
len
(
words
))))
return
word_to_id
def
_file_to_word_ids
(
filename
,
word_to_id
):
data
=
_read_words
(
filename
)
return
[
word_to_id
[
word
]
for
word
in
data
if
word
in
word_to_id
]
def
ptb_raw_data
(
data_path
=
None
):
"""Load PTB raw data from data directory "data_path".
Reads PTB text files, converts strings to integer ids,
and performs mini-batching of the inputs.
The PTB dataset comes from Tomas Mikolov's webpage:
http://www.fit.vutbr.cz/~imikolov/rnnlm/simple-examples.tgz
Args:
data_path: string path to the directory where simple-examples.tgz has
been extracted.
Returns:
tuple (train_data, valid_data, test_data, vocabulary)
where each of the data objects can be passed to PTBIterator.
"""
train_path
=
os
.
path
.
join
(
data_path
,
"ptb.train.txt"
)
valid_path
=
os
.
path
.
join
(
data_path
,
"ptb.valid.txt"
)
test_path
=
os
.
path
.
join
(
data_path
,
"ptb.test.txt"
)
word_to_id
=
_build_vocab
(
train_path
)
train_data
=
_file_to_word_ids
(
train_path
,
word_to_id
)
valid_data
=
_file_to_word_ids
(
valid_path
,
word_to_id
)
test_data
=
_file_to_word_ids
(
test_path
,
word_to_id
)
vocabulary
=
len
(
word_to_id
)
return
train_data
,
valid_data
,
test_data
,
vocabulary
def
ptb_producer
(
raw_data
,
batch_size
,
num_steps
,
name
=
None
):
"""Iterate on the raw PTB data.
This chunks up raw_data into batches of examples and returns Tensors that
are drawn from these batches.
Args:
raw_data: one of the raw data outputs from ptb_raw_data.
batch_size: int, the batch size.
num_steps: int, the number of unrolls.
name: the name of this operation (optional).
Returns:
A pair of Tensors, each shaped [batch_size, num_steps]. The second element
of the tuple is the same data time-shifted to the right by one.
Raises:
tf.errors.InvalidArgumentError: if batch_size or num_steps are too high.
"""
with
tf
.
name_scope
(
name
,
"PTBProducer"
,
[
raw_data
,
batch_size
,
num_steps
]):
raw_data
=
tf
.
convert_to_tensor
(
raw_data
,
name
=
"raw_data"
,
dtype
=
tf
.
int32
)
data_len
=
tf
.
size
(
raw_data
)
batch_len
=
data_len
//
batch_size
data
=
tf
.
reshape
(
raw_data
[
0
:
batch_size
*
batch_len
],
[
batch_size
,
batch_len
])
epoch_size
=
(
batch_len
-
1
)
//
num_steps
assertion
=
tf
.
assert_positive
(
epoch_size
,
message
=
"epoch_size == 0, decrease batch_size or num_steps"
)
with
tf
.
control_dependencies
([
assertion
]):
epoch_size
=
tf
.
identity
(
epoch_size
,
name
=
"epoch_size"
)
i
=
tf
.
train
.
range_input_producer
(
epoch_size
,
shuffle
=
False
).
dequeue
()
x
=
tf
.
strided_slice
(
data
,
[
0
,
i
*
num_steps
],
[
batch_size
,
(
i
+
1
)
*
num_steps
])
x
.
set_shape
([
batch_size
,
num_steps
])
y
=
tf
.
strided_slice
(
data
,
[
0
,
i
*
num_steps
+
1
],
[
batch_size
,
(
i
+
1
)
*
num_steps
+
1
])
y
.
set_shape
([
batch_size
,
num_steps
])
return
x
,
y
tutorials/rnn/ptb/reader_test.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2015 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Tests for models.tutorials.rnn.ptb.reader."""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
os.path
import
tensorflow
as
tf
import
reader
class
PtbReaderTest
(
tf
.
test
.
TestCase
):
def
setUp
(
self
):
self
.
_string_data
=
"
\n
"
.
join
(
[
" hello there i am"
,
" rain as day"
,
" want some cheesy puffs ?"
])
def
testPtbRawData
(
self
):
tmpdir
=
tf
.
test
.
get_temp_dir
()
for
suffix
in
"train"
,
"valid"
,
"test"
:
filename
=
os
.
path
.
join
(
tmpdir
,
"ptb.%s.txt"
%
suffix
)
with
tf
.
gfile
.
GFile
(
filename
,
"w"
)
as
fh
:
fh
.
write
(
self
.
_string_data
)
# Smoke test
output
=
reader
.
ptb_raw_data
(
tmpdir
)
self
.
assertEqual
(
len
(
output
),
4
)
def
testPtbProducer
(
self
):
raw_data
=
[
4
,
3
,
2
,
1
,
0
,
5
,
6
,
1
,
1
,
1
,
1
,
0
,
3
,
4
,
1
]
batch_size
=
3
num_steps
=
2
x
,
y
=
reader
.
ptb_producer
(
raw_data
,
batch_size
,
num_steps
)
with
self
.
test_session
()
as
session
:
coord
=
tf
.
train
.
Coordinator
()
tf
.
train
.
start_queue_runners
(
session
,
coord
=
coord
)
try
:
xval
,
yval
=
session
.
run
([
x
,
y
])
self
.
assertAllEqual
(
xval
,
[[
4
,
3
],
[
5
,
6
],
[
1
,
0
]])
self
.
assertAllEqual
(
yval
,
[[
3
,
2
],
[
6
,
1
],
[
0
,
3
]])
xval
,
yval
=
session
.
run
([
x
,
y
])
self
.
assertAllEqual
(
xval
,
[[
2
,
1
],
[
1
,
1
],
[
3
,
4
]])
self
.
assertAllEqual
(
yval
,
[[
1
,
0
],
[
1
,
1
],
[
4
,
1
]])
finally
:
coord
.
request_stop
()
coord
.
join
()
if
__name__
==
"__main__"
:
tf
.
test
.
main
()
tutorials/rnn/ptb/util.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
"""Utilities for Grappler autoparallel optimizer."""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
tensorflow
as
tf
from
tensorflow.core.framework
import
variable_pb2
from
tensorflow.core.protobuf
import
rewriter_config_pb2
FLAGS
=
tf
.
flags
.
FLAGS
def
export_state_tuples
(
state_tuples
,
name
):
for
state_tuple
in
state_tuples
:
tf
.
add_to_collection
(
name
,
state_tuple
.
c
)
tf
.
add_to_collection
(
name
,
state_tuple
.
h
)
def
import_state_tuples
(
state_tuples
,
name
,
num_replicas
):
restored
=
[]
for
i
in
range
(
len
(
state_tuples
)
*
num_replicas
):
c
=
tf
.
get_collection_ref
(
name
)[
2
*
i
+
0
]
h
=
tf
.
get_collection_ref
(
name
)[
2
*
i
+
1
]
restored
.
append
(
tf
.
contrib
.
rnn
.
LSTMStateTuple
(
c
,
h
))
return
tuple
(
restored
)
def
with_prefix
(
prefix
,
name
):
"""Adds prefix to name."""
return
"/"
.
join
((
prefix
,
name
))
def
with_autoparallel_prefix
(
replica_id
,
name
):
return
with_prefix
(
"AutoParallel-Replica-%d"
%
replica_id
,
name
)
class
UpdateCollection
(
object
):
"""Update collection info in MetaGraphDef for AutoParallel optimizer."""
def
__init__
(
self
,
metagraph
,
model
):
self
.
_metagraph
=
metagraph
self
.
replicate_states
(
model
.
initial_state_name
)
self
.
replicate_states
(
model
.
final_state_name
)
self
.
update_snapshot_name
(
"variables"
)
self
.
update_snapshot_name
(
"trainable_variables"
)
def
update_snapshot_name
(
self
,
var_coll_name
):
var_list
=
self
.
_metagraph
.
collection_def
[
var_coll_name
]
for
i
,
value
in
enumerate
(
var_list
.
bytes_list
.
value
):
var_def
=
variable_pb2
.
VariableDef
()
var_def
.
ParseFromString
(
value
)
# Somehow node Model/global_step/read doesn't have any fanout and seems to
# be only used for snapshot; this is different from all other variables.
if
var_def
.
snapshot_name
!=
"Model/global_step/read:0"
:
var_def
.
snapshot_name
=
with_autoparallel_prefix
(
0
,
var_def
.
snapshot_name
)
value
=
var_def
.
SerializeToString
()
var_list
.
bytes_list
.
value
[
i
]
=
value
def
replicate_states
(
self
,
state_coll_name
):
state_list
=
self
.
_metagraph
.
collection_def
[
state_coll_name
]
num_states
=
len
(
state_list
.
node_list
.
value
)
for
replica_id
in
range
(
1
,
FLAGS
.
num_gpus
):
for
i
in
range
(
num_states
):
state_list
.
node_list
.
value
.
append
(
state_list
.
node_list
.
value
[
i
])
for
replica_id
in
range
(
FLAGS
.
num_gpus
):
for
i
in
range
(
num_states
):
index
=
replica_id
*
num_states
+
i
state_list
.
node_list
.
value
[
index
]
=
with_autoparallel_prefix
(
replica_id
,
state_list
.
node_list
.
value
[
index
])
def
auto_parallel
(
metagraph
,
model
):
from
tensorflow.python.grappler
import
tf_optimizer
rewriter_config
=
rewriter_config_pb2
.
RewriterConfig
()
rewriter_config
.
optimizers
.
append
(
"autoparallel"
)
rewriter_config
.
auto_parallel
.
enable
=
True
rewriter_config
.
auto_parallel
.
num_replicas
=
FLAGS
.
num_gpus
optimized_graph
=
tf_optimizer
.
OptimizeGraph
(
rewriter_config
,
metagraph
)
metagraph
.
graph_def
.
CopyFrom
(
optimized_graph
)
UpdateCollection
(
metagraph
,
model
)
tutorials/rnn/quickdraw/BUILD
deleted
100644 → 0
View file @
bf6d6f6f
# Description:
# Example classification model on Quick, Draw! dataset.
package
(
default_visibility
=
[
"//visibility:public"
])
licenses
([
"notice"
])
# Apache 2.0
exports_files
([
"LICENSE"
])
py_binary
(
name
=
"train_model"
,
srcs
=
[
"train_model.py"
,
],
srcs_version
=
"PY2AND3"
,
deps
=
[
"//third_party/py/tensorflow"
,
],
)
py_binary
(
name
=
"create_dataset"
,
srcs
=
[
"create_dataset.py"
,
],
deps
=
[
"//third_party/py/numpy"
,
"//third_party/py/tensorflow"
,
],
)
filegroup
(
name
=
"all_files"
,
srcs
=
glob
(
[
"**/*"
],
exclude
=
[
"**/METADATA"
,
"**/OWNERS"
,
],
),
visibility
=
[
"//third_party/tensorflow:__subpackages__"
],
)
tutorials/rnn/quickdraw/create_dataset.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
r
"""Creates training and eval data from Quickdraw NDJSON files.
This tool reads the NDJSON files from https://quickdraw.withgoogle.com/data
and converts them into tensorflow.Example stored in TFRecord files.
The tensorflow example will contain 3 features:
shape - contains the shape of the sequence [length, dim] where dim=3.
class_index - the class index of the class for the example.
ink - a length * dim vector of the ink.
It creates disjoint training and evaluation sets.
python create_dataset.py \
--ndjson_path ${HOME}/ndjson \
--output_path ${HOME}/tfrecord
"""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
argparse
import
json
import
os
import
random
import
sys
import
numpy
as
np
import
tensorflow
as
tf
def
parse_line
(
ndjson_line
):
"""Parse an ndjson line and return ink (as np array) and classname."""
sample
=
json
.
loads
(
ndjson_line
)
class_name
=
sample
[
"word"
]
if
not
class_name
:
print
(
"Empty classname"
)
return
None
,
None
inkarray
=
sample
[
"drawing"
]
stroke_lengths
=
[
len
(
stroke
[
0
])
for
stroke
in
inkarray
]
total_points
=
sum
(
stroke_lengths
)
np_ink
=
np
.
zeros
((
total_points
,
3
),
dtype
=
np
.
float32
)
current_t
=
0
if
not
inkarray
:
print
(
"Empty inkarray"
)
return
None
,
None
for
stroke
in
inkarray
:
if
len
(
stroke
[
0
])
!=
len
(
stroke
[
1
]):
print
(
"Inconsistent number of x and y coordinates."
)
return
None
,
None
for
i
in
[
0
,
1
]:
np_ink
[
current_t
:(
current_t
+
len
(
stroke
[
0
])),
i
]
=
stroke
[
i
]
current_t
+=
len
(
stroke
[
0
])
np_ink
[
current_t
-
1
,
2
]
=
1
# stroke_end
# Preprocessing.
# 1. Size normalization.
lower
=
np
.
min
(
np_ink
[:,
0
:
2
],
axis
=
0
)
upper
=
np
.
max
(
np_ink
[:,
0
:
2
],
axis
=
0
)
scale
=
upper
-
lower
scale
[
scale
==
0
]
=
1
np_ink
[:,
0
:
2
]
=
(
np_ink
[:,
0
:
2
]
-
lower
)
/
scale
# 2. Compute deltas.
np_ink
[
1
:,
0
:
2
]
-=
np_ink
[
0
:
-
1
,
0
:
2
]
np_ink
=
np_ink
[
1
:,
:]
return
np_ink
,
class_name
def
convert_data
(
trainingdata_dir
,
observations_per_class
,
output_file
,
classnames
,
output_shards
=
10
,
offset
=
0
):
"""Convert training data from ndjson files into tf.Example in tf.Record.
Args:
trainingdata_dir: path to the directory containin the training data.
The training data is stored in that directory as ndjson files.
observations_per_class: the number of items to load per class.
output_file: path where to write the output.
classnames: array with classnames - is auto created if not passed in.
output_shards: the number of shards to write the output in.
offset: the number of items to skip at the beginning of each file.
Returns:
classnames: the class names as strings. classnames[classes[i]] is the
textual representation of the class of the i-th data point.
"""
def
_pick_output_shard
():
return
random
.
randint
(
0
,
output_shards
-
1
)
file_handles
=
[]
# Open all input files.
for
filename
in
sorted
(
tf
.
gfile
.
ListDirectory
(
trainingdata_dir
)):
if
not
filename
.
endswith
(
".ndjson"
):
print
(
"Skipping"
,
filename
)
continue
file_handles
.
append
(
tf
.
gfile
.
GFile
(
os
.
path
.
join
(
trainingdata_dir
,
filename
),
"r"
))
if
offset
:
# Fast forward all files to skip the offset.
count
=
0
for
_
in
file_handles
[
-
1
]:
count
+=
1
if
count
==
offset
:
break
writers
=
[]
for
i
in
range
(
FLAGS
.
output_shards
):
writers
.
append
(
tf
.
python_io
.
TFRecordWriter
(
"%s-%05i-of-%05i"
%
(
output_file
,
i
,
output_shards
)))
reading_order
=
list
(
range
(
len
(
file_handles
)))
*
observations_per_class
random
.
shuffle
(
reading_order
)
for
c
in
reading_order
:
line
=
file_handles
[
c
].
readline
()
ink
=
None
while
ink
is
None
:
ink
,
class_name
=
parse_line
(
line
)
if
ink
is
None
:
print
(
"Couldn't parse ink from '"
+
line
+
"'."
)
if
class_name
not
in
classnames
:
classnames
.
append
(
class_name
)
features
=
{}
features
[
"class_index"
]
=
tf
.
train
.
Feature
(
int64_list
=
tf
.
train
.
Int64List
(
value
=
[
classnames
.
index
(
class_name
)]))
features
[
"ink"
]
=
tf
.
train
.
Feature
(
float_list
=
tf
.
train
.
FloatList
(
value
=
ink
.
flatten
()))
features
[
"shape"
]
=
tf
.
train
.
Feature
(
int64_list
=
tf
.
train
.
Int64List
(
value
=
ink
.
shape
))
f
=
tf
.
train
.
Features
(
feature
=
features
)
example
=
tf
.
train
.
Example
(
features
=
f
)
writers
[
_pick_output_shard
()].
write
(
example
.
SerializeToString
())
# Close all files
for
w
in
writers
:
w
.
close
()
for
f
in
file_handles
:
f
.
close
()
# Write the class list.
with
tf
.
gfile
.
GFile
(
output_file
+
".classes"
,
"w"
)
as
f
:
for
class_name
in
classnames
:
f
.
write
(
class_name
+
"
\n
"
)
return
classnames
def
main
(
argv
):
del
argv
classnames
=
convert_data
(
FLAGS
.
ndjson_path
,
FLAGS
.
train_observations_per_class
,
os
.
path
.
join
(
FLAGS
.
output_path
,
"training.tfrecord"
),
classnames
=
[],
output_shards
=
FLAGS
.
output_shards
,
offset
=
0
)
convert_data
(
FLAGS
.
ndjson_path
,
FLAGS
.
eval_observations_per_class
,
os
.
path
.
join
(
FLAGS
.
output_path
,
"eval.tfrecord"
),
classnames
=
classnames
,
output_shards
=
FLAGS
.
output_shards
,
offset
=
FLAGS
.
train_observations_per_class
)
if
__name__
==
"__main__"
:
parser
=
argparse
.
ArgumentParser
()
parser
.
register
(
"type"
,
"bool"
,
lambda
v
:
v
.
lower
()
==
"true"
)
parser
.
add_argument
(
"--ndjson_path"
,
type
=
str
,
default
=
""
,
help
=
"Directory where the ndjson files are stored."
)
parser
.
add_argument
(
"--output_path"
,
type
=
str
,
default
=
""
,
help
=
"Directory where to store the output TFRecord files."
)
parser
.
add_argument
(
"--train_observations_per_class"
,
type
=
int
,
default
=
10000
,
help
=
"How many items per class to load for training."
)
parser
.
add_argument
(
"--eval_observations_per_class"
,
type
=
int
,
default
=
1000
,
help
=
"How many items per class to load for evaluation."
)
parser
.
add_argument
(
"--output_shards"
,
type
=
int
,
default
=
10
,
help
=
"Number of shards for the output."
)
FLAGS
,
unparsed
=
parser
.
parse_known_args
()
tf
.
app
.
run
(
main
=
main
,
argv
=
[
sys
.
argv
[
0
]]
+
unparsed
)
tutorials/rnn/quickdraw/train_model.py
deleted
100644 → 0
View file @
bf6d6f6f
# Copyright 2017 The TensorFlow Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ==============================================================================
r
"""Binary for training a RNN-based classifier for the Quick, Draw! data.
python train_model.py \
--training_data train_data \
--eval_data eval_data \
--model_dir /tmp/quickdraw_model/ \
--cell_type cudnn_lstm
When running on GPUs using --cell_type cudnn_lstm is much faster.
The expected performance is ~75% in 1.5M steps with the default configuration.
"""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
argparse
import
ast
import
functools
import
sys
import
tensorflow
as
tf
def
get_num_classes
():
classes
=
[]
with
tf
.
gfile
.
GFile
(
FLAGS
.
classes_file
,
"r"
)
as
f
:
classes
=
[
x
for
x
in
f
]
num_classes
=
len
(
classes
)
return
num_classes
def
get_input_fn
(
mode
,
tfrecord_pattern
,
batch_size
):
"""Creates an input_fn that stores all the data in memory.
Args:
mode: one of tf.contrib.learn.ModeKeys.{TRAIN, INFER, EVAL}
tfrecord_pattern: path to a TF record file created using create_dataset.py.
batch_size: the batch size to output.
Returns:
A valid input_fn for the model estimator.
"""
def
_parse_tfexample_fn
(
example_proto
,
mode
):
"""Parse a single record which is expected to be a tensorflow.Example."""
feature_to_type
=
{
"ink"
:
tf
.
VarLenFeature
(
dtype
=
tf
.
float32
),
"shape"
:
tf
.
FixedLenFeature
([
2
],
dtype
=
tf
.
int64
)
}
if
mode
!=
tf
.
estimator
.
ModeKeys
.
PREDICT
:
# The labels won't be available at inference time, so don't add them
# to the list of feature_columns to be read.
feature_to_type
[
"class_index"
]
=
tf
.
FixedLenFeature
([
1
],
dtype
=
tf
.
int64
)
parsed_features
=
tf
.
parse_single_example
(
example_proto
,
feature_to_type
)
labels
=
None
if
mode
!=
tf
.
estimator
.
ModeKeys
.
PREDICT
:
labels
=
parsed_features
[
"class_index"
]
parsed_features
[
"ink"
]
=
tf
.
sparse_tensor_to_dense
(
parsed_features
[
"ink"
])
return
parsed_features
,
labels
def
_input_fn
():
"""Estimator `input_fn`.
Returns:
A tuple of:
- Dictionary of string feature name to `Tensor`.
- `Tensor` of target labels.
"""
dataset
=
tf
.
data
.
TFRecordDataset
.
list_files
(
tfrecord_pattern
)
if
mode
==
tf
.
estimator
.
ModeKeys
.
TRAIN
:
dataset
=
dataset
.
shuffle
(
buffer_size
=
10
)
dataset
=
dataset
.
repeat
()
# Preprocesses 10 files concurrently and interleaves records from each file.
dataset
=
dataset
.
interleave
(
tf
.
data
.
TFRecordDataset
,
cycle_length
=
10
,
block_length
=
1
)
dataset
=
dataset
.
map
(
functools
.
partial
(
_parse_tfexample_fn
,
mode
=
mode
),
num_parallel_calls
=
10
)
dataset
=
dataset
.
prefetch
(
10000
)
if
mode
==
tf
.
estimator
.
ModeKeys
.
TRAIN
:
dataset
=
dataset
.
shuffle
(
buffer_size
=
1000000
)
# Our inputs are variable length, so pad them.
dataset
=
dataset
.
padded_batch
(
batch_size
,
padded_shapes
=
dataset
.
output_shapes
)
features
,
labels
=
dataset
.
make_one_shot_iterator
().
get_next
()
return
features
,
labels
return
_input_fn
def
model_fn
(
features
,
labels
,
mode
,
params
):
"""Model function for RNN classifier.
This function sets up a neural network which applies convolutional layers (as
configured with params.num_conv and params.conv_len) to the input.
The output of the convolutional layers is given to LSTM layers (as configured
with params.num_layers and params.num_nodes).
The final state of the all LSTM layers are concatenated and fed to a fully
connected layer to obtain the final classification scores.
Args:
features: dictionary with keys: inks, lengths.
labels: one hot encoded classes
mode: one of tf.estimator.ModeKeys.{TRAIN, INFER, EVAL}
params: a parameter dictionary with the following keys: num_layers,
num_nodes, batch_size, num_conv, conv_len, num_classes, learning_rate.
Returns:
ModelFnOps for Estimator API.
"""
def
_get_input_tensors
(
features
,
labels
):
"""Converts the input dict into inks, lengths, and labels tensors."""
# features[ink] is a sparse tensor that is [8, batch_maxlen, 3]
# inks will be a dense tensor of [8, maxlen, 3]
# shapes is [batchsize, 2]
shapes
=
features
[
"shape"
]
# lengths will be [batch_size]
lengths
=
tf
.
squeeze
(
tf
.
slice
(
shapes
,
begin
=
[
0
,
0
],
size
=
[
params
.
batch_size
,
1
]))
inks
=
tf
.
reshape
(
features
[
"ink"
],
[
params
.
batch_size
,
-
1
,
3
])
if
labels
is
not
None
:
labels
=
tf
.
squeeze
(
labels
)
return
inks
,
lengths
,
labels
def
_add_conv_layers
(
inks
,
lengths
):
"""Adds convolution layers."""
convolved
=
inks
for
i
in
range
(
len
(
params
.
num_conv
)):
convolved_input
=
convolved
if
params
.
batch_norm
:
convolved_input
=
tf
.
layers
.
batch_normalization
(
convolved_input
,
training
=
(
mode
==
tf
.
estimator
.
ModeKeys
.
TRAIN
))
# Add dropout layer if enabled and not first convolution layer.
if
i
>
0
and
params
.
dropout
:
convolved_input
=
tf
.
layers
.
dropout
(
convolved_input
,
rate
=
params
.
dropout
,
training
=
(
mode
==
tf
.
estimator
.
ModeKeys
.
TRAIN
))
convolved
=
tf
.
layers
.
conv1d
(
convolved_input
,
filters
=
params
.
num_conv
[
i
],
kernel_size
=
params
.
conv_len
[
i
],
activation
=
None
,
strides
=
1
,
padding
=
"same"
,
name
=
"conv1d_%d"
%
i
)
return
convolved
,
lengths
def
_add_regular_rnn_layers
(
convolved
,
lengths
):
"""Adds RNN layers."""
if
params
.
cell_type
==
"lstm"
:
cell
=
tf
.
nn
.
rnn_cell
.
BasicLSTMCell
elif
params
.
cell_type
==
"block_lstm"
:
cell
=
tf
.
contrib
.
rnn
.
LSTMBlockCell
cells_fw
=
[
cell
(
params
.
num_nodes
)
for
_
in
range
(
params
.
num_layers
)]
cells_bw
=
[
cell
(
params
.
num_nodes
)
for
_
in
range
(
params
.
num_layers
)]
if
params
.
dropout
>
0.0
:
cells_fw
=
[
tf
.
contrib
.
rnn
.
DropoutWrapper
(
cell
)
for
cell
in
cells_fw
]
cells_bw
=
[
tf
.
contrib
.
rnn
.
DropoutWrapper
(
cell
)
for
cell
in
cells_bw
]
outputs
,
_
,
_
=
tf
.
contrib
.
rnn
.
stack_bidirectional_dynamic_rnn
(
cells_fw
=
cells_fw
,
cells_bw
=
cells_bw
,
inputs
=
convolved
,
sequence_length
=
lengths
,
dtype
=
tf
.
float32
,
scope
=
"rnn_classification"
)
return
outputs
def
_add_cudnn_rnn_layers
(
convolved
):
"""Adds CUDNN LSTM layers."""
# Convolutions output [B, L, Ch], while CudnnLSTM is time-major.
convolved
=
tf
.
transpose
(
convolved
,
[
1
,
0
,
2
])
lstm
=
tf
.
contrib
.
cudnn_rnn
.
CudnnLSTM
(
num_layers
=
params
.
num_layers
,
num_units
=
params
.
num_nodes
,
dropout
=
params
.
dropout
if
mode
==
tf
.
estimator
.
ModeKeys
.
TRAIN
else
0.0
,
direction
=
"bidirectional"
)
outputs
,
_
=
lstm
(
convolved
)
# Convert back from time-major outputs to batch-major outputs.
outputs
=
tf
.
transpose
(
outputs
,
[
1
,
0
,
2
])
return
outputs
def
_add_rnn_layers
(
convolved
,
lengths
):
"""Adds recurrent neural network layers depending on the cell type."""
if
params
.
cell_type
!=
"cudnn_lstm"
:
outputs
=
_add_regular_rnn_layers
(
convolved
,
lengths
)
else
:
outputs
=
_add_cudnn_rnn_layers
(
convolved
)
# outputs is [batch_size, L, N] where L is the maximal sequence length and N
# the number of nodes in the last layer.
mask
=
tf
.
tile
(
tf
.
expand_dims
(
tf
.
sequence_mask
(
lengths
,
tf
.
shape
(
outputs
)[
1
]),
2
),
[
1
,
1
,
tf
.
shape
(
outputs
)[
2
]])
zero_outside
=
tf
.
where
(
mask
,
outputs
,
tf
.
zeros_like
(
outputs
))
outputs
=
tf
.
reduce_sum
(
zero_outside
,
axis
=
1
)
return
outputs
def
_add_fc_layers
(
final_state
):
"""Adds a fully connected layer."""
return
tf
.
layers
.
dense
(
final_state
,
params
.
num_classes
)
# Build the model.
inks
,
lengths
,
labels
=
_get_input_tensors
(
features
,
labels
)
convolved
,
lengths
=
_add_conv_layers
(
inks
,
lengths
)
final_state
=
_add_rnn_layers
(
convolved
,
lengths
)
logits
=
_add_fc_layers
(
final_state
)
# Add the loss.
cross_entropy
=
tf
.
reduce_mean
(
tf
.
nn
.
sparse_softmax_cross_entropy_with_logits
(
labels
=
labels
,
logits
=
logits
))
# Add the optimizer.
train_op
=
tf
.
contrib
.
layers
.
optimize_loss
(
loss
=
cross_entropy
,
global_step
=
tf
.
train
.
get_global_step
(),
learning_rate
=
params
.
learning_rate
,
optimizer
=
"Adam"
,
# some gradient clipping stabilizes training in the beginning.
clip_gradients
=
params
.
gradient_clipping_norm
,
summaries
=
[
"learning_rate"
,
"loss"
,
"gradients"
,
"gradient_norm"
])
# Compute current predictions.
predictions
=
tf
.
argmax
(
logits
,
axis
=
1
)
return
tf
.
estimator
.
EstimatorSpec
(
mode
=
mode
,
predictions
=
{
"logits"
:
logits
,
"predictions"
:
predictions
},
loss
=
cross_entropy
,
train_op
=
train_op
,
eval_metric_ops
=
{
"accuracy"
:
tf
.
metrics
.
accuracy
(
labels
,
predictions
)})
def
create_estimator_and_specs
(
run_config
):
"""Creates an Experiment configuration based on the estimator and input fn."""
model_params
=
tf
.
contrib
.
training
.
HParams
(
num_layers
=
FLAGS
.
num_layers
,
num_nodes
=
FLAGS
.
num_nodes
,
batch_size
=
FLAGS
.
batch_size
,
num_conv
=
ast
.
literal_eval
(
FLAGS
.
num_conv
),
conv_len
=
ast
.
literal_eval
(
FLAGS
.
conv_len
),
num_classes
=
get_num_classes
(),
learning_rate
=
FLAGS
.
learning_rate
,
gradient_clipping_norm
=
FLAGS
.
gradient_clipping_norm
,
cell_type
=
FLAGS
.
cell_type
,
batch_norm
=
FLAGS
.
batch_norm
,
dropout
=
FLAGS
.
dropout
)
estimator
=
tf
.
estimator
.
Estimator
(
model_fn
=
model_fn
,
config
=
run_config
,
params
=
model_params
)
train_spec
=
tf
.
estimator
.
TrainSpec
(
input_fn
=
get_input_fn
(
mode
=
tf
.
estimator
.
ModeKeys
.
TRAIN
,
tfrecord_pattern
=
FLAGS
.
training_data
,
batch_size
=
FLAGS
.
batch_size
),
max_steps
=
FLAGS
.
steps
)
eval_spec
=
tf
.
estimator
.
EvalSpec
(
input_fn
=
get_input_fn
(
mode
=
tf
.
estimator
.
ModeKeys
.
EVAL
,
tfrecord_pattern
=
FLAGS
.
eval_data
,
batch_size
=
FLAGS
.
batch_size
))
return
estimator
,
train_spec
,
eval_spec
def
main
(
unused_args
):
estimator
,
train_spec
,
eval_spec
=
create_estimator_and_specs
(
run_config
=
tf
.
estimator
.
RunConfig
(
model_dir
=
FLAGS
.
model_dir
,
save_checkpoints_secs
=
300
,
save_summary_steps
=
100
))
tf
.
estimator
.
train_and_evaluate
(
estimator
,
train_spec
,
eval_spec
)
if
__name__
==
"__main__"
:
parser
=
argparse
.
ArgumentParser
()
parser
.
register
(
"type"
,
"bool"
,
lambda
v
:
v
.
lower
()
==
"true"
)
parser
.
add_argument
(
"--training_data"
,
type
=
str
,
default
=
""
,
help
=
"Path to training data (tf.Example in TFRecord format)"
)
parser
.
add_argument
(
"--eval_data"
,
type
=
str
,
default
=
""
,
help
=
"Path to evaluation data (tf.Example in TFRecord format)"
)
parser
.
add_argument
(
"--classes_file"
,
type
=
str
,
default
=
""
,
help
=
"Path to a file with the classes - one class per line"
)
parser
.
add_argument
(
"--num_layers"
,
type
=
int
,
default
=
3
,
help
=
"Number of recurrent neural network layers."
)
parser
.
add_argument
(
"--num_nodes"
,
type
=
int
,
default
=
128
,
help
=
"Number of node per recurrent network layer."
)
parser
.
add_argument
(
"--num_conv"
,
type
=
str
,
default
=
"[48, 64, 96]"
,
help
=
"Number of conv layers along with number of filters per layer."
)
parser
.
add_argument
(
"--conv_len"
,
type
=
str
,
default
=
"[5, 5, 3]"
,
help
=
"Length of the convolution filters."
)
parser
.
add_argument
(
"--cell_type"
,
type
=
str
,
default
=
"lstm"
,
help
=
"Cell type used for rnn layers: cudnn_lstm, lstm or block_lstm."
)
parser
.
add_argument
(
"--batch_norm"
,
type
=
"bool"
,
default
=
"False"
,
help
=
"Whether to enable batch normalization or not."
)
parser
.
add_argument
(
"--learning_rate"
,
type
=
float
,
default
=
0.0001
,
help
=
"Learning rate used for training."
)
parser
.
add_argument
(
"--gradient_clipping_norm"
,
type
=
float
,
default
=
9.0
,
help
=
"Gradient clipping norm used during training."
)
parser
.
add_argument
(
"--dropout"
,
type
=
float
,
default
=
0.3
,
help
=
"Dropout used for convolutions and bidi lstm layers."
)
parser
.
add_argument
(
"--steps"
,
type
=
int
,
default
=
100000
,
help
=
"Number of training steps."
)
parser
.
add_argument
(
"--batch_size"
,
type
=
int
,
default
=
8
,
help
=
"Batch size to use for training/evaluation."
)
parser
.
add_argument
(
"--model_dir"
,
type
=
str
,
default
=
""
,
help
=
"Path for storing the model checkpoints."
)
parser
.
add_argument
(
"--self_test"
,
type
=
"bool"
,
default
=
"False"
,
help
=
"Whether to enable batch normalization or not."
)
FLAGS
,
unparsed
=
parser
.
parse_known_args
()
tf
.
app
.
run
(
main
=
main
,
argv
=
[
sys
.
argv
[
0
]]
+
unparsed
)
Prev
1
2
3
Next
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