使用tf.data.Dataset在tensorflow中进行多个热编码

使用tf.data.Dataset在tensorflow中进行多个热编码,tensorflow,tensorflow-datasets,tensorflow-estimator,Tensorflow,Tensorflow Datasets,Tensorflow Estimator,我对tfapi TF.data.Dataset.from_tensor_slices()有问题 下面的代码运行良好: features = {'letter': [['A','A'], ['C','D'], ['E','F'], ['G','A'], ['X','R']]} letter_feature = tf.feature_column.categorical_column_with_vocabulary_list( "letter", ["A", "B"

我对tfapi TF.data.Dataset.from_tensor_slices()有问题

下面的代码运行良好:

features = {'letter': [['A','A'], ['C','D'], ['E','F'], ['G','A'], ['X','R']]}

letter_feature = tf.feature_column.categorical_column_with_vocabulary_list(
                "letter", ["A", "B", "C"], dtype=tf.string)

target = [1,0,1,0,1]

indicator = tf.feature_column.indicator_column(letter_feature)

def make_input_fn (X,y):
    def input_fn():
        return (X,y)
    return input_fn

# THE INPUT FUNCTION WILL RETURN A SET : ( {'letter':[['A','A'],['C','D']...]}, [1,0,...] )

linear_estimator = tf.estimator.LinearClassifier(indicator)
input_fn = make_input_fn(features, target)

linear_estimator.train(input_fn)

这基本上允许我使用指标特征_列将一列形状(-1,2)输入到我的估计器模型中

现在我对以下用例有一个问题:

df_features = pd.DataFrame.from_dict(features)

######### this is the dataframe features####
#letter
#[A, A, A]
#[B, C, D]
#[B, E, F]
#[B, G, A]
#[B, X, R]

def make_input_fn (X,y):
    def input_fn():
        ds = tf.data.Dataset.from_tensor_slices((dict(X),y))
        ds = ds.shuffle(128)
        return ds
    return input_fn

linear_estimator = tf.estimator.LinearClassifier(indicator)
input_fn = make_input_fn(df_features,target)

linear_estimator.train(input_fn)
我最终得到了这个错误:


TypeError: Could not build a TypeSpec for 0    [A, A, A]
1    [B, C, D]
2    [B, E, F]
3    [B, G, A]
4    [B, X, R]
Name: letter, dtype: object with type Series ...
TypeError: Expected binary or unicode string, got ['A', 'A', 'A']

这真的很烦人,因为如果我有大数据集,我需要使用tf.data.dataset api为我的估计器提供小批量的训练,并最终分发训练过程

我需要一个解决方法来克服这个问题,我考虑过生成器,但我不确定如何实现它,但我想确定是否还有其他解决方案


谢谢大家!

为社区的利益详细阐述理查德的评论

错误,
TypeError:got['A','A','A']的预期二进制或unicode字符串可以通过进行以下更改来解决:

1. tf.data.Dataset.from_tensor_slices((dict(X), tf.one_hot(y, depth=2))) 
2. input_fn = make_input_fn(features,target) 
3. linear_estimator.train(input_fn, steps=2).
完整的工作代码如下所示:

import pandas as pd
import tensorflow as tf

features = {'letter': [['A','A'], ['C','D'], ['E','F'], ['G','A'], ['X','R']]}

df_features = pd.DataFrame.from_dict(features)

######### this is the dataframe features####
#letter
#[A, A, A]
#[B, C, D]
#[B, E, F]
#[B, G, A]
#[B, X, R]

letter_feature = tf.feature_column.categorical_column_with_vocabulary_list(
                "letter", ["A", "B", "C"], dtype=tf.string)


indicator = tf.feature_column.indicator_column(letter_feature)

target = [1,0,1,0,1]

def make_input_fn (X,y):
    def input_fn():
        ds = tf.data.Dataset.from_tensor_slices((dict(X), tf.one_hot(y, depth=2)))
        ds = ds.shuffle(128)
        return ds
    return input_fn

linear_estimator = tf.estimator.LinearClassifier(indicator)

input_fn = make_input_fn(features,target)

linear_estimator.train(input_fn, steps=2)

学习愉快

你找到解决办法了吗?我想我可能误解了你的代码。。。所以一个输入样本可能是['A','A',],它的标签不知怎的是1,对吗?那么,为什么对于['E','F'],标签仍然是1?。。。我通过三个修改使代码运行:1<代码>tf.data.Dataset.来自张量切片((dict(X),tf.one\u hot(y,深度=2))
;2. <代码>输入\u fn=进行输入\u fn(功能、目标);3. <代码>线性估计器序列(输入fn,步数=2)。如果这些更改没有意义,请解释功能和目标的含义。