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
790e49e5
Commit
790e49e5
authored
Mar 23, 2021
by
stephenwu
Browse files
Merge branch 'master' of
https://github.com/tensorflow/models
into run_superglue
parents
8ab018b0
5bb827c3
Changes
378
Hide whitespace changes
Inline
Side-by-side
Showing
20 changed files
with
332 additions
and
432 deletions
+332
-432
official/vision/keras_cv/ops/anchor_generator.py
official/vision/keras_cv/ops/anchor_generator.py
+2
-2
official/vision/keras_cv/ops/anchor_generator_test.py
official/vision/keras_cv/ops/anchor_generator_test.py
+2
-2
official/vision/keras_cv/ops/box_matcher.py
official/vision/keras_cv/ops/box_matcher.py
+2
-2
official/vision/keras_cv/ops/box_matcher_test.py
official/vision/keras_cv/ops/box_matcher_test.py
+2
-2
official/vision/keras_cv/ops/iou_similarity.py
official/vision/keras_cv/ops/iou_similarity.py
+2
-2
official/vision/keras_cv/ops/iou_similarity_test.py
official/vision/keras_cv/ops/iou_similarity_test.py
+2
-2
official/vision/keras_cv/ops/target_gather.py
official/vision/keras_cv/ops/target_gather.py
+2
-2
official/vision/keras_cv/ops/target_gather_test.py
official/vision/keras_cv/ops/target_gather_test.py
+2
-2
official/vision/keras_cv/setup.py
official/vision/keras_cv/setup.py
+2
-2
orbit/standard_runner.py
orbit/standard_runner.py
+65
-39
orbit/standard_runner_test.py
orbit/standard_runner_test.py
+11
-0
orbit/utils/summary_manager.py
orbit/utils/summary_manager.py
+1
-1
orbit/utils/tpu_summaries.py
orbit/utils/tpu_summaries.py
+1
-1
research/a3c_blogpost/README.md
research/a3c_blogpost/README.md
+0
-6
research/a3c_blogpost/a3c_cartpole.py
research/a3c_blogpost/a3c_cartpole.py
+0
-366
research/delf/delf/python/datasets/utils.py
research/delf/delf/python/datasets/utils.py
+71
-0
research/delf/delf/python/datasets/utils_test.py
research/delf/delf/python/datasets/utils_test.py
+76
-0
research/object_detection/builders/hyperparams_builder.py
research/object_detection/builders/hyperparams_builder.py
+17
-0
research/object_detection/builders/hyperparams_builder_test.py
...rch/object_detection/builders/hyperparams_builder_test.py
+55
-0
research/object_detection/builders/model_builder.py
research/object_detection/builders/model_builder.py
+17
-1
No files found.
official/vision/keras_cv/ops/anchor_generator.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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.
# ==============================================================================
"""Multi scale anchor generator definition."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/ops/anchor_generator_test.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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 anchor_generator.py."""
from
absl.testing
import
parameterized
...
...
official/vision/keras_cv/ops/box_matcher.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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.
# ==============================================================================
"""Box matcher implementation."""
...
...
official/vision/keras_cv/ops/box_matcher_test.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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 box_matcher.py."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/ops/iou_similarity.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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.
# ==============================================================================
"""Region Similarity Calculators."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/ops/iou_similarity_test.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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 iou_similarity.py."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/ops/target_gather.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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.
# ==============================================================================
"""Definition of target gather, which gathers targets from indices."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/ops/target_gather_test.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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.
...
...
@@ -11,7 +11,7 @@
# 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 target_gather.py."""
import
tensorflow
as
tf
...
...
official/vision/keras_cv/setup.py
View file @
790e49e5
# Copyright 202
0
The TensorFlow Authors. All Rights Reserved.
# Copyright 202
1
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
s
://www.apache.org/licenses/LICENSE-2.0
# 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,
...
...
orbit/standard_runner.py
View file @
790e49e5
...
...
@@ -68,21 +68,6 @@ class StandardTrainerOptions:
use_tpu_summary_optimization
:
bool
=
False
def
_create_train_loop_fn
(
train_step_fn
,
options
:
StandardTrainerOptions
):
"""Creates a training loop from the given step function and options."""
if
options
.
use_tf_while_loop
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn
(
train_step_fn
)
if
options
.
use_tpu_summary_optimization
:
loop_fn
=
loop_fns
.
LoopFnWithSummaries
(
loop_fn
)
else
:
loop_fn
=
tf
.
function
(
loop_fn
)
else
:
if
options
.
use_tf_function
:
train_step_fn
=
tf
.
function
(
train_step_fn
)
loop_fn
=
loop_fns
.
create_loop_fn
(
train_step_fn
)
return
loop_fn
class
StandardTrainer
(
runner
.
AbstractTrainer
,
metaclass
=
abc
.
ABCMeta
):
"""Implements standard functionality on top of the AbstractTrainer API.
...
...
@@ -119,6 +104,25 @@ class StandardTrainer(runner.AbstractTrainer, metaclass=abc.ABCMeta):
self
.
_train_iter
=
None
self
.
_train_loop_fn
=
None
def
create_train_loop_fn
(
self
):
"""Creates a training loop from the current step function and options.
Returns:
The train loop function, i.e. wrapper of multiple train steps.
"""
train_step_fn
=
self
.
train_step
if
self
.
_train_options
.
use_tf_while_loop
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn
(
train_step_fn
)
if
self
.
_train_options
.
use_tpu_summary_optimization
:
loop_fn
=
loop_fns
.
LoopFnWithSummaries
(
loop_fn
)
else
:
loop_fn
=
tf
.
function
(
loop_fn
)
else
:
if
self
.
_train_options
.
use_tf_function
:
train_step_fn
=
tf
.
function
(
train_step_fn
)
loop_fn
=
loop_fns
.
create_loop_fn
(
train_step_fn
)
return
loop_fn
def
train
(
self
,
num_steps
:
tf
.
Tensor
)
->
Optional
[
runner
.
Output
]:
"""Implements `num_steps` steps of training.
...
...
@@ -132,8 +136,7 @@ class StandardTrainer(runner.AbstractTrainer, metaclass=abc.ABCMeta):
self
.
train_loop_begin
()
if
self
.
_train_loop_fn
is
None
:
self
.
_train_loop_fn
=
_create_train_loop_fn
(
self
.
train_step
,
options
=
self
.
_train_options
)
self
.
_train_loop_fn
=
self
.
create_train_loop_fn
()
if
self
.
_train_iter
is
None
:
self
.
_train_iter
=
tf
.
nest
.
map_structure
(
iter
,
self
.
train_dataset
)
...
...
@@ -217,28 +220,17 @@ class StandardEvaluatorOptions:
in eager mode.
use_tf_while_loop: A boolean indicating whether to run the training loop
using a `tf.while_loop`. If `True`, `use_tf_function` must also be `True`.
recreate_iterator_for_each_eval: A boolean indicating whether to recreate a
new iterator for the evaluation dataset before each round of evaluation,
which implies each round of evaluation starts from the beginning of
the evaluation dataset. For example, the evaluation dataset is
`[1, 2, 3, 4]`, batch size is 1 and evaluation steps is 2. If `True`, the
data to be evaluated is [1, 2] every time. If `False`, the iterator
state is maintained between calls to `StandardEvaluator.evaluate()`.
"""
use_tf_function
:
bool
=
True
use_tf_while_loop
:
bool
=
False
def
_create_eval_loop_fn
(
eval_step_fn
,
has_state
:
bool
,
options
:
StandardEvaluatorOptions
):
"""Create evaluation loop function."""
if
options
.
use_tf_while_loop
:
# TODO(b/176126742): tf.while_loop doesn't support `None` as a loop input
# even when it is not used inside the loop. To workaround this limitation,
# we have to build two tf.functions for it.
if
has_state
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn_with_state
(
eval_step_fn
)
else
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn
(
eval_step_fn
)
loop_fn
=
tf
.
function
(
loop_fn
)
else
:
if
options
.
use_tf_function
:
eval_step_fn
=
tf
.
function
(
eval_step_fn
)
loop_fn
=
loop_fns
.
create_loop_fn
(
eval_step_fn
)
return
loop_fn
recreate_iterator_for_each_eval
:
bool
=
True
class
StandardEvaluator
(
runner
.
AbstractEvaluator
,
metaclass
=
abc
.
ABCMeta
):
...
...
@@ -277,8 +269,34 @@ class StandardEvaluator(runner.AbstractEvaluator, metaclass=abc.ABCMeta):
self
.
_eval_options
=
options
self
.
_eval_dataset
=
eval_dataset
self
.
_eval_iter
=
None
self
.
_eval_loop_fn
=
None
def
create_eval_loop_fn
(
self
,
has_state
:
bool
):
"""Creates an eval loop from the current step function and options.
Args:
has_state: If the step function has state, state will be kept in the loop.
Returns:
The eval loop function, i.e. wrapper of multiple eval steps.
"""
eval_step_fn
=
self
.
eval_step
if
self
.
_eval_options
.
use_tf_while_loop
:
# TODO(b/176126742): tf.while_loop doesn't support `None` as a loop input
# even when it is not used inside the loop. To workaround this limitation,
# we have to build two tf.functions for it.
if
has_state
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn_with_state
(
eval_step_fn
)
else
:
loop_fn
=
loop_fns
.
create_tf_while_loop_fn
(
eval_step_fn
)
loop_fn
=
tf
.
function
(
loop_fn
)
else
:
if
self
.
_eval_options
.
use_tf_function
:
eval_step_fn
=
tf
.
function
(
eval_step_fn
)
loop_fn
=
loop_fns
.
create_loop_fn
(
eval_step_fn
)
return
loop_fn
def
evaluate
(
self
,
num_steps
:
tf
.
Tensor
)
->
Optional
[
runner
.
Output
]:
"""Implements `num_steps` steps of evaluation.
...
...
@@ -302,10 +320,17 @@ class StandardEvaluator(runner.AbstractEvaluator, metaclass=abc.ABCMeta):
has_state
=
outputs
is
not
None
if
self
.
_eval_loop_fn
is
None
:
self
.
_eval_loop_fn
=
_create_eval_loop_fn
(
self
.
eval_step
,
has_state
=
has_state
,
options
=
self
.
_eval_options
)
self
.
_eval_loop_fn
=
self
.
create_eval_loop_fn
(
has_state
)
# If `recreate_iterator_for_each_eval` is `True`, `self._eval_iter` is
# always None.
if
self
.
_eval_iter
is
None
:
eval_iter
=
tf
.
nest
.
map_structure
(
iter
,
self
.
eval_dataset
)
if
not
self
.
_eval_options
.
recreate_iterator_for_each_eval
:
self
.
_eval_iter
=
eval_iter
else
:
eval_iter
=
self
.
_eval_iter
eval_iter
=
tf
.
nest
.
map_structure
(
iter
,
self
.
eval_dataset
)
if
self
.
_eval_options
.
use_tf_while_loop
and
not
has_state
:
self
.
_eval_loop_fn
(
eval_iter
,
num_steps
)
else
:
...
...
@@ -413,3 +438,4 @@ class StandardEvaluator(runner.AbstractEvaluator, metaclass=abc.ABCMeta):
`DistributedDataset`.
"""
self
.
_eval_dataset
=
eval_dataset
self
.
_eval_iter
=
None
orbit/standard_runner_test.py
View file @
790e49e5
...
...
@@ -136,6 +136,17 @@ class StandardRunnerTest(parameterized.TestCase):
evaluator
=
TestEvaluatorWithOutputsAggregation
(
options
)
self
.
assertEqual
(
evaluator
.
evaluate
(
tf
.
constant
(
10
)),
45
)
@
parameterized
.
named_parameters
(
(
"recreate_iterator_for_each_eval"
,
True
,
10
,
10
),
(
"not_recreate_iterator_for_each_eval"
,
False
,
10
,
35
))
def
test_evaluator_with_repeat_dataset
(
self
,
recreate_iterator_for_each_eval
,
sum_for_1st_time
,
sum_for_2nd_time
):
options
=
standard_runner
.
StandardEvaluatorOptions
(
recreate_iterator_for_each_eval
=
recreate_iterator_for_each_eval
)
evaluator
=
TestEvaluatorWithOutputsAggregation
(
options
)
self
.
assertEqual
(
evaluator
.
evaluate
(
tf
.
constant
(
5
)),
sum_for_1st_time
)
self
.
assertEqual
(
evaluator
.
evaluate
(
tf
.
constant
(
5
)),
sum_for_2nd_time
)
if
__name__
==
"__main__"
:
tf
.
test
.
main
()
orbit/utils/summary_manager.py
View file @
790e49e5
...
...
@@ -71,7 +71,7 @@ class SummaryManager:
provided in `summary_dict`, yielding a hierarchy of directories which will
then be reflected in the TensorBoard UI as different colored curves.
For example, users may evaluate on muliple datasets and return
For example, users may evaluate on mul
t
iple datasets and return
`summary_dict` as a nested dictionary:
{
...
...
orbit/utils/tpu_summaries.py
View file @
790e49e5
...
...
@@ -64,7 +64,7 @@ class OptionalSummariesFunction:
return TrainFunctionWithSummaries(function, **kwargs)
return functools.partial(TrainFunctionWithSummaries, **kwargs)
The d
ir
ector can be applied directly to `train()` methods:
The dec
ora
tor can be applied directly to `train()` methods:
@train_function_with_summaries
def train(self, num_steps):
...
...
research/a3c_blogpost/README.md
deleted
100644 → 0
View file @
8ab018b0
# A3C Blog Post
In order to run this code, you will need the following prerequisites:
*
[
OpenAI Gym
](
https://github.com/openai/gym
)
-
`pip install gym`
*
[
pyglet
](
https://bitbucket.org/pyglet/pyglet/wiki/Home
)
-
`pip install pyglet`
*
[
TensorFlow
](
https://www.tensorflow.org/install/
)
-
`pip install tensorflow==2.2.0`
research/a3c_blogpost/a3c_cartpole.py
deleted
100644 → 0
View file @
8ab018b0
import
os
os
.
environ
[
"CUDA_VISIBLE_DEVICES"
]
=
""
import
threading
import
gym
import
multiprocessing
import
numpy
as
np
from
queue
import
Queue
import
argparse
import
matplotlib.pyplot
as
plt
import
tensorflow
as
tf
from
tensorflow.python
import
keras
from
tensorflow.python.keras
import
layers
parser
=
argparse
.
ArgumentParser
(
description
=
'Run A3C algorithm on the game '
'Cartpole.'
)
parser
.
add_argument
(
'--algorithm'
,
default
=
'a3c'
,
type
=
str
,
help
=
'Choose between
\'
a3c
\'
and
\'
random
\'
.'
)
parser
.
add_argument
(
'--train'
,
dest
=
'train'
,
action
=
'store_true'
,
help
=
'Train our model.'
)
parser
.
add_argument
(
'--lr'
,
default
=
0.001
,
help
=
'Learning rate for the shared optimizer.'
)
parser
.
add_argument
(
'--update-freq'
,
default
=
20
,
type
=
int
,
help
=
'How often to update the global model.'
)
parser
.
add_argument
(
'--max-eps'
,
default
=
1000
,
type
=
int
,
help
=
'Global maximum number of episodes to run.'
)
parser
.
add_argument
(
'--gamma'
,
default
=
0.99
,
help
=
'Discount factor of rewards.'
)
parser
.
add_argument
(
'--save-dir'
,
default
=
'/tmp/'
,
type
=
str
,
help
=
'Directory in which you desire to save the model.'
)
args
=
parser
.
parse_args
()
class
ActorCriticModel
(
keras
.
Model
):
def
__init__
(
self
,
state_size
,
action_size
):
super
(
ActorCriticModel
,
self
).
__init__
()
self
.
state_size
=
state_size
self
.
action_size
=
action_size
self
.
dense1
=
layers
.
Dense
(
100
,
activation
=
'relu'
)
self
.
policy_logits
=
layers
.
Dense
(
action_size
)
self
.
dense2
=
layers
.
Dense
(
100
,
activation
=
'relu'
)
self
.
values
=
layers
.
Dense
(
1
)
def
call
(
self
,
inputs
):
# Forward pass
x
=
self
.
dense1
(
inputs
)
logits
=
self
.
policy_logits
(
x
)
v1
=
self
.
dense2
(
inputs
)
values
=
self
.
values
(
v1
)
return
logits
,
values
def
record
(
episode
,
episode_reward
,
worker_idx
,
global_ep_reward
,
result_queue
,
total_loss
,
num_steps
):
"""Helper function to store score and print statistics.
Args:
episode: Current episode
episode_reward: Reward accumulated over the current episode
worker_idx: Which thread (worker)
global_ep_reward: The moving average of the global reward
result_queue: Queue storing the moving average of the scores
total_loss: The total loss accumualted over the current episode
num_steps: The number of steps the episode took to complete
"""
if
global_ep_reward
==
0
:
global_ep_reward
=
episode_reward
else
:
global_ep_reward
=
global_ep_reward
*
0.99
+
episode_reward
*
0.01
print
(
f
"Episode:
{
episode
}
| "
f
"Moving Average Reward:
{
int
(
global_ep_reward
)
}
| "
f
"Episode Reward:
{
int
(
episode_reward
)
}
| "
f
"Loss:
{
int
(
total_loss
/
float
(
num_steps
)
*
1000
)
/
1000
}
| "
f
"Steps:
{
num_steps
}
| "
f
"Worker:
{
worker_idx
}
"
)
result_queue
.
put
(
global_ep_reward
)
return
global_ep_reward
class
RandomAgent
:
"""Random Agent that will play the specified game
Args:
env_name: Name of the environment to be played
max_eps: Maximum number of episodes to run agent for.
"""
def
__init__
(
self
,
env_name
,
max_eps
):
self
.
env
=
gym
.
make
(
env_name
)
self
.
max_episodes
=
max_eps
self
.
global_moving_average_reward
=
0
self
.
res_queue
=
Queue
()
def
run
(
self
):
reward_avg
=
0
for
episode
in
range
(
self
.
max_episodes
):
done
=
False
self
.
env
.
reset
()
reward_sum
=
0.0
steps
=
0
while
not
done
:
# Sample randomly from the action space and step
_
,
reward
,
done
,
_
=
self
.
env
.
step
(
self
.
env
.
action_space
.
sample
())
steps
+=
1
reward_sum
+=
reward
# Record statistics
self
.
global_moving_average_reward
=
record
(
episode
,
reward_sum
,
0
,
self
.
global_moving_average_reward
,
self
.
res_queue
,
0
,
steps
)
reward_avg
+=
reward_sum
final_avg
=
reward_avg
/
float
(
self
.
max_episodes
)
print
(
"Average score across {} episodes: {}"
.
format
(
self
.
max_episodes
,
final_avg
))
return
final_avg
class
MasterAgent
():
def
__init__
(
self
):
self
.
game_name
=
'CartPole-v0'
save_dir
=
args
.
save_dir
self
.
save_dir
=
save_dir
if
not
os
.
path
.
exists
(
save_dir
):
os
.
makedirs
(
save_dir
)
env
=
gym
.
make
(
self
.
game_name
)
self
.
state_size
=
env
.
observation_space
.
shape
[
0
]
self
.
action_size
=
env
.
action_space
.
n
self
.
opt
=
tf
.
compat
.
v1
.
train
.
AdamOptimizer
(
args
.
lr
,
use_locking
=
True
)
print
(
self
.
state_size
,
self
.
action_size
)
self
.
global_model
=
ActorCriticModel
(
self
.
state_size
,
self
.
action_size
)
# global network
self
.
global_model
(
tf
.
convert_to_tensor
(
np
.
random
.
random
((
1
,
self
.
state_size
)),
dtype
=
tf
.
float32
))
def
train
(
self
):
if
args
.
algorithm
==
'random'
:
random_agent
=
RandomAgent
(
self
.
game_name
,
args
.
max_eps
)
random_agent
.
run
()
return
res_queue
=
Queue
()
workers
=
[
Worker
(
self
.
state_size
,
self
.
action_size
,
self
.
global_model
,
self
.
opt
,
res_queue
,
i
,
game_name
=
self
.
game_name
,
save_dir
=
self
.
save_dir
)
for
i
in
range
(
multiprocessing
.
cpu_count
())]
for
i
,
worker
in
enumerate
(
workers
):
print
(
"Starting worker {}"
.
format
(
i
))
worker
.
start
()
moving_average_rewards
=
[]
# record episode reward to plot
while
True
:
reward
=
res_queue
.
get
()
if
reward
is
not
None
:
moving_average_rewards
.
append
(
reward
)
else
:
break
[
w
.
join
()
for
w
in
workers
]
plt
.
plot
(
moving_average_rewards
)
plt
.
ylabel
(
'Moving average ep reward'
)
plt
.
xlabel
(
'Step'
)
plt
.
savefig
(
os
.
path
.
join
(
self
.
save_dir
,
'{} Moving Average.png'
.
format
(
self
.
game_name
)))
plt
.
show
()
def
play
(
self
):
env
=
gym
.
make
(
self
.
game_name
).
unwrapped
state
=
env
.
reset
()
model
=
self
.
global_model
model_path
=
os
.
path
.
join
(
self
.
save_dir
,
'model_{}.h5'
.
format
(
self
.
game_name
))
print
(
'Loading model from: {}'
.
format
(
model_path
))
model
.
load_weights
(
model_path
)
done
=
False
step_counter
=
0
reward_sum
=
0
try
:
while
not
done
:
env
.
render
(
mode
=
'rgb_array'
)
policy
,
value
=
model
(
tf
.
convert_to_tensor
(
state
[
None
,
:],
dtype
=
tf
.
float32
))
policy
=
tf
.
nn
.
softmax
(
policy
)
action
=
np
.
argmax
(
policy
)
state
,
reward
,
done
,
_
=
env
.
step
(
action
)
reward_sum
+=
reward
print
(
"{}. Reward: {}, action: {}"
.
format
(
step_counter
,
reward_sum
,
action
))
step_counter
+=
1
except
KeyboardInterrupt
:
print
(
"Received Keyboard Interrupt. Shutting down."
)
finally
:
env
.
close
()
class
Memory
:
def
__init__
(
self
):
self
.
states
=
[]
self
.
actions
=
[]
self
.
rewards
=
[]
def
store
(
self
,
state
,
action
,
reward
):
self
.
states
.
append
(
state
)
self
.
actions
.
append
(
action
)
self
.
rewards
.
append
(
reward
)
def
clear
(
self
):
self
.
states
=
[]
self
.
actions
=
[]
self
.
rewards
=
[]
class
Worker
(
threading
.
Thread
):
# Set up global variables across different threads
global_episode
=
0
# Moving average reward
global_moving_average_reward
=
0
best_score
=
0
save_lock
=
threading
.
Lock
()
def
__init__
(
self
,
state_size
,
action_size
,
global_model
,
opt
,
result_queue
,
idx
,
game_name
=
'CartPole-v0'
,
save_dir
=
'/tmp'
):
super
(
Worker
,
self
).
__init__
()
self
.
state_size
=
state_size
self
.
action_size
=
action_size
self
.
result_queue
=
result_queue
self
.
global_model
=
global_model
self
.
opt
=
opt
self
.
local_model
=
ActorCriticModel
(
self
.
state_size
,
self
.
action_size
)
self
.
worker_idx
=
idx
self
.
game_name
=
game_name
self
.
env
=
gym
.
make
(
self
.
game_name
).
unwrapped
self
.
save_dir
=
save_dir
self
.
ep_loss
=
0.0
def
run
(
self
):
total_step
=
1
mem
=
Memory
()
while
Worker
.
global_episode
<
args
.
max_eps
:
current_state
=
self
.
env
.
reset
()
mem
.
clear
()
ep_reward
=
0.
ep_steps
=
0
self
.
ep_loss
=
0
time_count
=
0
done
=
False
while
not
done
:
logits
,
_
=
self
.
local_model
(
tf
.
convert_to_tensor
(
current_state
[
None
,
:],
dtype
=
tf
.
float32
))
probs
=
tf
.
nn
.
softmax
(
logits
)
action
=
np
.
random
.
choice
(
self
.
action_size
,
p
=
probs
.
numpy
()[
0
])
new_state
,
reward
,
done
,
_
=
self
.
env
.
step
(
action
)
if
done
:
reward
=
-
1
ep_reward
+=
reward
mem
.
store
(
current_state
,
action
,
reward
)
if
time_count
==
args
.
update_freq
or
done
:
# Calculate gradient wrt to local model. We do so by tracking the
# variables involved in computing the loss by using tf.GradientTape
with
tf
.
GradientTape
()
as
tape
:
total_loss
=
self
.
compute_loss
(
done
,
new_state
,
mem
,
args
.
gamma
)
self
.
ep_loss
+=
total_loss
# Calculate local gradients
grads
=
tape
.
gradient
(
total_loss
,
self
.
local_model
.
trainable_weights
)
# Push local gradients to global model
self
.
opt
.
apply_gradients
(
zip
(
grads
,
self
.
global_model
.
trainable_weights
))
# Update local model with new weights
self
.
local_model
.
set_weights
(
self
.
global_model
.
get_weights
())
mem
.
clear
()
time_count
=
0
if
done
:
# done and print information
Worker
.
global_moving_average_reward
=
\
record
(
Worker
.
global_episode
,
ep_reward
,
self
.
worker_idx
,
Worker
.
global_moving_average_reward
,
self
.
result_queue
,
self
.
ep_loss
,
ep_steps
)
# We must use a lock to save our model and to print to prevent data races.
if
ep_reward
>
Worker
.
best_score
:
with
Worker
.
save_lock
:
print
(
"Saving best model to {}, "
"episode score: {}"
.
format
(
self
.
save_dir
,
ep_reward
))
self
.
global_model
.
save_weights
(
os
.
path
.
join
(
self
.
save_dir
,
'model_{}.h5'
.
format
(
self
.
game_name
))
)
Worker
.
best_score
=
ep_reward
Worker
.
global_episode
+=
1
ep_steps
+=
1
time_count
+=
1
current_state
=
new_state
total_step
+=
1
self
.
result_queue
.
put
(
None
)
def
compute_loss
(
self
,
done
,
new_state
,
memory
,
gamma
=
0.99
):
if
done
:
reward_sum
=
0.
# terminal
else
:
reward_sum
=
self
.
local_model
(
tf
.
convert_to_tensor
(
new_state
[
None
,
:],
dtype
=
tf
.
float32
))[
-
1
].
numpy
()[
0
]
# Get discounted rewards
discounted_rewards
=
[]
for
reward
in
memory
.
rewards
[::
-
1
]:
# reverse buffer r
reward_sum
=
reward
+
gamma
*
reward_sum
discounted_rewards
.
append
(
reward_sum
)
discounted_rewards
.
reverse
()
logits
,
values
=
self
.
local_model
(
tf
.
convert_to_tensor
(
np
.
vstack
(
memory
.
states
),
dtype
=
tf
.
float32
))
# Get our advantages
advantage
=
tf
.
convert_to_tensor
(
np
.
array
(
discounted_rewards
)[:,
None
],
dtype
=
tf
.
float32
)
-
values
# Value loss
value_loss
=
advantage
**
2
# Calculate our policy loss
policy
=
tf
.
nn
.
softmax
(
logits
)
entropy
=
tf
.
nn
.
softmax_cross_entropy_with_logits
(
labels
=
policy
,
logits
=
logits
)
policy_loss
=
tf
.
nn
.
sparse_softmax_cross_entropy_with_logits
(
labels
=
memory
.
actions
,
logits
=
logits
)
policy_loss
*=
tf
.
stop_gradient
(
advantage
)
policy_loss
-=
0.01
*
entropy
total_loss
=
tf
.
reduce_mean
((
0.5
*
value_loss
+
policy_loss
))
return
total_loss
if
__name__
==
'__main__'
:
print
(
args
)
master
=
MasterAgent
()
if
args
.
train
:
master
.
train
()
else
:
master
.
play
()
research/delf/delf/python/datasets/utils.py
0 → 100644
View file @
790e49e5
# Lint as: python3
# Copyright 2021 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.
# ==============================================================================
"""Supporting functions for data loading."""
import
numpy
as
np
from
PIL
import
Image
import
tensorflow
as
tf
from
delf.python
import
utils
as
image_loading_utils
def
pil_imagenet_loader
(
path
,
imsize
,
bounding_box
=
None
,
normalize
=
True
):
"""Pillow loader for the images.
Args:
path: Path to image to be loaded.
imsize: Integer, defines the maximum size of longer image side.
bounding_box: (x1,y1,x2,y2) tuple to crop the query image.
normalize: Bool, whether to normalize the image.
Returns:
image: `Tensor`, image in ImageNet suitable format.
"""
img
=
image_loading_utils
.
RgbLoader
(
path
)
if
bounding_box
is
not
None
:
imfullsize
=
max
(
img
.
size
)
img
=
img
.
crop
(
bounding_box
)
imsize
=
imsize
*
max
(
img
.
size
)
/
imfullsize
# Unlike `resize`, `thumbnail` resizes to the largest size that preserves
# the aspect ratio, making sure that the output image does not exceed the
# original image size and the size specified in the arguments of thumbnail.
img
.
thumbnail
((
imsize
,
imsize
),
Image
.
ANTIALIAS
)
img
=
np
.
array
(
img
)
if
normalize
:
# Preprocessing for ImageNet data. Converts the images from RGB to BGR,
# then zero-centers each color channel with respect to the ImageNet
# dataset, without scaling.
tf
.
keras
.
applications
.
imagenet_utils
.
preprocess_input
(
img
,
mode
=
'caffe'
)
return
img
def
default_loader
(
path
,
imsize
,
bounding_box
=
None
,
normalize
=
True
):
"""Default loader for the images is using Pillow.
Args:
path: Path to image to be loaded.
imsize: Integer, defines the maximum size of longer image side.
bounding_box: (x1,y1,x2,y2) tuple to crop the query image.
Returns:
image: `Tensor`, image in ImageNet suitable format.
"""
img
=
pil_imagenet_loader
(
path
,
imsize
,
bounding_box
,
normalize
)
return
img
research/delf/delf/python/datasets/utils_test.py
0 → 100644
View file @
790e49e5
# Lint as: python3
# Copyright 2021 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 dataset utilities."""
from
__future__
import
absolute_import
from
__future__
import
division
from
__future__
import
print_function
import
os
from
absl
import
flags
import
numpy
as
np
from
PIL
import
Image
import
tensorflow
as
tf
from
delf.python.datasets
import
utils
as
image_loading_utils
FLAGS
=
flags
.
FLAGS
class
UtilsTest
(
tf
.
test
.
TestCase
):
def
testDefaultLoader
(
self
):
# Create a dummy image.
dummy_image
=
np
.
random
.
rand
(
1024
,
750
,
3
)
*
255
img_out
=
Image
.
fromarray
(
dummy_image
.
astype
(
'uint8'
)).
convert
(
'RGB'
)
filename
=
os
.
path
.
join
(
FLAGS
.
test_tmpdir
,
'test_image.png'
)
# Save the dummy image.
img_out
.
save
(
filename
)
max_img_size
=
1024
# Load the saved dummy image.
img
=
image_loading_utils
.
default_loader
(
filename
,
imsize
=
max_img_size
,
normalize
=
False
)
# Make sure the values are the same before and after loading.
self
.
assertAllEqual
(
np
.
array
(
img_out
),
img
)
self
.
assertAllLessEqual
(
tf
.
shape
(
img
),
max_img_size
)
def
testDefaultLoaderWithBoundingBox
(
self
):
# Create a dummy image.
dummy_image
=
np
.
random
.
rand
(
1024
,
750
,
3
)
*
255
img_out
=
Image
.
fromarray
(
dummy_image
.
astype
(
'uint8'
)).
convert
(
'RGB'
)
filename
=
os
.
path
.
join
(
FLAGS
.
test_tmpdir
,
'test_image.png'
)
# Save the dummy image.
img_out
.
save
(
filename
)
max_img_size
=
1024
# Load the saved dummy image.
expected_size
=
400
img
=
image_loading_utils
.
default_loader
(
filename
,
imsize
=
max_img_size
,
bounding_box
=
[
120
,
120
,
120
+
expected_size
,
120
+
expected_size
],
normalize
=
False
)
# Check the shape.
self
.
assertAllEqual
(
tf
.
shape
(
img
),
[
expected_size
,
expected_size
,
3
])
if
__name__
==
'__main__'
:
tf
.
test
.
main
()
research/object_detection/builders/hyperparams_builder.py
View file @
790e49e5
...
...
@@ -90,6 +90,9 @@ class KerasLayerHyperparams(object):
def
use_batch_norm
(
self
):
return
self
.
_batch_norm_params
is
not
None
def
use_sync_batch_norm
(
self
):
return
self
.
_use_sync_batch_norm
def
force_use_bias
(
self
):
return
self
.
_force_use_bias
...
...
@@ -165,6 +168,20 @@ class KerasLayerHyperparams(object):
else
:
return
tf
.
keras
.
layers
.
Lambda
(
tf
.
identity
,
name
=
name
)
def
get_regularizer_weight
(
self
):
"""Returns the l1 or l2 regularizer weight.
Returns: A float value corresponding to the l1 or l2 regularization weight,
or None if neither l1 or l2 regularization is defined.
"""
regularizer
=
self
.
_op_params
[
'kernel_regularizer'
]
if
hasattr
(
regularizer
,
'l1'
):
return
regularizer
.
l1
elif
hasattr
(
regularizer
,
'l2'
):
return
regularizer
.
l2
else
:
return
None
def
params
(
self
,
include_activation
=
False
,
**
overrides
):
"""Returns a dict containing the layer construction hyperparameters to use.
...
...
research/object_detection/builders/hyperparams_builder_test.py
View file @
790e49e5
...
...
@@ -580,6 +580,61 @@ class KerasHyperparamsBuilderTest(tf.test.TestCase):
result
=
regularizer
(
tf
.
constant
(
weights
)).
numpy
()
self
.
assertAllClose
(
np
.
power
(
weights
,
2
).
sum
()
/
2.0
*
0.42
,
result
)
def
test_return_l1_regularizer_weight_keras
(
self
):
conv_hyperparams_text_proto
=
"""
regularizer {
l1_regularizer {
weight: 0.5
}
}
initializer {
truncated_normal_initializer {
}
}
"""
conv_hyperparams_proto
=
hyperparams_pb2
.
Hyperparams
()
text_format
.
Parse
(
conv_hyperparams_text_proto
,
conv_hyperparams_proto
)
keras_config
=
hyperparams_builder
.
KerasLayerHyperparams
(
conv_hyperparams_proto
)
regularizer_weight
=
keras_config
.
get_regularizer_weight
()
self
.
assertAlmostEqual
(
regularizer_weight
,
0.5
)
def
test_return_l2_regularizer_weight_keras
(
self
):
conv_hyperparams_text_proto
=
"""
regularizer {
l2_regularizer {
weight: 0.5
}
}
initializer {
truncated_normal_initializer {
}
}
"""
conv_hyperparams_proto
=
hyperparams_pb2
.
Hyperparams
()
text_format
.
Parse
(
conv_hyperparams_text_proto
,
conv_hyperparams_proto
)
keras_config
=
hyperparams_builder
.
KerasLayerHyperparams
(
conv_hyperparams_proto
)
regularizer_weight
=
keras_config
.
get_regularizer_weight
()
self
.
assertAlmostEqual
(
regularizer_weight
,
0.25
)
def
test_return_undefined_regularizer_weight_keras
(
self
):
conv_hyperparams_text_proto
=
"""
initializer {
truncated_normal_initializer {
}
}
"""
conv_hyperparams_proto
=
hyperparams_pb2
.
Hyperparams
()
text_format
.
Parse
(
conv_hyperparams_text_proto
,
conv_hyperparams_proto
)
keras_config
=
hyperparams_builder
.
KerasLayerHyperparams
(
conv_hyperparams_proto
)
regularizer_weight
=
keras_config
.
get_regularizer_weight
()
self
.
assertIsNone
(
regularizer_weight
)
def
test_return_non_default_batch_norm_params_keras
(
self
):
conv_hyperparams_text_proto
=
"""
...
...
research/object_detection/builders/model_builder.py
View file @
790e49e5
...
...
@@ -17,6 +17,9 @@
import
functools
import
sys
from
absl
import
logging
from
object_detection.builders
import
anchor_generator_builder
from
object_detection.builders
import
box_coder_builder
from
object_detection.builders
import
box_predictor_builder
...
...
@@ -153,6 +156,14 @@ if tf_version.is_tf2():
center_net_resnet_v1_fpn_feature_extractor
.
resnet_v1_50_fpn
,
'resnet_v1_101_fpn'
:
center_net_resnet_v1_fpn_feature_extractor
.
resnet_v1_101_fpn
,
'hourglass_10'
:
center_net_hourglass_feature_extractor
.
hourglass_10
,
'hourglass_20'
:
center_net_hourglass_feature_extractor
.
hourglass_20
,
'hourglass_32'
:
center_net_hourglass_feature_extractor
.
hourglass_32
,
'hourglass_52'
:
center_net_hourglass_feature_extractor
.
hourglass_52
,
'hourglass_104'
:
center_net_hourglass_feature_extractor
.
hourglass_104
,
'mobilenet_v2'
:
...
...
@@ -907,13 +918,17 @@ def object_center_proto_to_params(oc_config):
losses_pb2
.
WeightedL2LocalizationLoss
())
loss
.
classification_loss
.
CopyFrom
(
oc_config
.
classification_loss
)
classification_loss
,
_
,
_
,
_
,
_
,
_
,
_
=
(
losses_builder
.
build
(
loss
))
keypoint_weights_for_center
=
[]
if
oc_config
.
keypoint_weights_for_center
:
keypoint_weights_for_center
=
list
(
oc_config
.
keypoint_weights_for_center
)
return
center_net_meta_arch
.
ObjectCenterParams
(
classification_loss
=
classification_loss
,
object_center_loss_weight
=
oc_config
.
object_center_loss_weight
,
heatmap_bias_init
=
oc_config
.
heatmap_bias_init
,
min_box_overlap_iou
=
oc_config
.
min_box_overlap_iou
,
max_box_predictions
=
oc_config
.
max_box_predictions
,
use_labeled_classes
=
oc_config
.
use_labeled_classes
)
use_labeled_classes
=
oc_config
.
use_labeled_classes
,
keypoint_weights_for_center
=
keypoint_weights_for_center
)
def
mask_proto_to_params
(
mask_config
):
...
...
@@ -1052,6 +1067,7 @@ def _build_center_net_model(center_net_config, is_training, add_summaries):
if
center_net_config
.
HasField
(
'post_processing'
):
non_max_suppression_fn
,
_
=
post_processing_builder
.
build
(
center_net_config
.
post_processing
)
return
center_net_meta_arch
.
CenterNetMetaArch
(
is_training
=
is_training
,
add_summaries
=
add_summaries
,
...
...
Prev
1
…
14
15
16
17
18
19
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