from tensorflow.python.framework import ops
from tensorflow.python.framework import random_seed
from tensorflow.python.framework import sparse_tensor as sparse_tensor_lib
+from tensorflow.python.framework import tensor_util
from tensorflow.python.keras._impl.keras import backend as K
from tensorflow.python.keras._impl.keras import models
from tensorflow.python.keras._impl.keras import optimizers
from tensorflow.python.keras._impl.keras.engine.base_layer import Layer
from tensorflow.python.keras._impl.keras.engine.network import Network
from tensorflow.python.keras._impl.keras.utils.generic_utils import CustomObjectScope
+from tensorflow.python.ops import check_ops
from tensorflow.python.ops import math_ops
from tensorflow.python.ops import metrics as metrics_module
from tensorflow.python.ops import variables as variables_module
return math_ops.cast(x, K.floatx())
+def _convert_tensor(x):
+ """Create or cast tensor if needed."""
+ if not tensor_util.is_tensor(x):
+ # x is a numpy array
+ x = sparse_tensor_lib.convert_to_tensor_or_sparse_tensor(x)
+ if check_ops.is_numeric_tensor(x):
+ # is_numeric_tensor returns False if provided with a numpy array
+ x = _cast_tensor_to_floatx(x)
+ return x
+
+
def _any_variable_initalized():
"""Check if any variable has been initialized in the Keras model.
if isinstance(estimator_io, (list, tuple)):
# Case currently not supported by most built-in input_fn,
# but it's good to have for sanity
- return [_cast_tensor_to_floatx(x) for x in estimator_io]
+ return [_convert_tensor(x) for x in estimator_io]
elif isinstance(estimator_io, dict):
if is_input:
if keras_model._is_graph_network:
'It needs to match one '
'of the following: %s' % ('input' if is_input else 'output', key,
', '.join(keras_io_names)))
- tensors = [_cast_tensor_to_floatx(estimator_io[io_name])
+ tensors = [_convert_tensor(estimator_io[io_name])
for io_name in keras_io_names]
return tensors
else:
# Plain array.
- return _cast_tensor_to_floatx(estimator_io)
+ return _convert_tensor(estimator_io)
def _in_place_subclassed_model_reset(model):
is_input=False)
else:
target_tensors = [
- _cast_tensor_to_floatx(
- sparse_tensor_lib.convert_to_tensor_or_sparse_tensor(labels))
+ _convert_tensor(labels)
]
if keras_model._is_graph_network:
from tensorflow.python.framework import ops
from tensorflow.python.framework import test_util
from tensorflow.python.keras._impl import keras
+from tensorflow.python.keras._impl.keras import backend as K
from tensorflow.python.keras._impl.keras import testing_utils
from tensorflow.python.keras._impl.keras.applications import mobilenet
from tensorflow.python.keras._impl.keras.optimizers import SGD
def multi_inputs_multi_outputs_model():
- # test multi-input layer
a = keras.layers.Input(shape=(16,), name='input_a')
b = keras.layers.Input(shape=(16,), name='input_b')
+ m = keras.layers.Input(shape=(8,), dtype='bool', name='input_m')
dense = keras.layers.Dense(8, name='dense_1')
+
a_2 = dense(a)
+ # Apply a mask
+ s_2 = keras.layers.Lambda(lambda k:
+ K.switch(k[0], k[1], K.zeros_like(k[1])))([m, a_2])
b_2 = dense(b)
- merged = keras.layers.concatenate([a_2, b_2], name='merge')
+ merged = keras.layers.concatenate([s_2, b_2], name='merge')
c = keras.layers.Dense(3, activation='softmax', name='dense_2')(merged)
d = keras.layers.Dense(2, activation='softmax', name='dense_3')(merged)
- model = keras.models.Model(inputs=[a, b], outputs=[c, d])
+ model = keras.models.Model(inputs=[a, b, m], outputs=[c, d])
model.compile(
loss='categorical_crossentropy',
optimizer='rmsprop',
test_samples=50,
input_shape=(16,),
num_classes=2)
+ np.random.seed(_RANDOM_SEED)
+ (input_m_train, _), (input_m_test, _) = testing_utils.get_test_data(
+ train_samples=_TRAIN_SIZE,
+ test_samples=50,
+ input_shape=(8,),
+ num_classes=2)
+
c_train = keras.utils.to_categorical(c_train)
c_test = keras.utils.to_categorical(c_test)
d_train = keras.utils.to_categorical(d_train)
d_test = keras.utils.to_categorical(d_test)
def train_input_fn():
- input_dict = {'input_a': a_train, 'input_b': b_train}
+ input_dict = {'input_a': a_train, 'input_b': b_train,
+ 'input_m': input_m_train > 0}
output_dict = {'dense_2': c_train, 'dense_3': d_train}
return input_dict, output_dict
def eval_input_fn():
- input_dict = {'input_a': a_test, 'input_b': b_test}
+ input_dict = {'input_a': a_test, 'input_b': b_test,
+ 'input_m': input_m_test > 0}
output_dict = {'dense_2': c_test, 'dense_3': d_test}
return input_dict, output_dict