tensorflow:: Tensor
#include <tensor.h>
Representa uma matriz n-dimensional de valores.
Resumo
Construtores e Destruidores | |
---|---|
Tensor () Cria um tensor flutuante de 1 dimensão e elemento 0. | |
Tensor (DataType type, const TensorShape & shape) | |
Tensor (Allocator *a, DataType type, const TensorShape & shape) Cria um tensor com o type e shape de entrada, usando o alocador a para alocar o buffer subjacente. | |
Tensor (Allocator *a, DataType type, const TensorShape & shape, const AllocationAttributes & allocation_attr) Cria um tensor com o type entrada e shape , usando o alocador a e o "allocation_attr" especificado para alocar o buffer subjacente. | |
Tensor (DataType type) Cria um tensor vazio do tipo de dados fornecido. | |
Tensor (float scalar_value) | |
Tensor (double scalar_value) | |
Tensor (int32 scalar_value) | |
Tensor (uint32 scalar_value) | |
Tensor (uint16 scalar_value) | |
Tensor (uint8 scalar_value) | |
Tensor (int16 scalar_value) | |
Tensor (int8 scalar_value) | |
Tensor (string scalar_value) | |
Tensor (complex64 scalar_value) | |
Tensor (complex128 scalar_value) | |
Tensor (int64 scalar_value) | |
Tensor (uint64 scalar_value) | |
Tensor (bool scalar_value) | |
Tensor (qint8 scalar_value) | |
Tensor (quint8 scalar_value) | |
Tensor (qint16 scalar_value) | |
Tensor (quint16 scalar_value) | |
Tensor (qint32 scalar_value) | |
Tensor (bfloat16 scalar_value) | |
Tensor (Eigen::half scalar_value) | |
Tensor (ResourceHandle scalar_value) | |
Tensor (const char *scalar_value) | |
Tensor (const Tensor & other) Copiar construtor. | |
Tensor ( Tensor && other) Mover construtor. | |
~Tensor () |
Funções públicas | |
---|---|
AllocatedBytes () const | size_t |
AsProtoField (TensorProto *proto) const | void Preenche o proto com *this tensor. |
AsProtoTensorContent (TensorProto *proto) const | void |
BitcastFrom (const Tensor & other, DataType dtype, const TensorShape & shape) | Copie o outro tensor para este tensor, reformule-o e reinterprete o tipo de dados do buffer. |
CopyFrom (const Tensor & other, const TensorShape & shape) TF_MUST_USE_RESULT | bool Copie o outro tensor para este tensor e remodele-o. |
DebugString (int num_values) const | string Um resumo legível por humanos do tensor adequado para depuração. |
DebugString () const | string |
DeviceSafeDebugString () const | string |
FillDescription (TensorDescription *description) const | void Preencha o proto TensorDescription com metadados sobre o tensor que são úteis para monitoramento e depuração. |
FromProto (const TensorProto & other) TF_MUST_USE_RESULT | bool Analise other e construa o tensor. |
FromProto (Allocator *a, const TensorProto & other) TF_MUST_USE_RESULT | bool |
IsAligned () const | bool Retorna true se este tensor estiver alinhado. |
IsInitialized () const | bool Se necessário, este tensor foi inicializado? |
IsSameSize (const Tensor & b) const | bool |
NumElements () const | int64 Acessor de conveniência para a forma do tensor. |
SharesBufferWith (const Tensor & b) const | bool |
Slice (int64 dim0_start, int64 dim0_limit) const | Fatie este tensor ao longo da 1ª dimensão. |
SubSlice (int64 index) const | Selecione uma subfatia deste tensor ao longo da 1ª dimensão. |
SummarizeValue (int64 max_entries, bool print_v2) const | string Renderize os primeiros valores max_entries em *this em uma string. |
TotalBytes () const | size_t Retorna o uso de memória estimado desse tensor. |
UnsafeCopyFromInternal (const Tensor & other, DataType dtype, const TensorShape & shape) | void Como BitcastFrom, mas CHECK falhará se quaisquer pré-condições não forem atendidas. |
bit_casted_shaped (gtl::ArraySlice< int64 > new_sizes) | TTypes< T, NDIMS >:: Tensor Retorne os dados do tensor para um Eigen::Tensor com a nova forma especificada em new_sizes e converta para um novo dtype T . |
bit_casted_shaped (gtl::ArraySlice< int64 > new_sizes) const | TTypes< T, NDIMS >::ConstTensor Retorne os dados do tensor para um Eigen::Tensor com a nova forma especificada em new_sizes e converta para um novo dtype T . |
bit_casted_tensor () | TTypes< T, NDIMS >:: Tensor Retorne os dados do tensor para um Eigen::Tensor com o mesmo tamanho, mas uma conversão bit a bit para o dtype T especificado. |
bit_casted_tensor () const | TTypes< T, NDIMS >::ConstTensor Retorne os dados do tensor para um Eigen::Tensor com o mesmo tamanho, mas uma conversão bit a bit para o dtype T especificado. |
dim_size (int d) const | int64 Acessor de conveniência para a forma do tensor. |
dims () const | int Acessor de conveniência para a forma do tensor. |
dtype () const | DataType Retorna o tipo de dados. |
flat () | TTypes< T >::Flat Retorne os dados do tensor como um Eigen::Tensor do tipo de dados e uma forma especificada. |
flat () const | TTypes< T >::ConstFlat |
flat_inner_dims () | TTypes< T, NDIMS >:: Tensor Retorna os dados como um Eigen::Tensor com dimensões NDIMS, recolhendo todas as dimensões do tensor , exceto o último NDIMS-1, na primeira dimensão do resultado. |
flat_inner_dims () const | TTypes< T, NDIMS >::ConstTensor |
flat_inner_outer_dims (int64 begin) | TTypes< T, NDIMS >:: Tensor |
flat_inner_outer_dims (int64 begin) const | TTypes< T, NDIMS >::ConstTensor |
flat_outer_dims () | TTypes< T, NDIMS >:: Tensor Retorna os dados como um Eigen::Tensor com dimensões NDIMS, recolhendo todas as dimensões do Tensor , exceto o primeiro NDIMS-1, na última dimensão do resultado. |
flat_outer_dims () const | TTypes< T, NDIMS >::ConstTensor |
matrix () | TTypes< T >::Matrix |
matrix () const | TTypes< T >::ConstMatrix |
operator= (const Tensor & other) | Tensor & Atribuir operador. Este tensor compartilha o armazenamento subjacente de outro. |
operator= ( Tensor && other) | Tensor & Operador de movimento. Consulte construtor de movimento para obter detalhes. |
reinterpret_last_dimension () | TTypes< T, NDIMS >:: Tensor Retorne os dados do tensor para um Eigen::Tensor com os últimos elementos de dimensão convertidos em elementos únicos de um tipo maior. |
reinterpret_last_dimension () const | TTypes< T, NDIMS >::ConstTensor Retorne os dados do tensor para um Eigen::Tensor com os últimos elementos de dimensão convertidos em elementos únicos de um tipo maior. |
scalar () | TTypes< T >::Scalar |
scalar () const | TTypes< T >::ConstScalar |
shape () const | const TensorShape & Retorna a forma do tensor. |
shaped (gtl::ArraySlice< int64 > new_sizes) | TTypes< T, NDIMS >:: Tensor |
shaped (gtl::ArraySlice< int64 > new_sizes) const | TTypes< T, NDIMS >::ConstTensor |
tensor () | TTypes< T, NDIMS >:: Tensor |
tensor () const | TTypes< T, NDIMS >::ConstTensor |
tensor_data () const | StringPiece Retorna um StringPiece mapeando o buffer do tensor atual. |
unaligned_flat () | TTypes< T >::UnalignedFlat |
unaligned_flat () const | TTypes< T >::UnalignedConstFlat |
unaligned_shaped (gtl::ArraySlice< int64 > new_sizes) | TTypes< T, NDIMS >::UnalignedTensor |
unaligned_shaped (gtl::ArraySlice< int64 > new_sizes) const | TTypes< T, NDIMS >::UnalignedConstTensor |
vec () | TTypes< T >::Vec Retorne os dados do tensor como um Eigen::Tensor com o tipo e os tamanhos desse Tensor . |
vec () const | TTypes< T >::ConstVec Const versões de todos os métodos acima. |
Funções públicas
Bytes alocados
size_t AllocatedBytes() const
AsProtoField
void AsProtoField( TensorProto *proto ) const
Preenche o proto
com *this
tensor.
AsProtoField()
preenche o campo repetido para proto.dtype()
, enquanto AsProtoTensorContent()
codifica o conteúdo em proto.tensor_content()
em um formato compacto.
AsProtoTensorContent
void AsProtoTensorContent( TensorProto *proto ) const
BitcastDe
Status BitcastFrom( const Tensor & other, DataType dtype, const TensorShape & shape )
Copie o outro tensor para este tensor, reformule-o e reinterprete o tipo de dados do buffer.
Se Status::OK() for retornado, os dois tensores agora compartilham o mesmo armazenamento subjacente.
Essa chamada requer que o other
tensor e o tipo e forma fornecidos sejam "compatíveis" (ou seja, eles ocupem o mesmo número de bytes).
Especificamente:
shape.num_elements() * DataTypeSize(type)
deve ser igual
other.num_elements() * DataTypeSize(other.dtype())
Além disso, esta função requer:
- DataTypeSize(other.dtype()) != 0
- DataTypeSize(tipo) != 0
Se algum dos requisitos não for atendido, errors::InvalidArgument será retornado.
Copiar de
bool CopyFrom( const Tensor & other, const TensorShape & shape ) TF_MUST_USE_RESULT
Copie o outro tensor para este tensor e remodele-o.
Este tensor compartilha o armazenamento subjacente de outro. Retorna true
se other.shape()
tiver o mesmo número de elementos da shape
fornecida.
DebugString
string DebugString( int num_values ) const
Um resumo legível por humanos do tensor adequado para depuração.
DebugString
string DebugString() const
DeviceSafeDebugString
string DeviceSafeDebugString() const
Preencher Descrição
void FillDescription( TensorDescription *description ) const
Preencha o proto TensorDescription
com metadados sobre o tensor que são úteis para monitoramento e depuração.
FromProto
bool FromProto( const TensorProto & other ) TF_MUST_USE_RESULT
Analise other
e construa o tensor.
Retorna true
se a análise for bem-sucedida. Se a análise falhar, o estado de *this
não será alterado.
FromProto
bool FromProto( Allocator *a, const TensorProto & other ) TF_MUST_USE_RESULT
Está alinhado
bool IsAligned() const
Retorna true se este tensor estiver alinhado.
Está inicializado
bool IsInitialized() const
Se necessário, este tensor foi inicializado?
Tensores de elemento zero são sempre considerados inicializados, mesmo que nunca tenham sido atribuídos e não tenham nenhuma memória alocada.
IsSameSize
bool IsSameSize( const Tensor & b ) const
NumElements
int64 NumElements() const
Acessor de conveniência para a forma do tensor.
SharesBufferWith
bool SharesBufferWith( const Tensor & b ) const
Fatiar
Tensor Slice( int64 dim0_start, int64 dim0_limit ) const
Fatie este tensor ao longo da 1ª dimensão.
Ou seja, o tensor retornado satisfaz retornado[i, ...] == this[dim0_start + i, ...]. O tensor retornado compartilha o buffer de tensor subjacente com este tensor.
NOTA: O tensor retornado pode não satisfazer o mesmo requisito de alinhamento que este tensor dependendo da forma. O chamador deve verificar o alinhamento do tensor retornado antes de chamar certos métodos que possuem requisitos de alinhamento (por exemplo, flat()
, tensor()
).
NOTA: Quando alimentado com um tensor N-dimensional, este método retorna um tensor também com N dimensões. Se você deseja selecionar um subtensor, consulte SubSlice.
REQUER: dims()
>= 1 REQUER: 0 <= dim0_start <= dim0_limit <= dim_size(0)
Subfatia
Tensor SubSlice( int64 index ) const
Selecione uma subfatia deste tensor ao longo da 1ª dimensão.
Quando alimentado com um tensor N-dimensional, este método retorna um tensor com N-1 dimensões, onde o tensor retornado é uma subfatia do tensor de entrada ao longo da primeira dimensão. As dimensões N-1 do tensor retornado são as últimas dimensões N-1 do tensor de entrada.
NOTA: O tensor retornado pode não satisfazer o mesmo requisito de alinhamento que este tensor dependendo da forma. O chamador deve verificar o alinhamento do tensor retornado antes de chamar certos métodos que possuem requisitos de alinhamento (por exemplo, flat()
, tensor()
).
REQUER: dims()
>= 1 REQUER: 0 <= dim0_start < dim_size(0)
SummarizeValue
string SummarizeValue( int64 max_entries, bool print_v2 ) const
Renderize os primeiros valores max_entries
em *this
em uma string.
Tensor
Tensor()
Cria um tensor flutuante de 1 dimensão e elemento 0.
O tensor retornado não é um escalar (forma {}), mas sim um tensor unidimensional vazio (forma {0}, NumElements() == 0). Como não possui elementos, não precisa ser atribuído a um valor e é inicializado por padrão ( IsInitialized() é true). Se isso for indesejável, considere a criação de um escalar de um elemento que requer inicialização:
Tensor(DT_FLOAT, TensorShape({}))
Tensor
Tensor( DataType type, const TensorShape & shape )
Cria um tensor do type
e shape
fornecidos.
Se LogMemory::IsEnabled() a alocação é registrada como proveniente de um kernel e etapa desconhecidos. Chamar o construtor Tensor diretamente de dentro de um Op está obsoleto: use os métodos OpKernelConstruction/OpKernelContext aloca_* para alocar um novo tensor, que registra o kernel e a etapa.
O buffer subjacente é alocado usando um CPUAllocator
.
Tensor
Tensor( Allocator *a, DataType type, const TensorShape & shape )
Cria um tensor com o type
e shape
de entrada, usando o alocador a
para alocar o buffer subjacente.
Se LogMemory::IsEnabled() a alocação é registrada como proveniente de um kernel e etapa desconhecidos. Chamar o construtor Tensor diretamente de dentro de um Op está obsoleto: use os métodos OpKernelConstruction/OpKernelContext aloca_* para alocar um novo tensor, que registra o kernel e a etapa.
a
deve sobreviver ao tempo de vida deste tensor .
Tensor
Tensor( Allocator *a, DataType type, const TensorShape & shape, const AllocationAttributes & allocation_attr )
Cria um tensor com o type
entrada e shape
, usando o alocador a
e o "allocation_attr" especificado para alocar o buffer subjacente.
Se o kernel e a etapa forem conhecidos, alocação_attr.allocation_will_be_logged deve ser definido como true e LogMemory::RecordTensorAllocation deve ser chamado após a construção do tensor. Chamar o construtor Tensor diretamente de dentro de um Op está obsoleto: use os métodos OpKernelConstruction/OpKernelContext aloca_* para alocar um novo tensor, que registra o kernel e a etapa.
a
deve sobreviver ao tempo de vida deste tensor .
Tensor
Tensor( DataType type )
Cria um tensor vazio do tipo de dados fornecido.
Assim como Tensor() , retorna um Tensor unidimensional de 0 elemento com IsInitialized() retornando True. Consulte a documentação do Tensor() para obter detalhes.
Tensor
Tensor( float scalar_value )
Tensor
Tensor( double scalar_value )
Tensor
Tensor( int32 scalar_value )
Tensor
Tensor( uint32 scalar_value )
Tensor
Tensor( uint16 scalar_value )
Tensor
Tensor( uint8 scalar_value )
Tensor
Tensor( int16 scalar_value )
Tensor
Tensor( int8 scalar_value )
Tensor
Tensor( string scalar_value )
Tensor
Tensor( complex64 scalar_value )
Tensor
Tensor( complex128 scalar_value )
Tensor
Tensor( int64 scalar_value )
Tensor
Tensor( uint64 scalar_value )
Tensor
Tensor( bool scalar_value )
Tensor
Tensor( qint8 scalar_value )
Tensor
Tensor( quint8 scalar_value )
Tensor
Tensor( qint16 scalar_value )
Tensor
Tensor( quint16 scalar_value )
Tensor
Tensor( qint32 scalar_value )
Tensor
Tensor( bfloat16 scalar_value )
Tensor
Tensor( Eigen::half scalar_value )
Tensor
Tensor( ResourceHandle scalar_value )
Tensor
Tensor( const char *scalar_value )
Tensor
Tensor( Tensor && other )
Mover construtor.
Após esta chamada,
TotalBytes
size_t TotalBytes() const
Retorna o uso de memória estimado desse tensor.
InseguroCopyFromInternal
void UnsafeCopyFromInternal( const Tensor & other, DataType dtype, const TensorShape & shape )
Como BitcastFrom, mas CHECK falhará se quaisquer pré-condições não forem atendidas.
Descontinuada. Em vez disso, use BitcastFrom e verifique o Status retornado.
bit_casted_shaped
TTypes< T, NDIMS >::Tensor bit_casted_shaped( gtl::ArraySlice< int64 > new_sizes )
Retorne os dados do tensor para um Eigen::Tensor
com a nova forma especificada em new_sizes
e converta para um novo dtype T
.
O uso de um bitcast é útil para operações de movimentação e cópia. O bitcast permitido é a única diferença de shaped()
.
bit_casted_shaped
TTypes< T, NDIMS >::ConstTensor bit_casted_shaped( gtl::ArraySlice< int64 > new_sizes ) const
Retorne os dados do tensor para um Eigen::Tensor
com a nova forma especificada em new_sizes
e converta para um novo dtype T
.
O uso de um bitcast é útil para operações de movimentação e cópia. O bitcast permitido é a única diferença de shaped()
.
bit_casted_tensor
TTypes< T, NDIMS >::Tensor bit_casted_tensor()
Retorne os dados do tensor para um Eigen::Tensor
com o mesmo tamanho, mas uma conversão bit a bit para o dtype T
especificado.
O uso de um bitcast é útil para operações de movimentação e cópia. NOTA: é o mesmo que tensor()
exceto que um bitcast é permitido.
bit_casted_tensor
TTypes< T, NDIMS >::ConstTensor bit_casted_tensor() const
Retorne os dados do tensor para um Eigen::Tensor
com o mesmo tamanho, mas uma conversão bit a bit para o dtype T
especificado.
O uso de um bitcast é útil para operações de movimentação e cópia. NOTA: é o mesmo que tensor()
exceto que um bitcast é permitido.
dim_size
int64 dim_size( int d ) const
Acessor de conveniência para a forma do tensor.
escurece
int dims() const
Acessor de conveniência para a forma do tensor.
Para todos os acessadores de forma, veja os comentários para métodos relevantes de TensorShape
em tensor_shape.h
.
dtype
DataType dtype() const
Retorna o tipo de dados.
apartamento
TTypes< T >::Flat flat()
Retorne os dados do tensor como um Eigen::Tensor
do tipo de dados e uma forma especificada.
Esses métodos permitem que você acesse os dados com as dimensões e tamanhos de sua escolha. Você não precisa saber o número de dimensões do Tensor para chamá-los. No entanto, eles CHECK
se o tipo corresponde e as dimensões solicitadas criam um Eigen::Tensor
com o mesmo número de elementos que o tensor.
Exemplo:
typedef float T; Tensor my_ten(...built with Shape{planes: 4, rows: 3, cols: 5}...); // 1D Eigen::Tensor, size 60: auto flat = my_ten.flat(); // 2D Eigen::Tensor 12 x 5: auto inner = my_ten.flat_inner_dims (); // 2D Eigen::Tensor 4 x 15: auto outer = my_ten.shaped ({4, 15}); // CHECK fails, bad num elements: auto outer = my_ten.shaped ({4, 8}); // 3D Eigen::Tensor 6 x 5 x 2: auto weird = my_ten.shaped ({6, 5, 2}); // CHECK fails, type mismatch: auto bad = my_ten.flat ();
flat
TTypes< T >::ConstFlat flat() const
flat_inner_dims
TTypes< T, NDIMS >::Tensor flat_inner_dims()
flat_inner_dims
TTypes< T, NDIMS >::ConstTensor flat_inner_dims() const
flat_inner_outer_dims
TTypes< T, NDIMS >::Tensor flat_inner_outer_dims( int64 begin )
Retorna os dados como um Eigen::Tensor com dimensões NDIMS, recolhendo as primeiras dimensões do tensor 'begin' na primeira dimensão do resultado e as dimensões do tensor dos últimos dims() - 'begin' - NDIMS na última dimensão do resultado.
Se 'begin' < 0 então o |'begin'| dimensões principais de tamanho 1 serão adicionadas. Se 'begin' + NDIMS > dims() então 'begin' + NDIMS - dims() dimensões finais de tamanho 1 serão adicionadas.
flat_inner_outer_dims
TTypes< T, NDIMS >::ConstTensor flat_inner_outer_dims( int64 begin ) const
flat_outer_dims
TTypes< T, NDIMS >::Tensor flat_outer_dims()
flat_outer_dims
TTypes< T, NDIMS >::ConstTensor flat_outer_dims() const
matriz
TTypes< T >::Matrix matrix()
matriz
TTypes< T >::ConstMatrix matrix() const
operador=
Tensor & operator=( const Tensor & other )
Atribuir operador. Este tensor compartilha o armazenamento subjacente de outro.
operador=
Tensor & operator=( Tensor && other )
Operador de movimento. Consulte construtor de movimento para obter detalhes.
reinterpretar_última_dimensão
TTypes< T, NDIMS >::Tensor reinterpret_last_dimension()
Retorne os dados do tensor para um Eigen::Tensor
com os últimos elementos de dimensão convertidos em elementos únicos de um tipo maior.
Por exemplo, isso é útil para kernels que podem tratar tensores NCHW_VECT_C int8 como tensores NCHW int32. O sizeof(T) deve ser igual ao tamanho do elemento original type * num elements na última dimensão original. NDIMS deve ser 1 a menos que o número original de dimensões.
reinterpretar_última_dimensão
TTypes< T, NDIMS >::ConstTensor reinterpret_last_dimension() const
Retorne os dados do tensor para um Eigen::Tensor
com os últimos elementos de dimensão convertidos em elementos únicos de um tipo maior.
Por exemplo, isso é útil para kernels que podem tratar tensores NCHW_VECT_C int8 como tensores NCHW int32. O sizeof(T) deve ser igual ao tamanho do elemento original type * num elements na última dimensão original. NDIMS deve ser 1 a menos que o número original de dimensões.
escalar
TTypes< T >::Scalar scalar()
escalar
TTypes< T >::ConstScalar scalar() const
forma
const TensorShape & shape() const
Retorna a forma do tensor.
moldado
TTypes< T, NDIMS >::Tensor shaped( gtl::ArraySlice< int64 > new_sizes )
moldado
TTypes< T, NDIMS >::ConstTensor shaped( gtl::ArraySlice< int64 > new_sizes ) const
tensor
TTypes< T, NDIMS >::Tensor tensor()
tensor
TTypes< T, NDIMS >::ConstTensor tensor() const
tensor_data
StringPiece tensor_data() const
Retorna um StringPiece
mapeando o buffer do tensor atual.
O StringPiece
retornado pode apontar para a localização da memória em dispositivos que a CPU não pode endereçar diretamente.
NOTA: O buffer do tensor subjacente é refcounted, portanto, o tempo de vida do conteúdo mapeado pelo StringPiece
corresponde ao tempo de vida do buffer; os chamadores devem providenciar para garantir que o buffer não seja destruído enquanto o StringPiece
ainda estiver sendo usado.
REQUER: DataTypeCanUseMemcpy(dtype())
.
unaligned_flat
TTypes< T >::UnalignedFlat unaligned_flat()
unaligned_flat
TTypes< T >::UnalignedConstFlat unaligned_flat() const
unaligned_shaped
TTypes< T, NDIMS >::UnalignedTensor unaligned_shaped( gtl::ArraySlice< int64 > new_sizes )
unaligned_shaped
TTypes< T, NDIMS >::UnalignedConstTensor unaligned_shaped( gtl::ArraySlice< int64 > new_sizes ) const
vec
TTypes< T >::Vec vec()
Retorne os dados do tensor como um Eigen::Tensor com o tipo e os tamanhos desse tensor .
Use esses métodos quando souber o tipo de dados e o número de dimensões do tensor e desejar que um Eigen::Tensor seja dimensionado automaticamente para os tamanhos do tensor. A verificação de implementação falhará se o tipo ou os tamanhos não corresponderem.
Exemplo:
l10n-placeholder88
l10n-placeholder89
Const versões de todos os métodos acima.
~Tensor
l10n-placeholder90Exceto em caso de indicação contrária, o conteúdo desta página é licenciado de acordo com a Licença de atribuição 4.0 do Creative Commons, e as amostras de código são licenciadas de acordo com a Licença Apache 2.0. Para mais detalhes, consulte as políticas do site do Google Developers. Java é uma marca registrada da Oracle e/ou afiliadas.
Última atualização 2022-08-30 UTC.