diff options
author | Asim Shankar <ashankar@google.com> | 2016-12-01 08:21:49 -0800 |
---|---|---|
committer | TensorFlower Gardener <gardener@tensorflow.org> | 2016-12-01 08:33:33 -0800 |
commit | afb3e3e1b26e33b52fc2e7b6516b0f6e3f3efdd7 (patch) | |
tree | 2cdb554e15fecd62d151ad3e04300b70a160c9e6 | |
parent | f75037d04f14062d56e1b6ebb29ac0c5ec9c4b59 (diff) |
Switch FIXME to TODO
Change: 140733125
-rw-r--r-- | tensorflow/contrib/layers/python/layers/layers.py | 51 | ||||
-rw-r--r-- | tensorflow/contrib/layers/python/layers/layers_test.py | 12 | ||||
-rw-r--r-- | tensorflow/core/common_runtime/function_test.cc | 2 | ||||
-rw-r--r-- | tensorflow/core/framework/function.cc | 9 | ||||
-rw-r--r-- | tensorflow/core/framework/function_test.cc | 18 | ||||
-rw-r--r-- | tensorflow/python/framework/function.py | 1 | ||||
-rw-r--r-- | tensorflow/python/layers/core.py | 54 | ||||
-rw-r--r-- | tensorflow/python/layers/core_test.py | 176 | ||||
-rw-r--r-- | tensorflow/python/layers/layers.py | 3 |
9 files changed, 173 insertions, 153 deletions
diff --git a/tensorflow/contrib/layers/python/layers/layers.py b/tensorflow/contrib/layers/python/layers/layers.py index 121fb3a094..022212429b 100644 --- a/tensorflow/contrib/layers/python/layers/layers.py +++ b/tensorflow/contrib/layers/python/layers/layers.py @@ -800,15 +800,12 @@ def convolution(inputs, if data_format not in [None, 'NWC', 'NCW', 'NHWC', 'NCHW', 'NDHWC']: raise ValueError('Invalid data_format: %r' % (data_format,)) - def _layer_variable_getter(*args, **kwargs): - rename = {'bias': 'biases', - 'kernel': 'weights'} - kwargs['rename'] = rename - return _model_variable_getter(*args, **kwargs) + layer_variable_getter = _build_variable_getter( + {'bias': 'biases', 'kernel': 'weights'}) with variable_scope.variable_scope( scope, 'Conv', [inputs], reuse=reuse, - custom_getter=_layer_variable_getter) as sc: + custom_getter=layer_variable_getter) as sc: inputs = ops.convert_to_tensor(inputs) input_rank = inputs.get_shape().ndims @@ -1029,15 +1026,12 @@ def convolution2d_transpose( ValueError: if `data_format` is neither `NHWC` nor `NCHW`. ValueError: if `C` dimension of `inputs` is None. """ - def _layer_variable_getter(*args, **kwargs): - rename = {'bias': 'biases', - 'kernel': 'weights'} - kwargs['rename'] = rename - return _model_variable_getter(*args, **kwargs) + layer_variable_getter = _build_variable_getter( + {'bias': 'biases', 'kernel': 'weights'}) with variable_scope.variable_scope( scope, 'Conv2d_transpose', [inputs], reuse=reuse, - custom_getter=_layer_variable_getter) as sc: + custom_getter=layer_variable_getter) as sc: if data_format not in (DATA_FORMAT_NCHW, DATA_FORMAT_NHWC): raise ValueError('data_format has to be either NCHW or NHWC.') @@ -1240,6 +1234,18 @@ def _model_variable_getter(getter, name, shape=None, dtype=None, custom_getter=getter) +def _build_variable_getter(rename): + """Build a model variable getter that respects scope getter and renames.""" + # Respect current getter, if one is set. + current_custom_getter = variable_scope.get_variable_scope().custom_getter + def layer_variable_getter(getter, *args, **kwargs): + if current_custom_getter is not None: + getter = functools.partial(current_custom_getter, getter) + kwargs['rename'] = rename + return _model_variable_getter(getter, *args, **kwargs) + return layer_variable_getter + + def _add_variable_to_collections(variable, collections_set, collections_name): """Adds variable (or all its parts) to all collections with that name.""" collections = utils.get_variable_collections( @@ -1314,16 +1320,13 @@ def fully_connected(inputs, if not (isinstance(num_outputs, int) or isinstance(num_outputs, long)): raise ValueError('num_outputs should be int or long, got %s.', num_outputs) - def _layer_variable_getter(*args, **kwargs): - rename = {'bias': 'biases'} - kwargs['rename'] = rename - return _model_variable_getter(*args, **kwargs) + layer_variable_getter = _build_variable_getter({'bias': 'biases'}) with variable_scope.variable_scope( scope, 'fully_connected', [inputs], - reuse=reuse, custom_getter=_layer_variable_getter) as sc: + reuse=reuse, custom_getter=layer_variable_getter) as sc: inputs = ops.convert_to_tensor(inputs) - layer = core_layers.FullyConnected( + layer = core_layers.Dense( units=num_outputs, activation=None, use_bias=not normalizer_fn and biases_initializer, @@ -1719,16 +1722,14 @@ def separable_convolution2d( Returns: A `Tensor` representing the output of the operation. """ - def _layer_variable_getter(*args, **kwargs): - rename = {'bias': 'biases', - 'depthwise_kernel': 'depthwise_weights', - 'pointwise_kernel': 'pointwise_weights'} - kwargs['rename'] = rename - return _model_variable_getter(*args, **kwargs) + layer_variable_getter = _build_variable_getter( + {'bias': 'biases', + 'depthwise_kernel': 'depthwise_weights', + 'pointwise_kernel': 'pointwise_weights'}) with variable_scope.variable_scope( scope, 'SeparableConv2d', [inputs], reuse=reuse, - custom_getter=_layer_variable_getter) as sc: + custom_getter=layer_variable_getter) as sc: inputs = ops.convert_to_tensor(inputs) if num_outputs is not None: diff --git a/tensorflow/contrib/layers/python/layers/layers_test.py b/tensorflow/contrib/layers/python/layers/layers_test.py index 3b5b5e60c6..4715f05c78 100644 --- a/tensorflow/contrib/layers/python/layers/layers_test.py +++ b/tensorflow/contrib/layers/python/layers/layers_test.py @@ -279,6 +279,18 @@ class ConvolutionTest(tf.test.TestCase): biases = tf.contrib.framework.get_variables_by_name('biases')[0] self.assertListEqual(biases.get_shape().as_list(), [64]) + def testFullyConvWithCustomGetter(self): + height, width = 7, 9 + with self.test_session(): + called = [0] + def custom_getter(getter, *args, **kwargs): + called[0] += 1 + return getter(*args, **kwargs) + with tf.variable_scope('test', custom_getter=custom_getter): + images = tf.random_uniform((5, height, width, 32), seed=1) + tf.contrib.layers.convolution2d(images, 64, images.get_shape()[1:3]) + self.assertEqual(called[0], 2) # Custom getter called twice. + def testCreateVerticalConv(self): height, width = 7, 9 with self.test_session(): diff --git a/tensorflow/core/common_runtime/function_test.cc b/tensorflow/core/common_runtime/function_test.cc index 523547b4eb..0f63e41957 100644 --- a/tensorflow/core/common_runtime/function_test.cc +++ b/tensorflow/core/common_runtime/function_test.cc @@ -389,7 +389,7 @@ TEST_F(FunctionLibraryRuntimeTest, ManySwapsOld) { } // Like the above test, but using NodeDefs in the FunctionDef. -TEST_F(FunctionLibraryRuntimeTest, ManySwapsNodeDef) { +TEST_F(FunctionLibraryRuntimeTest, DISABLED_ManySwapsNodeDef) { auto func = FDH::Create( // Creates a FunctionDef using NodeDefs // Name "ManySwapsNodeDef", diff --git a/tensorflow/core/framework/function.cc b/tensorflow/core/framework/function.cc index 8874e99078..134bd4fadb 100644 --- a/tensorflow/core/framework/function.cc +++ b/tensorflow/core/framework/function.cc @@ -169,7 +169,7 @@ typedef std::unordered_map<string, NameInfoItem> NameInfoIndex; Status AddArgName(NameInfoIndex* name_info, const string& arg, const NameInfoItem& item) { if (!name_info->insert({arg, item}).second) { - return errors::InvalidArgument("Duplicated arg name."); + return errors::InvalidArgument("Duplicated arg name: ", arg); } return Status::OK(); } @@ -206,7 +206,7 @@ Status BuildInputArgIndex(const OpDef::ArgDef& arg_def, Status AddRetName(NameInfoIndex* name_info, const string& ret, const NameInfoItem& item) { if (!name_info->insert({ret, item}).second) { - return errors::InvalidArgument("Duplicated ret name."); + return errors::InvalidArgument("Duplicated ret name: ", ret); } return Status::OK(); } @@ -741,6 +741,8 @@ Status InstantiateFunction(const FunctionDef& fdef, const InstantiateAttrValueMap& attr_values, GetFunctionSignature get_function, InstantiationResult* result) { + VLOG(3) << "Instantiation Function: " << Print(fdef); + const OpDef& sig = fdef.signature(); GraphDef* gdef = &result->gdef; gdef->Clear(); @@ -770,7 +772,8 @@ Status InstantiateFunction(const FunctionDef& fdef, // Makes a copy of all attrs in fdef and substitutes placeholders. // After this step, every attr is bound to a concrete value. std::vector<InstantiateAttrValueMap> node_attrs; - if (fdef.node_def_size() > 0) { + if (false && fdef.node_def_size() > 0) { + // TODO(josh11b): enable this branch. node_attrs.resize(fdef.node_def_size()); for (int i = 0; i < fdef.node_def_size(); ++i) { for (auto attr : fdef.node_def(i).attr()) { diff --git a/tensorflow/core/framework/function_test.cc b/tensorflow/core/framework/function_test.cc index eb5aa9a534..e9e7bbf5b8 100644 --- a/tensorflow/core/framework/function_test.cc +++ b/tensorflow/core/framework/function_test.cc @@ -91,7 +91,7 @@ SquarePlusOne[T:{float, double, int32, int64}](x:T) -> (y:T) { EXPECT_EQ(DebugString(result.gdef), e2); } -TEST(TFunc, SquarePlusOneNodeDef) { +TEST(TFunc, DISABLED_SquarePlusOneNodeDef) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "SquarePlusOne", @@ -137,7 +137,7 @@ SquarePlusOne[T:{float, double, int32, int64}](x:T) -> (y:T) { EXPECT_EQ(DebugString(result.gdef), e2); } -TEST(TFunc, ControlDepNodeDef) { +TEST(TFunc, DISABLED_ControlDepNodeDef) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "ControlDep", @@ -224,7 +224,7 @@ BackCompat() -> (y:float) { EXPECT_EQ(DebugString(result.gdef), e2); } -TEST(TFunc, MissingTypeAttrNodeDef) { +TEST(TFunc, DISABLED_MissingTypeAttrNodeDef) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "BackCompat", @@ -262,7 +262,7 @@ BackCompat() -> (y:float) { EXPECT_EQ(DebugString(result.gdef), e2); } -TEST(TFunc, NTimesTNodeDef) { +TEST(TFunc, DISABLED_NTimesTNodeDef) { // Note that the equivalent FunctionDef using FunctionDef::Node requires // using a _ListToArray to package up the two inputs to AddN as a single // N*T edge. @@ -777,7 +777,7 @@ TEST(InstantiateErrors, TypeList_Missing_Arg) { "arg[1] is not found"); } -TEST(InstantiateErrors, NodeDef_TooManyInputs) { +TEST(InstantiateErrors, DISABLED_NodeDef_TooManyInputs) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "TooManyInputs", @@ -798,7 +798,7 @@ TEST(InstantiateErrors, NodeDef_TooManyInputs) { "Expected input[2] == 'x' to be a control input."); } -TEST(InstantiateErrors, NodeDef_TooFewInputs) { +TEST(InstantiateErrors, DISABLED_NodeDef_TooFewInputs) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "TooFewInputs", @@ -819,7 +819,7 @@ TEST(InstantiateErrors, NodeDef_TooFewInputs) { "Attempt to access beyond input size: 2 >= 2"); } -TEST(InstantiateErrors, NodeDef_TooManyInputsFromArray1) { +TEST(InstantiateErrors, DISABLED_NodeDef_TooManyInputsFromArray1) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "TooManyInputsFromArray", @@ -847,7 +847,7 @@ TEST(InstantiateErrors, NodeDef_TooManyInputsFromArray1) { "Expected input[1] == 'y' to be a control input."); } -TEST(InstantiateErrors, NodeDef_TooManyInputsFromArray2) { +TEST(InstantiateErrors, DISABLED_NodeDef_TooManyInputsFromArray2) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "TooManyInputsFromArray", @@ -875,7 +875,7 @@ TEST(InstantiateErrors, NodeDef_TooManyInputsFromArray2) { "Input a:output too long for inputs"); } -TEST(InstantiateErrors, NodeDef_TypeMismatch) { +TEST(InstantiateErrors, DISABLED_NodeDef_TypeMismatch) { auto fdef = FDH::Create( // Create a FunctionDef using NodeDefs. // Name "TypeMismatch", diff --git a/tensorflow/python/framework/function.py b/tensorflow/python/framework/function.py index 9460b2a474..1fa52a7138 100644 --- a/tensorflow/python/framework/function.py +++ b/tensorflow/python/framework/function.py @@ -411,6 +411,7 @@ class _FuncGraph(ops.Graph): self.extra_vars = [] def getvar(self, + getter, name, shape=None, dtype=None, diff --git a/tensorflow/python/layers/core.py b/tensorflow/python/layers/core.py index 7641339144..f72e54b207 100644 --- a/tensorflow/python/layers/core.py +++ b/tensorflow/python/layers/core.py @@ -14,7 +14,7 @@ # ============================================================================= # pylint: disable=unused-import,g-bad-import-order -"""Contains the core layers: FullyConnected, [Flatten, Dropout]. +"""Contains the core layers: Dense, Dropout. Also contains their functional aliases. """ @@ -39,11 +39,8 @@ from tensorflow.python.ops import control_flow_ops from tensorflow.python.layers import base -class FullyConnected(base._Layer): # pylint: disable=protected-access - """Fully-connected layer class. - - WARNING: Do not use this class unless you know what you are doing: - the API is subject to future changes. +class Dense(base._Layer): # pylint: disable=protected-access + """Densely-connected layer class. This layer implements the operation `outputs = activation(inputs.w + b)` Where `activation` is the activation function passed as the `activation` @@ -94,8 +91,7 @@ class FullyConnected(base._Layer): # pylint: disable=protected-access trainable=True, name=None, **kwargs): - super(FullyConnected, self).__init__(trainable=trainable, name=name, - **kwargs) + super(Dense, self).__init__(trainable=trainable, name=name, **kwargs) self.units = units self.activation = activation self.use_bias = use_bias @@ -108,11 +104,11 @@ class FullyConnected(base._Layer): # pylint: disable=protected-access def build(self, input_shape): input_shape = tensor_shape.TensorShape(input_shape) if input_shape.ndims is None: - raise ValueError('Inputs to `FullyConnected` should have known rank.') + raise ValueError('Inputs to `Dense` should have known rank.') if len(input_shape) < 2: - raise ValueError('Inputs to `FullyConnected` should have rank >= 2.') + raise ValueError('Inputs to `Dense` should have rank >= 2.') if input_shape[-1].value is None: - raise ValueError('The last dimension of the inputs to `FullyConnected` ' + raise ValueError('The last dimension of the inputs to `Dense` ' 'should be defined. Found `None`.') # Note that we set `trainable=True` because this is a trainable # weight of the layer. If the layer is not trainable @@ -159,7 +155,7 @@ class FullyConnected(base._Layer): # pylint: disable=protected-access return outputs -def fully_connected( +def dense( inputs, units, activation=None, use_bias=True, @@ -171,7 +167,7 @@ def fully_connected( trainable=True, name=None, reuse=False): - """Functional interface for the fully connected layer. + """Functional interface for the densely-connected layer. This layer implements the operation `outputs = activation(inputs.w + b)` Where `activation` is the activation function passed as the `activation` @@ -201,19 +197,19 @@ def fully_connected( Returns: Output tensor. """ - layer = FullyConnected(units, - activation=activation, - use_bias=use_bias, - weights_initializer=weights_initializer, - bias_initializer=bias_initializer, - weights_regularizer=weights_regularizer, - bias_regularizer=bias_regularizer, - activity_regularizer=activity_regularizer, - trainable=trainable, - name=name, - dtype=inputs.dtype.base_dtype, - _scope=name, - _reuse_weights=reuse) + layer = Dense(units, + activation=activation, + use_bias=use_bias, + weights_initializer=weights_initializer, + bias_initializer=bias_initializer, + weights_regularizer=weights_regularizer, + bias_regularizer=bias_regularizer, + activity_regularizer=activity_regularizer, + trainable=trainable, + name=name, + dtype=inputs.dtype.base_dtype, + _scope=name, + _reuse_weights=reuse) return layer.apply(inputs) @@ -303,3 +299,9 @@ def dropout(inputs, """ layer = Dropout(rate, noise_shape=noise_shape, seed=seed, name=name) return layer.apply(inputs, training=training) + + +# Aliases + +FullyConnected = Dense +fully_connected = dense diff --git a/tensorflow/python/layers/core_test.py b/tensorflow/python/layers/core_test.py index 9d66ed160a..caf43e7128 100644 --- a/tensorflow/python/layers/core_test.py +++ b/tensorflow/python/layers/core_test.py @@ -24,193 +24,193 @@ import tensorflow as tf from tensorflow.python.layers import core as core_layers -class FullyConnectedTest(tf.test.TestCase): - - def testFCProperties(self): - fc = core_layers.FullyConnected(2, activation=tf.nn.relu, name='fc') - self.assertEqual(fc.units, 2) - self.assertEqual(fc.activation, tf.nn.relu) - self.assertEqual(fc.weights_regularizer, None) - self.assertEqual(fc.bias_regularizer, None) - self.assertEqual(fc.activity_regularizer, None) - self.assertEqual(fc.use_bias, True) - self.assertEqual(fc.name, 'fc') +class DenseTest(tf.test.TestCase): + + def testDenseProperties(self): + dense = core_layers.Dense(2, activation=tf.nn.relu, name='my_dense') + self.assertEqual(dense.units, 2) + self.assertEqual(dense.activation, tf.nn.relu) + self.assertEqual(dense.weights_regularizer, None) + self.assertEqual(dense.bias_regularizer, None) + self.assertEqual(dense.activity_regularizer, None) + self.assertEqual(dense.use_bias, True) + self.assertEqual(dense.name, 'my_dense') # Test auto-naming - fc = core_layers.FullyConnected(2, activation=tf.nn.relu) - self.assertEqual(fc.name, 'fully_connected') - fc = core_layers.FullyConnected(2, activation=tf.nn.relu) - self.assertEqual(fc.name, 'fully_connected_1') + dense = core_layers.Dense(2, activation=tf.nn.relu) + self.assertEqual(dense.name, 'dense') + dense = core_layers.Dense(2, activation=tf.nn.relu) + self.assertEqual(dense.name, 'dense_1') def testCall(self): - fc = core_layers.FullyConnected(2, activation=tf.nn.relu, name='fc') + dense = core_layers.Dense(2, activation=tf.nn.relu, name='my_dense') inputs = tf.random_uniform((5, 2), seed=1) - _ = fc(inputs) - self.assertListEqual(fc.weights, [fc.w, fc.bias]) - self.assertListEqual(fc.trainable_weights, [fc.w, fc.bias]) - self.assertListEqual(fc.non_trainable_weights, []) - self.assertListEqual(fc._trainable_weights, [fc.w, fc.bias]) - self.assertListEqual(fc._non_trainable_weights, []) + _ = dense(inputs) + self.assertListEqual(dense.weights, [dense.w, dense.bias]) + self.assertListEqual(dense.trainable_weights, [dense.w, dense.bias]) + self.assertListEqual(dense.non_trainable_weights, []) + self.assertListEqual(dense._trainable_weights, [dense.w, dense.bias]) + self.assertListEqual(dense._non_trainable_weights, []) self.assertEqual( len(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)), 2) - self.assertEqual(fc.w.name, 'fc/weights:0') - self.assertEqual(fc.bias.name, 'fc/bias:0') + self.assertEqual(dense.w.name, 'my_dense/weights:0') + self.assertEqual(dense.bias.name, 'my_dense/bias:0') def testNoBias(self): - fc = core_layers.FullyConnected(2, use_bias=False, name='fc') + dense = core_layers.Dense(2, use_bias=False, name='my_dense') inputs = tf.random_uniform((5, 2), seed=1) - _ = fc(inputs) - self.assertListEqual(fc.weights, [fc.w]) - self.assertListEqual(fc.trainable_weights, [fc.w]) - self.assertListEqual(fc.non_trainable_weights, []) + _ = dense(inputs) + self.assertListEqual(dense.weights, [dense.w]) + self.assertListEqual(dense.trainable_weights, [dense.w]) + self.assertListEqual(dense.non_trainable_weights, []) self.assertEqual( len(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)), 1) - self.assertEqual(fc.w.name, 'fc/weights:0') - self.assertEqual(fc.bias, None) + self.assertEqual(dense.w.name, 'my_dense/weights:0') + self.assertEqual(dense.bias, None) def testNonTrainable(self): - fc = core_layers.FullyConnected(2, trainable=False, name='fc') + dense = core_layers.Dense(2, trainable=False, name='my_dense') inputs = tf.random_uniform((5, 2), seed=1) - _ = fc(inputs) - self.assertListEqual(fc.weights, [fc.w, fc.bias]) - self.assertListEqual(fc.non_trainable_weights, [fc.w, fc.bias]) - self.assertListEqual(fc.trainable_weights, []) - self.assertListEqual(fc._trainable_weights, [fc.w, fc.bias]) - self.assertListEqual(fc._non_trainable_weights, []) + _ = dense(inputs) + self.assertListEqual(dense.weights, [dense.w, dense.bias]) + self.assertListEqual(dense.non_trainable_weights, [dense.w, dense.bias]) + self.assertListEqual(dense.trainable_weights, []) + self.assertListEqual(dense._trainable_weights, [dense.w, dense.bias]) + self.assertListEqual(dense._non_trainable_weights, []) self.assertEqual( len(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)), 0) def testOutputShape(self): - fc = core_layers.FullyConnected(7, activation=tf.nn.relu, name='fc') + dense = core_layers.Dense(7, activation=tf.nn.relu, name='my_dense') inputs = tf.random_uniform((5, 3), seed=1) - outputs = fc.apply(inputs) + outputs = dense.apply(inputs) self.assertEqual(outputs.get_shape().as_list(), [5, 7]) inputs = tf.random_uniform((5, 2, 3), seed=1) - outputs = fc(inputs) + outputs = dense(inputs) self.assertEqual(outputs.get_shape().as_list(), [5, 2, 7]) inputs = tf.random_uniform((1, 2, 4, 3), seed=1) - outputs = fc.apply(inputs) + outputs = dense.apply(inputs) self.assertEqual(outputs.get_shape().as_list(), [1, 2, 4, 7]) def testCallOnPlaceHolder(self): inputs = tf.placeholder(dtype=tf.float32) - fc = core_layers.FullyConnected(4, name='fc') + dense = core_layers.Dense(4, name='my_dense') with self.assertRaises(ValueError): - fc(inputs) + dense(inputs) inputs = tf.placeholder(dtype=tf.float32, shape=[None, None]) - fc = core_layers.FullyConnected(4, name='fc') + dense = core_layers.Dense(4, name='my_dense') with self.assertRaises(ValueError): - fc(inputs) + dense(inputs) inputs = tf.placeholder(dtype=tf.float32, shape=[None, None, None]) - fc = core_layers.FullyConnected(4, name='fc') + dense = core_layers.Dense(4, name='my_dense') with self.assertRaises(ValueError): - fc(inputs) + dense(inputs) inputs = tf.placeholder(dtype=tf.float32, shape=[None, 3]) - fc = core_layers.FullyConnected(4, name='fc') - fc(inputs) + dense = core_layers.Dense(4, name='my_dense') + dense(inputs) inputs = tf.placeholder(dtype=tf.float32, shape=[None, None, 3]) - fc = core_layers.FullyConnected(4, name='fc') - fc(inputs) + dense = core_layers.Dense(4, name='my_dense') + dense(inputs) def testActivation(self): - fc = core_layers.FullyConnected(2, activation=tf.nn.relu, name='fc1') + dense = core_layers.Dense(2, activation=tf.nn.relu, name='dense1') inputs = tf.random_uniform((5, 3), seed=1) - outputs = fc(inputs) - self.assertEqual(outputs.op.name, 'fc1/Relu') + outputs = dense(inputs) + self.assertEqual(outputs.op.name, 'dense1/Relu') - fc = core_layers.FullyConnected(2, name='fc2') + dense = core_layers.Dense(2, name='dense2') inputs = tf.random_uniform((5, 3), seed=1) - outputs = fc(inputs) - self.assertEqual(outputs.op.name, 'fc2/BiasAdd') + outputs = dense(inputs) + self.assertEqual(outputs.op.name, 'dense2/BiasAdd') def testActivityRegularizer(self): regularizer = lambda x: tf.reduce_sum(x) * 1e-3 - fc = core_layers.FullyConnected(2, name='fc', - activity_regularizer=regularizer) + dense = core_layers.Dense(2, name='my_dense', + activity_regularizer=regularizer) inputs = tf.random_uniform((5, 3), seed=1) - _ = fc(inputs) + _ = dense(inputs) loss_keys = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) self.assertEqual(len(loss_keys), 1) - self.assertListEqual(fc.losses, loss_keys) + self.assertListEqual(dense.losses, loss_keys) def testWeightsRegularizer(self): regularizer = lambda x: tf.reduce_sum(x) * 1e-3 - fc = core_layers.FullyConnected(2, name='fc', - weights_regularizer=regularizer) + dense = core_layers.Dense(2, name='my_dense', + weights_regularizer=regularizer) inputs = tf.random_uniform((5, 3), seed=1) - _ = fc(inputs) + _ = dense(inputs) loss_keys = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) self.assertEqual(len(loss_keys), 1) - self.assertListEqual(fc.losses, loss_keys) + self.assertListEqual(dense.losses, loss_keys) def testBiasRegularizer(self): regularizer = lambda x: tf.reduce_sum(x) * 1e-3 - fc = core_layers.FullyConnected(2, name='fc', - bias_regularizer=regularizer) + dense = core_layers.Dense(2, name='my_dense', + bias_regularizer=regularizer) inputs = tf.random_uniform((5, 3), seed=1) - _ = fc(inputs) + _ = dense(inputs) loss_keys = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES) self.assertEqual(len(loss_keys), 1) - self.assertListEqual(fc.losses, loss_keys) + self.assertListEqual(dense.losses, loss_keys) - def testFunctionalFC(self): + def testFunctionalDense(self): inputs = tf.random_uniform((5, 3), seed=1) - outputs = core_layers.fully_connected( - inputs, 2, activation=tf.nn.relu, name='fc') + outputs = core_layers.dense( + inputs, 2, activation=tf.nn.relu, name='my_dense') self.assertEqual( len(tf.get_collection(tf.GraphKeys.TRAINABLE_VARIABLES)), 2) - self.assertEqual(outputs.op.name, 'fc/Relu') + self.assertEqual(outputs.op.name, 'my_dense/Relu') self.assertEqual(outputs.get_shape().as_list(), [5, 2]) - def testFunctionalFCTwice(self): + def testFunctionalDenseTwice(self): inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2) + core_layers.dense(inputs, 2) vars1 = tf.trainable_variables() - core_layers.fully_connected(inputs, 2) + core_layers.dense(inputs, 2) vars2 = tf.trainable_variables() self.assertEqual(len(vars1), 2) self.assertEqual(len(vars2), 4) - def testFunctionalFCTwiceReuse(self): + def testFunctionalDenseTwiceReuse(self): inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2, name='fc') + core_layers.dense(inputs, 2, name='my_dense') vars1 = tf.trainable_variables() - core_layers.fully_connected(inputs, 2, name='fc', reuse=True) + core_layers.dense(inputs, 2, name='my_dense', reuse=True) vars2 = tf.trainable_variables() self.assertEqual(vars1, vars2) - def testFunctionalFCWithCustomGetter(self): + def testFunctionalDenseWithCustomGetter(self): called = [0] def custom_getter(getter, *args, **kwargs): called[0] += 1 return getter(*args, **kwargs) with tf.variable_scope('test', custom_getter=custom_getter): inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2) + core_layers.dense(inputs, 2) self.assertEqual(called[0], 2) - def testFunctionalFCInScope(self): + def testFunctionalDenseInScope(self): with tf.variable_scope('test'): inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2, name='fc') + core_layers.dense(inputs, 2, name='my_dense') var = tf.trainable_variables()[0] - self.assertEqual(var.name, 'test/fc/weights:0') + self.assertEqual(var.name, 'test/my_dense/weights:0') with tf.variable_scope('test1') as scope: inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2, name=scope) + core_layers.dense(inputs, 2, name=scope) var = tf.trainable_variables()[2] self.assertEqual(var.name, 'test1/weights:0') with tf.variable_scope('test2'): inputs = tf.random_uniform((5, 3), seed=1) - core_layers.fully_connected(inputs, 2) + core_layers.dense(inputs, 2) var = tf.trainable_variables()[4] - self.assertEqual(var.name, 'test2/fully_connected/weights:0') + self.assertEqual(var.name, 'test2/dense/weights:0') class DropoutTest(tf.test.TestCase): diff --git a/tensorflow/python/layers/layers.py b/tensorflow/python/layers/layers.py index 1466487164..1ea33da9c8 100644 --- a/tensorflow/python/layers/layers.py +++ b/tensorflow/python/layers/layers.py @@ -31,7 +31,8 @@ from tensorflow.python.util.all_util import remove_undocumented # pylint: disable=g-bad-import-order,unused-import # Core layers. -from tensorflow.python.layers.core import fully_connected +from tensorflow.python.layers.core import dense +from tensorflow.python.layers.core import dropout # pylint: enable=g-bad-import-order,unused-import _allowed_symbols = [] |