2017-09-19 28 views
1

我正在嘗試構建一個不使用估計器的神經網絡。我已將圖層定義爲,如何在無估計量的情況下在張量流中使用分類數據神經網絡?

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適用於數字特徵,但我也有一些分類特徵。所以我無法使用它們 我嘗試過tf.string_to_hash_bucket_fast,但它將字符串轉換爲intf,不受tf.matmul支持,我也試過了tf.decode_raw。那也沒有用。所以請幫助我,我也想使用分類功能。

回答

1

要處理神經網絡中的分類值,您必須在OneHot表示中表示它們。如果它們是字符串(因爲它似乎是你的情況),你首先必須將它們轉換爲「整數表示」。一步一步:

使用from sklearn.preprocessing import LabelEncoder,OneHotEncoder

定義您範疇字符串值

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

然後對其進行編碼爲整數:

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

並使用OneHotEncoder獲得OneHot表示:

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

定義您的圖表:

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) 

並執行它獲得的結果:

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

編輯:按照要求,無sklearn版本。使用

只是numpy.unique()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) 

完整的示例在JN下鏈接

這裏有一個Jupyter筆記本採用的代碼我Github

+0

類似功能的張量流可用?我不想使用sklearn。 –

+0

@DilpreetSDhamija剛剛更新了答案,但是,我可以問你爲什麼不想使用sklearn但是tensorflow是嗎?只是好奇。 – Alber8295

相關問題