2017-07-20 3 views
0

Ich erstelle einen DNNclassifier mit Sparse-Spalten. Die Trainingsdaten wie folgt aussieht,was TensorFlow hash_bucket_size zählt

samples  col1       col2   price label 
    eg1 [[0,1,0,0,0,2,0,1,0,3,...] [[0,0,4,5,0,...] 5.2 0 
    eg2 [0,0,...]      [0,0,...]   0  1 
    eg3 [0,0,...]]     [0,0,...]   0  1 

folgenden Ausschnitt erfolgreich ausgeführt werden kann,

import tensorflow as tf 

sparse_feature_a = tf.contrib.layers.sparse_column_with_hash_bucket('col1', 3, dtype=tf.int32) 
sparse_feature_b = tf.contrib.layers.sparse_column_with_hash_bucket('col2', 1000, dtype=tf.int32) 

sparse_feature_a_emb = tf.contrib.layers.embedding_column(sparse_id_column=sparse_feature_a, dimension=2) 
sparse_feature_b_emb = tf.contrib.layers.embedding_column(sparse_id_column=sparse_feature_b, dimension=2) 
feature_c = tf.contrib.layers.real_valued_column('price') 

estimator = tf.contrib.learn.DNNClassifier(
    feature_columns=[sparse_feature_a_emb, sparse_feature_b_emb, feature_c], 
    hidden_units=[5, 3], 
    n_classes=2, 
    model_dir='./tfTmp/tfTmp0') 

# Input builders 
def input_fn_train(): # returns x, y (where y represents label's class index). 
    features = {'col1': tf.SparseTensor(indices=[[0, 1], [0, 5], [0, 7], [0, 9]], 
            values=[1, 2, 1, 3], 
            dense_shape=[3, int(250e6)]), 
       'col2': tf.SparseTensor(indices=[[0, 2], [0, 3]], 
            values=[4, 5], 
            dense_shape=[3, int(100e6)]), 
         'price': tf.constant([5.2, 0, 0])} 
    labels = tf.constant([0, 1, 1]) 
    return features, labels 

estimator.fit(input_fn=input_fn_train, steps=100) 

Aber ich habe eine Frage von diesem Satz

sparse_feature_a = tf.contrib.layers.sparse_column_with_hash_bucket('col1', 3, dtype=tf.int32) 

wo 3 bedeutet hash_bucket_size = 3, aber dieser spärliche Tensor enthält 4 von Null verschiedene Werte,

'col1': tf.SparseTensor(indices=[[0, 1], [0, 5], [0, 7], [0, 9]], 
           values=[1, 2, 1, 3], 
           dense_shape=[3, int(250e6)]) 

Es scheint has_bucket_size tut nichts hier. Ganz gleich, wie viele Werte ungleich Null Sie in Ihrem dünnen Tensor haben, Sie müssen ihn nur mit einer Ganzzahl> 1 setzen, und er funktioniert ordnungsgemäß.

Ich weiß, dass mein Verständnis möglicherweise nicht richtig ist. Könnte jemand erklären, wie has_bucket_size funktioniert? Danke vielmals!

Antwort

1

hash_bucket_size funktioniert, indem Sie die ursprünglichen Indizes nehmen, sie in ein Leerzeichen der angegebenen Größe einteilen und die Hash-Indizes als Features verwenden.

Das bedeutet, dass Sie Ihr Modell spezifizieren können, bevor Sie den vollen Bereich der möglichen Indizes kennen, wobei manche Indizes möglicherweise kollidieren.

+0

Danke! Jetzt denke ich, wenn man eine Zahl erraten kann, die den gesamten Bereich der realen Daten abdeckt, dann ist es perfekt. Wenn Sie eine Zahl kleiner als erwartet erraten, wird es auch funktionieren, aber kann unsicheres Verhalten verursachen. –