code

Tensorflow One 핫 인코더?

codestyles 2020. 11. 23. 08:11
반응형

Tensorflow One 핫 인코더?


tensorflow는 범주 형 데이터를 처리하기위한 scikit learn의 핫 인코더 와 비슷한 것이 있습니까? tf.string의 자리 표시자를 사용하면 범주 형 데이터로 작동합니까?

데이터를 tensorflow로 보내기 전에 수동으로 사전 처리 할 수 ​​있다는 것을 알고 있지만 내장되어있는 것은 매우 편리합니다.


TensorFlow 0.8부터는 스파 스 레이블 세트를 조밀 한 원-핫 표현으로 변환 할 수 있는 기본 원-핫 작업tf.one_hot 이 있습니다. 이것은에 추가되며 tf.nn.sparse_softmax_cross_entropy_with_logits, 경우에 따라 원-핫으로 변환하는 대신 희소 레이블에서 직접 교차 엔트로피를 계산할 수 있습니다.

이전 답변, 예전 방식으로 수행하려는 경우 : @Salvador의 답변은 정확합니다-(예전에는) 그것을 수행하는 네이티브 op가 없습니다. 그러나 numpy에서 수행하는 대신 희소 밀도 연산자를 사용하여 기본적으로 tensorflow에서 수행 할 수 있습니다.

num_labels = 10

# label_batch is a tensor of numeric labels to process
# 0 <= label < num_labels

sparse_labels = tf.reshape(label_batch, [-1, 1])
derived_size = tf.shape(label_batch)[0]
indices = tf.reshape(tf.range(0, derived_size, 1), [-1, 1])
concated = tf.concat(1, [indices, sparse_labels])
outshape = tf.pack([derived_size, num_labels])
labels = tf.sparse_to_dense(concated, outshape, 1.0, 0.0)

출력 레이블 레이블은 batch_size x num_labels의 원-핫 행렬입니다.

또한 2016 년 2 월 12 일 (결국 0.7 릴리스의 일부가 될 것이라고 가정)부터 TensorFlow에도 tf.nn.sparse_softmax_cross_entropy_with_logitsop 있습니다.이 작업은 경우에 따라 원-핫 인코딩으로 변환 할 필요없이 학습을 수행 할 수 있습니다.

추가를 위해 수정 됨 : 마지막에 라벨의 모양을 명시 적으로 설정해야 할 수도 있습니다. 모양 추론은 num_labels 구성 요소의 크기를 인식하지 못합니다. 파생 된 크기의 동적 배치 크기가 필요하지 않은 경우이를 단순화 할 수 있습니다.

2016 년 2 월 12 일에 아래 댓글에 따라 외형 할당을 변경했습니다.


tf.one_hot() TF로 제공되며 사용하기 쉽습니다.

4 개의 가능한 범주 (고양이, 개, 새, 사람)와 2 개의 인스턴스 (고양이, 사람)가 있다고 가정 해 보겠습니다. 그래서 당신 depth=4과 당신의indices=[0, 3]

import tensorflow as tf
res = tf.one_hot(indices=[0, 3], depth=4)
with tf.Session() as sess:
    print sess.run(res)

index = -1을 제공하면 원-핫 벡터에서 모든 0을 얻게됩니다.

이 기능을 사용할 수 없었던 이전 답변.

파이썬 문서를 살펴본 후 비슷한 것을 찾지 못했습니다. 그것이 존재하지 않는다는 나의 믿음을 강화시키는 한 가지는 자신의 예 에서 one_hot수동으로 작성한다는 것 입니다.

def dense_to_one_hot(labels_dense, num_classes=10):
  """Convert class labels from scalars to one-hot vectors."""
  num_labels = labels_dense.shape[0]
  index_offset = numpy.arange(num_labels) * num_classes
  labels_one_hot = numpy.zeros((num_labels, num_classes))
  labels_one_hot.flat[index_offset + labels_dense.ravel()] = 1
  return labels_one_hot

scikitlearn 에서도 이것을 할 수 있습니다 .


numpy 해!

import numpy as np
np.eye(n_labels)[target_vector]

정수 또는 정수 목록을 원-핫 인코딩하는 간단하고 짧은 방법 :

a = 5 
b = [1, 2, 3]
# one hot an integer
one_hot_a = tf.nn.embedding_lookup(np.identity(10), a)
# one hot a list of integers
one_hot_b = tf.nn.embedding_lookup(np.identity(max(b)+1), b)

최신 버전의 TensorFlow (나이틀리 및 0.7.1)에는 원하는 작업을 수행하는 tf.one_hot이라는 작업이 있습니다. 확인 해봐!

