如何将分类数据从 numpy 数组加载到指标或嵌入列中?
How do I load categorical data from a numpy array into an Indicator or Embedding column?
使用 Tensorflow 1.8.0,每当我们尝试构建分类列时,我们都会 运行 遇到问题。这是演示问题的完整示例。它按原样运行(仅使用数字列)。取消注释指示器列定义和数据会生成以 tensorflow.python.framework.errors_impl.InternalError: Unable to get element as bytes.
结尾的堆栈跟踪
import tensorflow as tf
import numpy as np
def feature_numeric(key):
return tf.feature_column.numeric_column(key=key, default_value=0)
def feature_indicator(key, vocabulary):
return tf.feature_column.indicator_column(
tf.feature_column.categorical_column_with_vocabulary_list(
key=key, vocabulary_list=vocabulary ))
labels = ['Label1','Label2','Label3']
model = tf.estimator.DNNClassifier(
feature_columns=[
feature_numeric("number"),
# feature_indicator("indicator", ["A","B","C"]),
],
hidden_units=[64, 16, 8],
model_dir='./models',
n_classes=len(labels),
label_vocabulary=labels)
def train(inputs, training):
model.train(
input_fn=tf.estimator.inputs.numpy_input_fn(
x=inputs,
y=training,
shuffle=True
), steps=1)
inputs = {
"number": np.array([1,2,3,4,5]),
# "indicator": np.array([
# ["A"],
# ["B"],
# ["C"],
# ["A", "A"],
# ["A", "B", "C"],
# ]),
}
training = np.array(['Label1','Label2','Label3','Label2','Label1'])
train(inputs, training)
尝试使用嵌入票价并没有更好。仅使用数字输入,我们就可以成功地扩展到数千个输入节点,实际上我们暂时在预处理器中扩展了我们的分类特征来模拟指标。
categorical_column_*()
和 indicator_column()
的文档充斥着对我们非常确定我们没有使用的功能的引用(原型输入,无论 bytes_list
是什么)但也许我们你错了吗?
据我所知,困难在于您正试图从一个数组的数组中创建一个指示器列。
我将你的指标数组折叠到
"indicator": np.array([
"A",
"B",
"C",
"AA",
"ABC",
])
... 还有那个东西 运行。
此外,我找不到任何示例,其中词汇表数组只是一个平面字符串数组。
这里的问题与 "indicator" 输入数组的参差不齐的形状有关(一些元素的长度为 1,一个长度为 2,一个长度为 3)。如果你用一些非词汇字符串填充你的输入列表(例如我使用 "Z" 因为你的词汇是 "A"、"B"、"C"),你会得到预期结果:
inputs = {
"number": np.array([1,2,3,4,5]),
"indicator": np.array([
["A", "Z", "Z"],
["B", "Z", "Z"],
["C", "Z", "Z"],
["A", "A", "Z"],
["A", "B", "C"]
])
}
您可以通过打印生成的张量来验证这是否有效:
dense = tf.feature_column.input_layer(
inputs,
[
feature_numeric("number"),
feature_indicator("indicator", ["A","B","C"]),
])
with tf.train.MonitoredTrainingSession() as sess:
print(dense)
print(sess.run(dense))
使用 Tensorflow 1.8.0,每当我们尝试构建分类列时,我们都会 运行 遇到问题。这是演示问题的完整示例。它按原样运行(仅使用数字列)。取消注释指示器列定义和数据会生成以 tensorflow.python.framework.errors_impl.InternalError: Unable to get element as bytes.
import tensorflow as tf
import numpy as np
def feature_numeric(key):
return tf.feature_column.numeric_column(key=key, default_value=0)
def feature_indicator(key, vocabulary):
return tf.feature_column.indicator_column(
tf.feature_column.categorical_column_with_vocabulary_list(
key=key, vocabulary_list=vocabulary ))
labels = ['Label1','Label2','Label3']
model = tf.estimator.DNNClassifier(
feature_columns=[
feature_numeric("number"),
# feature_indicator("indicator", ["A","B","C"]),
],
hidden_units=[64, 16, 8],
model_dir='./models',
n_classes=len(labels),
label_vocabulary=labels)
def train(inputs, training):
model.train(
input_fn=tf.estimator.inputs.numpy_input_fn(
x=inputs,
y=training,
shuffle=True
), steps=1)
inputs = {
"number": np.array([1,2,3,4,5]),
# "indicator": np.array([
# ["A"],
# ["B"],
# ["C"],
# ["A", "A"],
# ["A", "B", "C"],
# ]),
}
training = np.array(['Label1','Label2','Label3','Label2','Label1'])
train(inputs, training)
尝试使用嵌入票价并没有更好。仅使用数字输入,我们就可以成功地扩展到数千个输入节点,实际上我们暂时在预处理器中扩展了我们的分类特征来模拟指标。
categorical_column_*()
和 indicator_column()
的文档充斥着对我们非常确定我们没有使用的功能的引用(原型输入,无论 bytes_list
是什么)但也许我们你错了吗?
据我所知,困难在于您正试图从一个数组的数组中创建一个指示器列。
我将你的指标数组折叠到
"indicator": np.array([
"A",
"B",
"C",
"AA",
"ABC",
])
... 还有那个东西 运行。
此外,我找不到任何示例,其中词汇表数组只是一个平面字符串数组。
这里的问题与 "indicator" 输入数组的参差不齐的形状有关(一些元素的长度为 1,一个长度为 2,一个长度为 3)。如果你用一些非词汇字符串填充你的输入列表(例如我使用 "Z" 因为你的词汇是 "A"、"B"、"C"),你会得到预期结果:
inputs = {
"number": np.array([1,2,3,4,5]),
"indicator": np.array([
["A", "Z", "Z"],
["B", "Z", "Z"],
["C", "Z", "Z"],
["A", "A", "Z"],
["A", "B", "C"]
])
}
您可以通过打印生成的张量来验证这是否有效:
dense = tf.feature_column.input_layer(
inputs,
[
feature_numeric("number"),
feature_indicator("indicator", ["A","B","C"]),
])
with tf.train.MonitoredTrainingSession() as sess:
print(dense)
print(sess.run(dense))