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
)
参数解释:
训练一个给定训练数据 input_fn 的模型。
train(
input_fn,
hooks=None,
steps=None,
max_steps=None
)
模型评估函数。
evaluate(
input_fn,
steps=None,
hooks=None,
checkpoint_path=None,
name=None
)
参数:
预测函数。
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 columns),原始数据和 Estimator 之间的媒介,在输入数据(由input_fn返回)与模型之间架起了桥梁。
要创建特征列,需要调用 tf.feature_column 模块的函数。这里介绍了该模块中的 9 个函数。如下图所示,除了 bucketized_column 外的函数要么返回一个 Categorical Column 对象,要么返回一个 Dense Column 对象。
下面详细介绍这些函数。
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)
有时候,我们并不直接将一个数值直接传给模型,而是根据数值范围将其值分为不同的 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 矢量。
因为不能直接向模型中输入字符串,我们必须首先将字符串映射为数值或类别值。Categorical vocabulary column 可以将字符串表示为one_hot格式的向量。
字符串 | 表示 |
---|---|
Female | [1, 0] |
Male | [0, 1] |
TensorFlow提供了两种不同的函数去创建categorical vocabulary columns:
gender = tf.feature_column.categorical_column_with_vocabulary_list(
key="gender", vocabulary_list=["Female", "Male"])
上面的函数非常简单,但它有一个明显的缺点。那就是,当词汇表很长时,比如中国有哪些省、市等,需要输入的内容太多了。在这种情况下,可以调用 tf.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
到目前为止,我们处理的示例都包含很少的类别。但当类别的数量特别大时,我们不可能为每个词汇或整数设置单独的类别,因为这将会消耗非常大的内存。对于此类情况,我们可以反问自己:“我愿意为我的输入设置多少类别?”实际上,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)
需要注意的是,我们是将不同的输入值强制划分成更少数量的类别。这意味着,两个可能不相关的输入会被映射到同一个类别,这样一来,神经网络也会面临同样的结果。与机器学习中的很多反直觉现象一样,事实证明哈希技术经常非常有用。这是因为哈希类别为模型提供了一些分隔方式。模型可以使用其他特征进一步将厨具与运动用品分隔开来。
通过将多个特征组合为一个特征(称为特征组合),模型可学习每个特征组合的单独权重。
例如:假设我们希望模型计算佐治亚州亚特兰大的房地产价格,这个城市的房地产价格在不同位置差异很大。在确定对房地产位置的依赖性方面,将纬度和经度表示为单独的特征用处不大;但是,将纬度和经度组合为一个特征则可精确定位位置。
在实践中特征组合能够有效地提升模型的效果。
如下所示,并非所有 Estimator 都支持所有类型的 feature_columns 参数:
参数:
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