반면에 조밀 한 행렬이 있고 그 안에있는 값을 조회하고 집계하려면 embedding_lookup 함수를 사용하는 것이 좋습니다.


아마도 2015 년 11 월 이후 Tensorflow의 변경으로 인한 것일 수 있지만 @dga의 답변으로 인해 오류가 발생했습니다. 다음 수정 사항을 적용했습니다.

sparse_labels = tf.reshape(label_batch, [-1, 1])
derived_size = tf.shape(sparse_labels)[0]
indices = tf.reshape(tf.range(0, derived_size, 1), [-1, 1])
concated = tf.concat(1, [indices, sparse_labels])
outshape = tf.concat(0, [tf.reshape(derived_size, [1]), tf.reshape(num_labels, [1])])
labels = tf.sparse_to_dense(concated, outshape, 1.0, 0.0)

tf.nn.embedding_lookup을 살펴보세요 . 카테고리 ID에서 임베딩으로 매핑됩니다.

입력 데이터에 사용되는 방법에 대한 예는 여기를 참조 하십시오 .


tf.sparse_to_dense 사용할 수 있습니다 .

The sparse_indices argument indicates where the ones should go, output_shape should be set to the number of possible outputs (e.g. the number of labels), and sparse_values should be 1 with the desired type (it will determine the type of the output from the type of sparse_values).


There's embedding_ops in Scikit Flow and examples that deal with categorical variables, etc.

If you just begin to learn TensorFlow, I would suggest you trying out examples in TensorFlow/skflow first and then once you are more familiar with TensorFlow it would be fairly easy for you to insert TensorFlow code to build a custom model you want (there are also examples for this).

Hope those examples for images and text understanding could get you started and let us know if you encounter any issues! (post issues or tag skflow in SO).


Current versions of tensorflow implement the following function for creating one-hot tensors:

https://www.tensorflow.org/versions/master/api_docs/python/array_ops.html#one_hot


As mentioned above by @dga, Tensorflow has tf.one_hot now:

labels = tf.constant([5,3,2,4,1])
highest_label = tf.reduce_max(labels)
labels_one_hot = tf.one_hot(labels, highest_label + 1)

array([[ 0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.]], dtype=float32)

You need to specify depth, otherwise you'll get a pruned one-hot tensor.

If you like to do it manually:

labels = tf.constant([5,3,2,4,1])
size = tf.shape(labels)[0]
highest_label = tf.reduce_max(labels)
labels_t = tf.reshape(labels, [-1, 1])
indices = tf.reshape(tf.range(size), [-1, 1])
idx_with_labels = tf.concat([indices, labels_t], 1)
labels_one_hot = tf.sparse_to_dense(idx_with_labels, [size, highest_label + 1], 1.0)

array([[ 0.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1.,  0.],
       [ 0.,  1.,  0.,  0.,  0.,  0.]], dtype=float32)

Note arguments order in tf.concat()


There are a couple ways to do it.

ans = tf.constant([[5, 6, 0, 0], [5, 6, 7, 0]]) #batch_size*max_seq_len
labels = tf.reduce_sum(tf.nn.embedding_lookup(np.identity(10), ans), 1)

>>> [[ 0.  0.  0.  0.  0.  1.  1.  0.  0.  0.]
>>> [ 0.  0.  0.  0.  0.  1.  1.  1.  0.  0.]]

The other way to do it is.

labels2 = tf.reduce_sum(tf.one_hot(ans, depth=10, on_value=1, off_value=0, axis=1), 2)

 >>> [[0 0 0 0 0 1 1 0 0 0]
 >>> [0 0 0 0 0 1 1 1 0 0]]

My version of @CFB and @dga example, shortened a bit to ease understanding.

num_labels = 10
labels_batch = [2, 3, 5, 9]

sparse_labels = tf.reshape(labels_batch, [-1, 1])
derived_size = len(labels_batch)
indices = tf.reshape(tf.range(0, derived_size, 1), [-1, 1])
concated = tf.concat(1, [indices, sparse_labels]) 
labels = tf.sparse_to_dense(concated, [derived_size, num_labels], 1.0, 0.0)

In [7]: one_hot = tf.nn.embedding_lookup(np.eye(5), [1,2])

In [8]: one_hot.eval()
Out[8]: 
array([[ 0.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  0.]])

works on TF version 1.3.0. As of Sep 2017.

참고URL : https://stackoverflow.com/questions/33681517/tensorflow-one-hot-encoder

반응형