web-dev-qa-db-ja.com

Tensorflow One Hot Encoder?

テンソルフローは、カテゴリデータを処理するためのscikit Learnの 1つのホットエンコーダ に似たものを持っていますか? tf.stringのプレースホルダーを使用すると、カテゴリデータとして動作しますか?

テンソルフローに送信する前に手動でデータを前処理できることに気づきましたが、組み込みが非常に便利です。

59
Robert Graves

TensorFlow 0.8の時点で、スパースラベルのセットを密なワンホット表現に変換できる ネイティブワンホットop、tf.one_hot があります。これは tf.nn.sparse_softmax_cross_entropy_with_logits に追加されるもので、場合によってはスパースラベルをワンホットに変換する代わりにスパースラベルで直接クロスエントロピーを計算できます。

以前の答え、古い方法でやりたい場合:@Salvadorの答えは正しいです-それを行うためのネイティブ操作はありませんでした。ただし、numpyで行う代わりに、疎から密の演算子を使用して、テンソルフローでネイティブに行うことができます。

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)

出力であるlabelsは、batch_size x num_labelsのワンホット行列です。

また、2016-02-12(最終的には0.7リリースの一部になると思われます)の時点で、TensorFlowにはtf.nn.sparse_softmax_cross_entropy_with_logits opもあります。 。

追加して編集:最後に、ラベルの形状を明示的に設定する必要がある場合があります。形状の推論は、num_labelsコンポーネントのサイズを認識しません。 derived_sizeを使用した動的なバッチサイズが必要ない場合は、これを簡略化できます。

以下のコメントごとにoutshapeの割り当てを変更するために2016-02-12を編集しました。

63
dga

tf.one_hot() はTFで使用でき、使いやすいです。

4つの可能なカテゴリ(猫、犬、鳥、人間)と2つのインスタンス(猫、人間)があるとします。したがって、depth=4indices=[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を指定すると、ワンホットベクトルですべてゼロになることに注意してください。

この関数が利用できなかった古い答え。

python documentation を見た後、似たようなものは見つかりませんでした。それが存在しないという私の信念を強めるものの1つは、 彼ら自身の例 では、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 でこれを行うこともできます。

45
Salvador Dali

numpyはそれをします!

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

整数または整数のリストをワンホットエンコードする簡単で短い方法:

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)
8
Rajarshee Mitra

TensorFlowの最近のバージョン(ナイトリー、場合によっては0.7.1)には、tf.one_hotと呼ばれるopがあり、必要な処理を行います。見てみな!

一方、密行列があり、その中の値を検索して集計する場合は、embedding_lookup関数を使用します。

6
Eugene Brevdo

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)
4
CFB

tf.nn.embedding_lookup をご覧ください。カテゴリIDからその埋め込みにマップします。

入力データにどのように使用されるかの例については、 here を参照してください。

2
Markus

tf.sparse_to_dense を使用できます。

Sparse_indices引数は、出力先を示し、output_shapeに可能な出力の数(ラベルの数など)を設定し、sparse_valuesに目的のタイプの1を指定します(出力のタイプは、 sparse_values)。

2
Josh11b

Scikit Flowには embedding_ops があり、カテゴリ変数などを扱う例があります。

TensorFlowを学習し始めたばかりの場合は、最初に examples in TensorFlow/skflow を試してみてください。TensorFlowに慣れたら、かなり簡単になります。 TensorFlowコードを挿入して、必要なカスタムモデルを構築します(この例もあります)。

画像とテキストを理解するためのこれらの例があなたを始めさせ、何か問題に遭遇した場合はお知らせください。 (問題を投稿するか、SOでタグskflow)。

2
Yuan Tang

Tensorflowの現在のバージョンは、ワンホットテンソルを作成するために次の関数を実装しています。

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

1
Peteris

@dgaで前述したように、Tensorflowには tf.one_hot が追加されました。

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)

深さを指定する必要があります。そうしないと、プルーニングされたワンホットテンソルが得られます。

手動で行う場合:

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)

Tf.concat()の引数の順序に注意してください

1
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.]])

tFバージョン1.3.0で動作します。 2017年9月現在。

0
Aerin

いくつかの方法があります。

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.]]

他の方法はそれです。

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]]
0
Apurv

私のバージョンの@CFBと@dgaの例では、理解を容易にするために少し短くしました。

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)
0
VladimirLenin