Implementation of constant.
(
value, dtype, shape, name, verify_shape, allow_broadcast)
| 228 | |
| 229 | |
| 230 | def _constant_impl( |
| 231 | value, dtype, shape, name, verify_shape, allow_broadcast): |
| 232 | """Implementation of constant.""" |
| 233 | ctx = context.context() |
| 234 | if ctx.executing_eagerly(): |
| 235 | t = convert_to_eager_tensor(value, ctx, dtype) |
| 236 | if shape is None: |
| 237 | return t |
| 238 | shape = tensor_shape.as_shape(shape) |
| 239 | if shape == t.shape: |
| 240 | return t |
| 241 | if verify_shape: |
| 242 | raise TypeError("Expected Tensor's shape: %s, got %s." % (tuple(shape), |
| 243 | tuple(t.shape))) |
| 244 | num_t = t.shape.num_elements() |
| 245 | # TODO(josh11b): Implement shape -> eager tensor conversion. |
| 246 | if num_t == shape.num_elements(): |
| 247 | return _eager_reshape(t, shape.as_list(), ctx) |
| 248 | if num_t == 1: |
| 249 | if t.dtype == dtypes.bool: |
| 250 | # We don't have a Fill kernel for bool dtype on GPU. So we first run |
| 251 | # Fill on CPU and then copy to GPU if needed. |
| 252 | with ops.device("/device:CPU:0"): |
| 253 | x = _eager_fill(shape.as_list(), t.cpu(), ctx) |
| 254 | return _eager_identity(x, ctx) |
| 255 | else: |
| 256 | return _eager_fill(shape.as_list(), t, ctx) |
| 257 | raise TypeError("Eager execution of tf.constant with unsupported shape " |
| 258 | "(value has %d elements, shape is %s with %d elements)." % |
| 259 | (num_t, shape, shape.num_elements())) |
| 260 | g = ops.get_default_graph() |
| 261 | tensor_value = attr_value_pb2.AttrValue() |
| 262 | tensor_value.tensor.CopyFrom( |
| 263 | tensor_util.make_tensor_proto( |
| 264 | value, dtype=dtype, shape=shape, verify_shape=verify_shape, |
| 265 | allow_broadcast=allow_broadcast)) |
| 266 | dtype_value = attr_value_pb2.AttrValue(type=tensor_value.tensor.dtype) |
| 267 | const_tensor = g.create_op( |
| 268 | "Const", [], [dtype_value.type], |
| 269 | attrs={"value": tensor_value, |
| 270 | "dtype": dtype_value}, |
| 271 | name=name).outputs[0] |
| 272 | return const_tensor |
| 273 | |
| 274 | |
| 275 | def is_constant(tensor_or_op): |
no test coverage detected