2017-09-19 2 views
1

J'essaie de construire un réseau de neurones sans utiliser d'estimateurs. J'ai défini des couches comme,Comment utiliser le réseau de neurones de données catégoriques en tensorflow sans estimateur?

x_categorical = tf.placeholder(tf.string) 
x_numeric = tf.placeholder(tf.float32) 

l1 = tf.add(tf.matmul(x_numeric,weights), biases) 
l2 = tf.add(tf.matmul(x_categorical,weights), biases) 

tf.matmul fonctionne bien pour les fonctionnalités numériques, mais j'ai également quelques fonctionnalités catégoriques. Donc je suis incapable de les utiliser J'ai essayé tf.string_to_hash_bucket_fast mais il convertit la chaîne en int64 qui n'est pas supportée par tf.matmul, j'ai aussi essayé tf.decode_raw. cela n'a pas fonctionné non plus. Alors s'il vous plaît aidez-moi avec cela, je veux aussi utiliser des fonctionnalités catégoriques.

Répondre

1

Pour gérer des valeurs catégorielles dans un réseau de neurones, vous devez les représenter dans une représentation OneHot. Si elles sont des chaînes (comme cela semble être votre cas), vous devez d'abord les convertir en "représentation entière". Etape par étape:

En utilisant from sklearn.preprocessing import LabelEncoder,OneHotEncoder

vous définissez les valeurs de chaîne catégorielle

categorical_values = np.array([['Foo','bar','values'],['more','foo','bar'],['many','foo','bar']])

ensuite les encoder sous forme d'entiers:

categorical_values[:,0] = LabelEncoder().fit_transform(categorical_values[:,0]) 
categorical_values[:,1] = LabelEncoder().fit_transform(categorical_values[:,1]) 
categorical_values[:,2] = LabelEncoder().fit_transform(categorical_values[:,2]) 

Et utiliser OneHotEncoder pour obtenir la représentation onehot:

oneHot_values = OneHotEncoder().fit_transform(categorical_values).toarray()

Définir votre graphique:

x_categorical = tf.placeholder(shape=[NUM_OBSERVATIONS,NUM_FEATURES],dtype=tf.float32) 

weights = tf.Variable(tf.truncated_normal([NUM_FEATURES,NUM_CLASSES]),dtype=tf.float32) 
bias = tf.Variable([NUM_CLASSES],dtype=tf.float32) 

l2 = tf.add(tf.matmul(x_categorical,weights),bias) 

et l'exécuter d'obtenir les résultats:

with tf.Session() as sess: 
    tf.global_variables_initializer().run() 
    _l2 = sess.run(l2,feed_dict={x_categorical : oneHot_values}) 

Edit: Comme demandé, version sans sklearn.

En utilisant simplement numpy.unique() et tensorflow.one_hot()

categorical_values = np.array(['Foo','bar','values']) #For one observation 
lookup, labeledValues = np.unique(categorical_values, return_inverse=True) 
oneHotValues = tf.one_hot(labeledValues,depth=NUM_FEATURES) 

Exemple complet sur le JN lien ci-dessous

Ici vous avez un ordinateur portable Jupyter avec le code sur mon Github

+0

est fonction similaire disponible en flux tenseur? Je ne veux pas utiliser sklearn. –

+0

@DilpreetSDhamija vient de mettre à jour la réponse mais, pourrais-je demander pourquoi vous ne voulez pas utiliser sklearn mais tensorflow oui? Juste curieux. – Alber8295