文章目录
tf.estimator.DNNLinearCombinedClassifier,其中DNNLinearCombinedClassifier 类继承自Estimator。
DNNLinearCombinedClassifier
init
DNNLinearCombinedClassifier的初始化
_init__(
model_dir=None,
linear_feature_columns=None,
linear_optimizer='Ftrl',
dnn_feature_columns=None,
dnn_optimizer='Adagrad',
dnn_hidden_units=None,
dnn_activation_fn=tf.nn.relu,
dnn_dropout=None,
n_classes=2,
weight_column=None,
label_vocabulary=None,
input_layer_partitioner=None,
config=None
)
参数解释:
- model_dir:保存模型参数的地址。
- linear_feature_columns:包含模型线性部分使用的所有的特征列。
- linear_optimizer:tf.Optimizer ,线性优化器,默认为 FTRL 优化器。
- dnn_feature_columns:包含模型深层部分所使用的所有的特征列。
- dnn_optimizer:tf.Optimizer,默认为 Adagrad 优化器。
- dnn_hidden_units:隐藏层的参数设置,所有层都完全连接。
- dnn_activation_fn:激活函数应用于每个层。如果无,将使用 tf.nn.relu。
- dnn_dropout:dropou参数。
- n_classes:标签类的数量,默认为 2。。
- weight_column:通过 tf.feature_column.numeric_column 创建的一个字符串或者 _NumericColumn 用来定义表示权重的特征列。
label_vocabulary:字符串列表,表示标签。
input_layer_partitioner:输入层分区
注:如果 linear_feature_columns 和 dnn_features_columns 都同时为空会报ValueError错误。
train
训练一个给定训练数据 input_fn 的模型。
train(
input_fn,
hooks=None,
steps=None,
max_steps=None
)
evaluate
模型评估函数。
evaluate(
input_fn,
steps=None,
hooks=None,
checkpoint_path=None,
name=None
)
参数:
- input_fn:它返回一组用于验证的数据的函数,是一个元组:features - Dictionary 的字符串特征名到 Tensor 或 SparseTensor.labels - Tensor或带标签的张量字典(dict).
- steps:评估模型的步骤数,评估结束条件。如果为 None,直到 input_fn 引发 end-of-input 异常时,评估结束。
- name:如果用户需要在不同数据集上运行多个评估,则设置评估的名称。不同评估的度量值保存在单独的文件夹中。
predict
预测函数。
predict(
input_fn,
predict_keys=None,
hooks=None,
checkpoint_path=None
)
得到:
计算预测张量的值.
注意:
ValueError:在 model_dir 中找不到训练有素的模型.
ValueError:如果批量长度的预测不一致.
ValueError:如果 predict_keys 和 predictions 之间存在冲突.例如,如果 predict_keys 不是 None,但 EstimatorSpec.predictions 不是 dict.
Feature column
特征列(feature columns),原始数据和 Estimator 之间的媒介,在输入数据(由input_fn返回)与模型之间架起了桥梁。
要创建特征列,需要调用 tf.feature_column 模块的函数。这里介绍了该模块中的 9 个函数。如下图所示,除了 bucketized_column 外的函数要么返回一个 Categorical Column 对象,要么返回一个 Dense Column 对象。
下面详细介绍这些函数。
1.numeric_columns(数值列)
tf.feature_column.numeric_column 有许多可选参数,如果不指定可选参数,将默认指定该特征列的数值类型为 tf.float32。
age = tf.feature_column.numeric_column("age")
可以使用dtype参数来指定数值类型。
age = tf.feature_column.numeric_column(key="age",dtype=tf.float64)
2.bucketized_column(分桶列)
有时候,我们并不直接将一个数值直接传给模型,而是根据数值范围将其值分为不同的 categories。上述功能可以通过 tf.feature_column.bucketized_column 来实现。以人的年龄为例,我们并非以标量数值列表示年龄,而是将年龄分成不同的四个分桶:幼年、青年、中年、老年,每个桶代表一个年龄段,也就是一类人映射到一个桶里。
模型将按以下方式表示这些 bucket:
年龄范围 | 表示 |
---|---|
<16 | [1, 0, 0, 0] |
>=16岁 但<35岁 | [0, 1, 0, 0] |
>=35岁 但<60岁 | [0, 0, 1, 0] |
>=60岁 | [0, 0, 0, 1] |
为什么要将数字(一个完全有效的模型输入)拆分为分类值?
首先,该分类将单个输入数字分成了一个四元素矢量,因此模型现在可以学习四个单独的权重而不是一个。四个权重能够创建一个更强大的模型。
:一段时间映射到一个桶
# 首先,将原始输入转换为一个numeric column
age = tf.feature_column.numeric_column("age")
# 然后,按照边界将numeric column进行bucket,这里分成了11个桶。
age_buckets = tf.feature_column.bucketized_column(
age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])
请注意,指定一个n元素边界矢量可创建一个n+1元素 bucket 矢量。
3.categorical_column_with_identity(类别标识列)
4.Categorical vocabulary column(类别词汇表)
因为不能直接向模型中输入字符串,我们必须首先将字符串映射为数值或类别值。Categorical vocabulary column 可以将字符串表示为one_hot格式的向量。
字符串 | 表示 |
---|---|
Female | [1, 0] |
Male | [0, 1] |
TensorFlow提供了两种不同的函数去创建categorical vocabulary columns:
4.1tf.feature_column.categorical_column_with_vocabulary_list
gender = tf.feature_column.categorical_column_with_vocabulary_list(
key="gender", vocabulary_list=["Female", "Male"])
上面的函数非常简单,但它有一个明显的缺点。那就是,当词汇表很长时,比如中国有哪些省、市等,需要输入的内容太多了。在这种情况下,可以调用 tf.feature_column.categorical_column_with_vocabulary_file,以便将词汇表放在单独的文件中。
4.2tf.feature_column.categorical_column_with_vocabulary_file
vocabulary_feature_column =
tf.feature_column.categorical_column_with_vocabulary_file(
key='city',
vocabulary_file="china_city.txt",
vocabulary_size=3)
china_city.txt 应该让每个词汇各占一行。在我们的示例中:
beijing
shanghai
guanghzou
shenzhen
hanghzou
5.Hashed Column(哈希列)
到目前为止,我们处理的示例都包含很少的类别。但当类别的数量特别大时,我们不可能为每个词汇或整数设置单独的类别,因为这将会消耗非常大的内存。对于此类情况,我们可以反问自己:“我愿意为我的输入设置多少类别?”实际上,tf.feature_column.categorical_column_with_hash_bucket 函数使您能够指定类别的数量。对于这种 feature column,模型会计算输入值的 hash 值,然后使用模运算符将其置于其中一个 hash_bucket_size 类别中。
city= tf.feature_column.categorical_column_with_hash_bucket(
"city", hash_bucket_size=1000)
需要注意的是,我们是将不同的输入值强制划分成更少数量的类别。这意味着,两个可能不相关的输入会被映射到同一个类别,这样一来,神经网络也会面临同样的结果。与机器学习中的很多反直觉现象一样,事实证明哈希技术经常非常有用。这是因为哈希类别为模型提供了一些分隔方式。模型可以使用其他特征进一步将厨具与运动用品分隔开来。
6.crossed_columns(组合列)
通过将多个特征组合为一个特征(称为特征组合),模型可学习每个特征组合的单独权重。
例如:假设我们希望模型计算佐治亚州亚特兰大的房地产价格,这个城市的房地产价格在不同位置差异很大。在确定对房地产位置的依赖性方面,将纬度和经度表示为单独的特征用处不大;但是,将纬度和经度组合为一个特征则可精确定位位置。
在实践中特征组合能够有效地提升模型的效果。
将特征列传递给 Estimator(非常重要)
如下所示,并非所有 Estimator 都支持所有类型的 feature_columns 参数:
- LinearClassifier 和 LinearRegressor:接受所有类型的特征列。
- DNNClassifier 和 DNNRegressor:只接受密集列。其他类型的列必须封装 在 indicator_column 或 embedding_column 中。
- DNNLinearCombinedClassifier 和 DNNLinearCombinedRegressor:
- linear_feature_columns 参数接受任何类型的特征列。
- dnn_feature_columns 参数只接受密集列。
bucketized_column都要用numeric_column包装一下:分箱,需要告诉边界
numeric_column
indicator_column:指示列
embedding_column:嵌入列,嵌入列表的维数等于类别总数开4次方
分类特征列:
categorical_column_with_identity用indicator_column包装一下:类别特征,类是数字
categorical_column_with_vocabulary_list用indicator_column包装一下:类别特征,类是文字
categorical_column_with_vocabulary_file用indicator_column包装一下:类别特征,类是文字,在文件中
categorical_column_with_hash_bucket用indicator_column包装一下:用哈希分桶
crossed_column用indicator_column包装一下:把多个特征合并成为一个特征
参数:
DNNLinear:
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4gn82dty.html
https://blog.csdn.net/weixin_42499236/article/details/84256558
Feature column:
https://blog.csdn.net/u014061630/article/details/82937333
https://blog.csdn.net/u014021893/article/details/80423112