我正在尝试实现TensorFlow DNNRegressor,该TensorFlow DNNRegressor使用带有多个标签的张量,但由于我不理解的错误而导致失败。
我在Tensorflow 1.4.1上进行了95%的测试,但我刚切换到1.5.0 / CUDA 9,但仍然失败了(您知道,我只是希望:))
作为参考,我使用了波士顿示例和pandas输入func源代码
https://github.com/tensorflow/tensorflow/blob/master/tensorflow/examples/tutorials/input_fn/boston.py
https://github.com/tensorflow/tensorflow/blob/r1.5/tensorflow/python/estimator/inputs/pandas_io.py
在下面的要点中,您可以找到完整的python代码,产生的输出,训练数据和(当前未使用的)测试数据。训练数据和测试数据非常小,仅用于构建代码。
https://gist.github.com/anonymous/c3e9fbe5f5faf373fa230909347318cd
错误消息如下(堆栈跟踪在要点中,我没有在此处发布它以避免污染发布信息)
tensorflow.python.framework.errors_impl.InvalidArgumentError:声明失败:[标签形状必须为[batch_size,20]] [条件x == y不按元素进行:] [x(dnn / head / labels / assert_equal / x :0)=] [20] [y(dnn / head / labels / strided_slice:0)=] [3]
[[节点:dnn / head / labels / assert_equal / Assert / Assert = Assert [T = [DT_STRING,DT_STRING,DT_STRING,DT_INT32,DT_STRING,DT_INT32],summary = 3,_device =“ / job:localhost / replica:0 /任务:0 /设备:CPU:0“](dnn / head / labels / assert_equal / All / _151,dnn / head / labels / assert_equal / Assert / Assert / data_0,dnn / head / labels / assert_equal / Assert / Assert / data_1,dnn / head / labels / assert_equal / assert / assert / data_2,dnn / head / logits / assert_equal / x / _153,dnn / head / labels / assert_equal / Assert / Assert / data_4,dnn / head / labels / strided_slice / _155)]]
input_fn如下
def get_input_fn(dataset,
model_labels=None,
batch_size=128,
num_epochs=1,
shuffle=None,
queue_capacity=1000,
num_threads=1):
dataset = dataset.copy()
if queue_capacity is None:
if shuffle:
queue_capacity = 4 * len(dataset)
else:
queue_capacity = len(dataset)
min_after_dequeue = max(queue_capacity / 4, 1)
def input_fn():
queue = feeding_functions._enqueue_data(
dataset,
queue_capacity,
shuffle=shuffle,
min_after_dequeue=min_after_dequeue,
num_threads=num_threads,
enqueue_size=batch_size,
num_epochs=num_epochs)
if num_epochs is None:
features = queue.dequeue_many(batch_size)
else:
features = queue.dequeue_up_to(batch_size)
assert len(features) == len(dataset.columns) + 1, ('Features should have one '
'extra element for the index.')
features = features[1:]
features = dict(zip(list(dataset.columns), features))
if model_labels is not None:
#labels = tf.stack([features.pop(model_label) for model_label in model_labels], 0);
labels = [features.pop(model_label) for model_label in model_labels]
return features, labels
return features
return input_fn
我可以使用以下输入fn进行训练和预测,但看起来不适合处理以后要用于训练的数据量。
另外,当我将它与评估方法一起使用时,它会卡住。
def get_input_fn(dataset,
model_labels=None):
def input_fn():
features = {k: tf.constant(len(dataset), shape=[dataset[k].size, 1]) for k in model_features}
if model_labels is not None:
labels_data = []
for i in range(0, len(dataset)):
temp = []
for label in model_labels:
temp.append(dataset[label].values[i])
labels_data.append(temp)
labels = tf.constant(labels_data, shape=[len(dataset), len(model_labels)])
return features, labels
else:
return features
return input_fn
谢谢!
笔记:
如果您按要点查看完整的代码,您会注意到功能和标签的数量取决于类别的数量,它们是根据种子数据动态构建的。
也许我可以切换为使用RNN并将每个纪元映射到一个类别,而不是构建一个庞大的矩阵,但是目前,我专注于使此测试有效。
最佳答案
最后,我略微更改了生成的方法,将测试代码分为prepare.py和train.py,prepare.py将数据写入一些CSV(输入数据和类别)中,并包含在train.py中。将输入fn替换为加载这些csv的输入,构建数据集,使用tf.read_csv解析数据集行(以及更多其他内容)。
csv_field_defaults = [[0]] * (1 + len(model_features) + len(model_labels))
def _parse_line(line):
fields = tf.decode_csv(line, csv_field_defaults)
# Remove the user id
fields.pop(0)
features = dict(zip(model_features + model_labels,fields))
labels = tf.stack([features.pop(model_label) for model_label in model_labels])
return features, labels
def csv_input_fn(csv_path, batch_size):
dataset = tf.data.TextLineDataset(csv_path).skip(1)
dataset = dataset.map(_parse_line)
dataset = dataset.shuffle(1000).repeat().batch(batch_size)
return dataset.make_one_shot_iterator().get_next()
# Initialize tensor flow
tf.logging.set_verbosity(tf.logging.INFO)
# Initialize the neural network
feature_cols = [tf.feature_column.numeric_column(k) for k in model_features]
regressor = tf.estimator.DNNRegressor(feature_columns=feature_cols,
label_dimension=len(model_labels),
hidden_units=[4096, 2048, 1024, 512],
model_dir="tf_model")
我目前能够处理10000条记录,但我将需要解析更多数据,希望此实现效果更好
csv_input_fn
来自tensorflow示例,而我修改了_parse_line
以根据需要处理功能和标签。关于python - DNNRegressor训练输入多个标签,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48629347/