我正在尝试在不使用估算器的情况下构建神经网络。我已将图层定义为
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。那也行不通。所以请帮助我,我也希望使用分类功能。
答案 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