如何在没有估计量的张量流中使用分类数据神经网络?

时间:2017-09-19 17:21:13

标签: string input tensorflow

我正在尝试在不使用估算器的情况下构建神经网络。我已将图层定义为

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 个答案:

答案 0 :(得分:2)

要处理神经网络中的分类值,您必须在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