From 0817aac6be50174d8c14f89df3a700e0bb869c5b Mon Sep 17 00:00:00 2001 From: Scott Zhu Date: Mon, 28 Dec 2020 11:03:03 -0800 Subject: [PATCH] Fork the implementation of tf.initializer to keras. Since the implementation between tf.initializer and keras.initializer are just duplicates, copy the function to keras so that it is standalone. This allows us to freely delete the code in tf if preferred. Also update the build dependency to be more explicit. PiperOrigin-RevId: 349305978 Change-Id: Ic49a160037a5a0a77bc8826c597ffd7fbeaa5011 --- tensorflow/python/keras/BUILD | 14 +++- .../keras/initializers/initializers_v2.py | 69 ++++++++++++++++--- .../v2/tensorflow.initializers.-ones.pbtxt | 2 - ...nsorflow.initializers.-random-normal.pbtxt | 2 - ...sorflow.initializers.-random-uniform.pbtxt | 2 - .../v2/tensorflow.initializers.-zeros.pbtxt | 2 - .../v2/tensorflow.initializers.ones.pbtxt | 2 - ...ensorflow.initializers.random_normal.pbtxt | 2 - ...nsorflow.initializers.random_uniform.pbtxt | 2 - .../v2/tensorflow.initializers.zeros.pbtxt | 2 - .../tensorflow.keras.initializers.-ones.pbtxt | 2 - ...ow.keras.initializers.-random-normal.pbtxt | 2 - ...w.keras.initializers.-random-uniform.pbtxt | 2 - ...tensorflow.keras.initializers.-zeros.pbtxt | 2 - .../tensorflow.keras.initializers.ones.pbtxt | 2 - ...low.keras.initializers.random_normal.pbtxt | 2 - ...ow.keras.initializers.random_uniform.pbtxt | 2 - .../tensorflow.keras.initializers.zeros.pbtxt | 2 - 18 files changed, 70 insertions(+), 45 deletions(-) diff --git a/tensorflow/python/keras/BUILD b/tensorflow/python/keras/BUILD index f58a8751a34..ead6aaa107f 100755 --- a/tensorflow/python/keras/BUILD +++ b/tensorflow/python/keras/BUILD @@ -212,8 +212,18 @@ py_library( srcs_version = "PY2AND3", deps = [ ":backend", - "//tensorflow/python:init_ops_v2", - "//tensorflow/python/keras/utils:engine_utils", + "//tensorflow/python:array_ops", + "//tensorflow/python:constant_op", + "//tensorflow/python:dtypes", + "//tensorflow/python:init_ops", + "//tensorflow/python:linalg_ops", + "//tensorflow/python:math_ops", + "//tensorflow/python:random_ops", + "//tensorflow/python:stateless_random_ops", + "//tensorflow/python:tf2", + "//tensorflow/python/keras/utils:generic_utils", + "//tensorflow/python/keras/utils:tf_inspect", + "//tensorflow/python/util:tf_export", ], ) diff --git a/tensorflow/python/keras/initializers/initializers_v2.py b/tensorflow/python/keras/initializers/initializers_v2.py index e01d2a6645c..72b14d4fcb5 100644 --- a/tensorflow/python/keras/initializers/initializers_v2.py +++ b/tensorflow/python/keras/initializers/initializers_v2.py @@ -26,7 +26,6 @@ from tensorflow.python.framework import dtypes from tensorflow.python.keras import backend from tensorflow.python.ops import array_ops from tensorflow.python.ops import gen_linalg_ops -from tensorflow.python.ops import init_ops_v2 from tensorflow.python.ops import linalg_ops from tensorflow.python.ops import math_ops from tensorflow.python.ops import random_ops @@ -120,7 +119,7 @@ class Initializer(object): @keras_export('keras.initializers.Zeros', 'keras.initializers.zeros', v1=[]) -class Zeros(init_ops_v2.Zeros, Initializer): +class Zeros(Initializer): """Initializer that generates tensors initialized to 0. Also available via the shortcut function `tf.keras.initializers.zeros`. @@ -147,11 +146,17 @@ class Zeros(init_ops_v2.Zeros, Initializer): (via `tf.keras.backend.set_floatx(float_dtype)`). **kwargs: Additional keyword arguments. """ - return super(Zeros, self).__call__(shape, dtype=_get_dtype(dtype), **kwargs) + _validate_kwargs(self.__class__.__name__, kwargs) + dtype = _get_dtype(dtype) + if not dtype.is_numpy_compatible or dtype == dtypes.string: + raise ValueError('Expected numeric or boolean dtype, got %s.' % dtype) + if _PARTITION_SHAPE in kwargs: + shape = kwargs[_PARTITION_SHAPE] + return array_ops.zeros(shape, dtype) @keras_export('keras.initializers.Ones', 'keras.initializers.ones', v1=[]) -class Ones(init_ops_v2.Ones, Initializer): +class Ones(Initializer): """Initializer that generates tensors initialized to 1. Also available via the shortcut function `tf.keras.initializers.ones`. @@ -178,7 +183,13 @@ class Ones(init_ops_v2.Ones, Initializer): (via `tf.keras.backend.set_floatx(float_dtype)`). **kwargs: Additional keyword arguments. """ - return super(Ones, self).__call__(shape, dtype=_get_dtype(dtype), **kwargs) + _validate_kwargs(self.__class__.__name__, kwargs) + dtype = _get_dtype(dtype) + if not dtype.is_numpy_compatible or dtype == dtypes.string: + raise ValueError('Expected numeric or boolean dtype, got %s.' % dtype) + if _PARTITION_SHAPE in kwargs: + shape = kwargs[_PARTITION_SHAPE] + return array_ops.ones(shape, dtype) @keras_export('keras.initializers.Constant', @@ -232,7 +243,7 @@ class Constant(Initializer): @keras_export('keras.initializers.RandomUniform', 'keras.initializers.random_uniform', v1=[]) -class RandomUniform(init_ops_v2.RandomUniform, Initializer): +class RandomUniform(Initializer): """Initializer that generates tensors with a uniform distribution. Also available via the shortcut function @@ -257,6 +268,12 @@ class RandomUniform(init_ops_v2.RandomUniform, Initializer): always produce the same random tensor for a given shape and dtype. """ + def __init__(self, minval=-0.05, maxval=0.05, seed=None): + self.minval = minval + self.maxval = maxval + self.seed = seed + self._random_generator = _RandomGenerator(seed) + def __call__(self, shape, dtype=None, **kwargs): """Returns a tensor object initialized as specified by the initializer. @@ -269,14 +286,27 @@ class RandomUniform(init_ops_v2.RandomUniform, Initializer): (via `tf.keras.backend.set_floatx(float_dtype)`). **kwargs: Additional keyword arguments. """ - return super(RandomUniform, self).__call__( - shape, dtype=_get_dtype(dtype), **kwargs) + _validate_kwargs(self.__class__.__name__, kwargs) + dtype = _get_dtype(dtype) + if not dtype.is_floating and not dtype.is_integer: + raise ValueError('Expected float or integer dtype, got %s.' % dtype) + if _PARTITION_SHAPE in kwargs: + shape = kwargs[_PARTITION_SHAPE] + return self._random_generator.random_uniform(shape, self.minval, + self.maxval, dtype) + + def get_config(self): + return { + 'minval': self.minval, + 'maxval': self.maxval, + 'seed': self.seed + } @keras_export('keras.initializers.RandomNormal', 'keras.initializers.random_normal', v1=[]) -class RandomNormal(init_ops_v2.RandomNormal, Initializer): +class RandomNormal(Initializer): """Initializer that generates tensors with a normal distribution. Also available via the shortcut function @@ -301,6 +331,12 @@ class RandomNormal(init_ops_v2.RandomNormal, Initializer): always produce the same random tensor for a given shape and dtype. """ + def __init__(self, mean=0.0, stddev=0.05, seed=None): + self.mean = mean + self.stddev = stddev + self.seed = seed + self._random_generator = _RandomGenerator(seed) + def __call__(self, shape, dtype=None, **kwargs): """Returns a tensor object initialized to random normal values. @@ -312,8 +348,19 @@ class RandomNormal(init_ops_v2.RandomNormal, Initializer): `tf.keras.backend.set_floatx(float_dtype)`) **kwargs: Additional keyword arguments. """ - return super(RandomNormal, self).__call__( - shape, dtype=_get_dtype(dtype), **kwargs) + _validate_kwargs(self.__class__.__name__, kwargs) + dtype = _assert_float_dtype(_get_dtype(dtype)) + if _PARTITION_SHAPE in kwargs: + shape = kwargs[_PARTITION_SHAPE] + return self._random_generator.random_normal(shape, self.mean, self.stddev, + dtype) + + def get_config(self): + return { + 'mean': self.mean, + 'stddev': self.stddev, + 'seed': self.seed + } @keras_export('keras.initializers.TruncatedNormal', diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-ones.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-ones.pbtxt index ad86af8e06b..0db972c902e 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-ones.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-ones.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.Ones" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-normal.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-normal.pbtxt index aab2d0c5916..2b5776b20ef 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-normal.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-normal.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.RandomNormal" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-uniform.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-uniform.pbtxt index 3952a353150..b3e86ba777a 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-uniform.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-random-uniform.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.RandomUniform" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-zeros.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-zeros.pbtxt index 45a1535e052..08a1a80de0d 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.-zeros.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.-zeros.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.Zeros" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.ones.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.ones.pbtxt index 9c9024bd203..16f077f0ef1 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.ones.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.ones.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.ones" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_normal.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_normal.pbtxt index 3cc237e5c91..862ad9335e3 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_normal.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_normal.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.random_normal" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_uniform.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_uniform.pbtxt index ab6f955984e..49f8431b56e 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_uniform.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.random_uniform.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.random_uniform" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.initializers.zeros.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.initializers.zeros.pbtxt index dc75f07fca9..467b2e3af49 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.initializers.zeros.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.initializers.zeros.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.initializers.zeros" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-ones.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-ones.pbtxt index 43dee054425..be1e9bc59f5 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-ones.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-ones.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.Ones" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-normal.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-normal.pbtxt index 8d165faa6c8..b2d675b5224 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-normal.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-normal.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.RandomNormal" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-uniform.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-uniform.pbtxt index a843a1e3cfc..513ac89d5c4 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-uniform.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-random-uniform.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.RandomUniform" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-zeros.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-zeros.pbtxt index 1afb930ec53..0099a64ff46 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-zeros.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.-zeros.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.Zeros" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.ones.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.ones.pbtxt index ade249eedbe..14f2451847c 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.ones.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.ones.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.ones" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_normal.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_normal.pbtxt index 75f754cc00c..e3fb9636460 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_normal.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_normal.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.random_normal" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_uniform.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_uniform.pbtxt index 7541b5eddc3..b79f374e9bf 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_uniform.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.random_uniform.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.random_uniform" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method { diff --git a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.zeros.pbtxt b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.zeros.pbtxt index de923f98977..fc2bbae6c7c 100644 --- a/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.zeros.pbtxt +++ b/tensorflow/tools/api/golden/v2/tensorflow.keras.initializers.zeros.pbtxt @@ -1,8 +1,6 @@ path: "tensorflow.keras.initializers.zeros" tf_class { is_instance: "" - is_instance: "" - is_instance: "" is_instance: "" is_instance: "" member_method {