我使用Keras.Model.fit_generator时,我的数据集中的示例必须采用([feature_1, feature_2,...], labels)
格式。为此,我将阅读.tfrecord
s:
dataset = tf.data.TFRecordDataset(tf_records)
dataset = dataset.map(map_func=parser, num_parallel_calls=num_parallel_calls)
...
但是,我在使用map_func
时遇到了困难:
def parser(record, training=True):
context_features = {
"labels": tf.VarLenFeature(tf.int64)
}
sequence_features = {
"feature_1": tf.FixedLenSequenceFeature([], dtype=tf.string),
"feature_2": tf.FixedLenSequenceFeature([], dtype=tf.string)
}
context_parse, sequence_parsed = tf.parse_single_sequence_example(record, context_features, sequence_features)
X_feature_1 = tf.decode_raw(sequence_parsed["feature_1"], tf.uint8)
X_feature_2 = tf.decode_raw(sequence_parsed["feature_2"], tf.uint8)
y = tf.sparse_to_dense(context_parse["labels"].values, [3862], 1)
return ([X_feature_1, X_feature_2], y)
如果我尝试如上所述使用列表来容纳[X_feature_1, X_feature_2]
,最终会出现以下错误:
AttributeError: 'list' object has no attribute 'get_shape'
如何传递包含列表的元组?
更新(解决方法):
因此,问题中的代码是生成器的一部分。我意识到,由于生成器只运行了一个张量流图(希望术语是正确的,我对此还是很陌生),所以我可以在最后进行转换:
feature_1, feature_2, y = sess.run(next_el)
yield [feature_1, feature_2], y
虽然可行,但我仍然可以在map函数中做到这一点。