Fixed triggering create device multiple times

PiperOrigin-RevId: 158025196
This commit is contained in:
Toby Boyd 2017-06-05 09:52:38 -07:00 committed by TensorFlower Gardener
parent 504a307b74
commit a5909d6432
4 changed files with 30 additions and 71 deletions
tensorflow
contrib/keras/python/keras/layers
python/layers

View File

@ -114,16 +114,19 @@ class Conv2DTest(test.TestCase):
continue
with self.test_session(use_gpu=True):
testing_utils.layer_test(
keras.layers.Conv2D,
kwargs={
'filters': filters,
'kernel_size': kernel_size,
'padding': padding,
'strides': strides,
'data_format': 'channels_first'
},
input_shape=(num_samples, stack_size, num_row, num_col))
# Only runs on GPU with CUDA, channels_first is not supported on CPU.
# TODO(b/62340061): Support channels_first on CPU.
if test.is_gpu_available(cuda_only=True):
testing_utils.layer_test(
keras.layers.Conv2D,
kwargs={
'filters': filters,
'kernel_size': kernel_size,
'padding': padding,
'strides': strides,
'data_format': 'channels_first'
},
input_shape=(num_samples, stack_size, num_row, num_col))
def test_convolution_2d_regularization(self):
# regularizers

View File

@ -100,15 +100,18 @@ class Pooling2DTest(test.TestCase):
'padding': 'valid',
'pool_size': (3, 3)},
input_shape=(3, 5, 6, 4))
testing_utils.layer_test(
keras.layers.AveragePooling2D,
kwargs={
'strides': (1, 1),
'padding': 'valid',
'pool_size': (2, 2),
'data_format': 'channels_first'
},
input_shape=(3, 4, 5, 6))
# Only runs on GPU with CUDA, channels_first is not supported on CPU.
# TODO(b/62340061): Support channels_first on CPU.
if test.is_gpu_available(cuda_only=True):
testing_utils.layer_test(
keras.layers.AveragePooling2D,
kwargs={
'strides': (1, 1),
'padding': 'valid',
'pool_size': (2, 2),
'data_format': 'channels_first'
},
input_shape=(3, 4, 5, 6))
class Pooling3DTest(test.TestCase):

View File

@ -149,39 +149,13 @@ class _Conv(base.Layer):
self.built = True
def call(self, inputs):
if (self.data_format == 'channels_first' and
not framework.test_util.gpu_device_name()):
# `nn.convolution` is not implemented on CPU for `channels_first` format.
# In cases where we are most likely running on CPU using `channels_first`,
# we reshape the inputs to use `channels_last` (and reshape them back
# afterwards). This is a temporary fix; a better solution would be a fix
# at the op level.
# TODO(chollet): remove this when `nn.convolution` is feature-complete.
data_format = 'channels_last'
if self.rank == 1:
inputs = array_ops.transpose(inputs, (0, 2, 1))
elif self.rank == 2:
inputs = array_ops.transpose(inputs, (0, 2, 3, 1))
elif self.rank == 3:
inputs = array_ops.transpose(inputs, (0, 2, 3, 4, 1))
else:
data_format = self.data_format
outputs = nn.convolution(
input=inputs,
filter=self.kernel,
dilation_rate=self.dilation_rate,
strides=self.strides,
padding=self.padding.upper(),
data_format=utils.convert_data_format(data_format,
self.rank + 2))
if (self.data_format == 'channels_first' and
not framework.test_util.gpu_device_name()):
if self.rank == 1:
outputs = array_ops.transpose(outputs, (0, 2, 1))
elif self.rank == 2:
outputs = array_ops.transpose(outputs, (0, 3, 1, 2))
elif self.rank == 3:
outputs = array_ops.transpose(outputs, (0, 4, 1, 2, 3))
data_format=utils.convert_data_format(self.data_format, self.rank + 2))
if self.bias is not None:
if self.data_format == 'channels_first':
@ -202,18 +176,10 @@ class _Conv(base.Layer):
[outputs_shape[0], outputs_shape[1],
outputs_shape[2] * outputs_shape[3],
outputs_shape[4]])
outputs_4d = nn.bias_add(
outputs_4d,
self.bias,
data_format=utils.convert_data_format(self.data_format, 4))
outputs_4d = nn.bias_add(outputs_4d, self.bias, data_format='NCHW')
outputs = array_ops.reshape(outputs_4d, outputs_shape)
else:
outputs = nn.bias_add(
outputs,
self.bias,
data_format=utils.convert_data_format(self.data_format, 4))
# Note that we passed rank=4 because bias_add will only accept
# NHWC and NCWH even if the rank of the inputs is 3 or 5.
outputs = nn.bias_add(outputs, self.bias, data_format='NHWC')
if self.activation is not None:
return self.activation(outputs)

View File

@ -262,16 +262,7 @@ class _Pooling2D(base.Layer):
self.input_spec = base.InputSpec(ndim=4)
def call(self, inputs):
if (self.data_format == 'channels_first' and
not framework.test_util.gpu_device_name()):
# `nn.convolution` is not implemented on CPU for `channels_first` format.
# TODO(chollet): remove this when `nn.convolution` is feature-complete.
data_format = 'channels_last'
inputs = array_ops.transpose(inputs, (0, 2, 3, 1))
else:
data_format = self.data_format
if data_format == 'channels_last':
if self.data_format == 'channels_last':
pool_shape = (1,) + self.pool_size + (1,)
strides = (1,) + self.strides + (1,)
else:
@ -282,11 +273,7 @@ class _Pooling2D(base.Layer):
ksize=pool_shape,
strides=strides,
padding=self.padding.upper(),
data_format=utils.convert_data_format(data_format, 4))
if (self.data_format == 'channels_first' and
not framework.test_util.gpu_device_name()):
outputs = array_ops.transpose(outputs, (0, 3, 1, 2))
data_format=utils.convert_data_format(self.data_format, 4))
return outputs
def _compute_output_shape(self, input_shape):