【TensorFlow】(四)tf.feature_column.embedding_column()函数

1.作用

将sparse/categrical特征转化为dense 向量。one-hot产生的向量,易造成数据的稀疏化,对于推荐系统而言,大维度的稀疏数据对于结果的影响较大,因此我们考虑使用embedding_column,来对数据进行压缩。

输入:

categorical_column一个CategoricalColumn创建由categorical_column_with_*功能。此列产生稀疏的ID为输入给嵌入查找。
dimension一个整数,指定嵌入的尺寸,必须> 0。
combiner如何指定一个字符串,以减少是否有单排多个条目。目前,“mean”,“sqrtn”和“sum”的支持,以“sqrtn”的默认值。 “sqrtn”经常取得了较好的精度,特别是与袋的词列。此每一个都可以被认为是在列水平归一化。欲了解更多信息,请参见tf.embedding_lookup_sparse 。
initializer在嵌入变量初始化所使用的变量的初始化功能。如果未指定,默认为truncated_normal_initializer均值0.0和标准偏差1/sqrt(dimension) 。
ckpt_to_load_from字符串代表关卡名称/从中还原列权重模式。如果需要的话tensor_name_in_ckptNone 。
tensor_name_in_ckpt该名Tensorckpt_to_load_from从中恢复列权重。如果需要的话ckpt_to_load_fromNone 。
max_norm如果不是None ,嵌入值L2-归到这个值。
trainable无论嵌入是能够接受训练。默认为True。
use_safe_embedding_lookup如果为真,使用safe_embedding_lookup_sparse而不是embedding_lookup_sparse。 safe_embedding_lookup_sparse确保没有空行和所有的权重和IDS是在额外的计算成本为代价的正面。这仅适用于秩2(N×M个)形状的输入张量。默认为真,认为如果不需要上述检查关闭。注意,具有空行不会触发任何错误,虽然输出结果可能是0或省略。

输出:

每一个类别生成一个dense的向量。

2.例子

import tensorflow as tf
sess=tf.Session()
#特征数据
features = {
    'department': ['sport', 'sport', 'drawing', 'gardening', 'travelling'],
}
#特征列
department = tf.feature_column.categorical_column_with_hash_bucket('department', 10, dtype=tf.string)
print "—————1—————"
# print columns
columns = tf.feature_column.embedding_column(department, dimension=10)
#输入层(数据,特征列)
inputs = tf.feature_column.input_layer(features, columns)
#初始化并运行
init = tf.global_variables_initializer()
sess.run(tf.tables_initializer())
sess.run(init)

v=sess.run(inputs)
print(v)

输出:

[[ 0.53917825  0.12470714  0.36257058 -0.27178663  0.22339591 -0.07271086
   0.06099864  0.520078   -0.33505204 -0.11995942]
 [ 0.53917825  0.12470714  0.36257058 -0.27178663  0.22339591 -0.07271086
   0.06099864  0.520078   -0.33505204 -0.11995942]
 [ 0.02904907  0.47831646  0.32324752  0.48403072  0.26939172  0.38538367
  -0.03237799  0.07358446 -0.09673704 -0.45041117]
 [-0.26118422  0.36279836 -0.36552393  0.49025697 -0.34702778 -0.12992676
  -0.43512756  0.5454379  -0.3286348  -0.03985294]
 [ 0.02904907  0.47831646  0.32324752  0.48403072  0.26939172  0.38538367
  -0.03237799  0.07358446 -0.09673704 -0.45041117]]

3.thinking:跟tf.feature_column.shared_embedding_columns()函数有什么区别

官方文档给的解释:shared_embedding_columns跟embedding_column ,不同之处在于它产生嵌入共享相同的嵌入权重列的列表。怎么理解共享权重?欢迎留言~

 

参考:

1.官方文档:https://www.tensorflow.org/versions/r1.15/api_docs/python/tf/feature_column/embedding_column

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是在嵌入层使用PGD生成扰动样本的TensorFlow版本代码: ```python import tensorflow as tf def pgd_attack(emb, input_data, eps=0.3, alpha=0.01, iters=40): """ PGD攻击方法的实现 :param emb: 嵌入层 :param input_data: 原始输入数据 :param eps: 扰动范围 :param alpha: 每一步的扰动大小 :param iters: 迭代次数 :return: 对原始数据的PGD攻击后的结果 """ delta = tf.Variable(tf.zeros_like(input_data), trainable=True) # 初始化扰动 for i in range(iters): with tf.GradientTape() as tape: input_adv = emb(input_data + delta) # 对输入数据加上扰动后,再通过嵌入层进行处理 loss = tf.reduce_mean(tf.square(input_adv - emb(input_data))) # 计算损失函数 gradient = tape.gradient(loss, delta) # 计算损失函数关于扰动的梯度 signed_grad = tf.sign(gradient) # 对梯度进行符号函数操作 delta = tf.clip_by_value(delta + alpha * signed_grad, -eps, eps) # 对扰动进行更新,并进行截断 return input_data + delta # 返回对原始数据进行PGD攻击后的结果 ``` 其中,参数`emb`是嵌入层,`input_data`是原始输入数据,`eps`是扰动范围,`alpha`是每一步的扰动大小,`iters`是迭代次数。 在函数内部,我们首先初始化一个可训练的扰动`delta`,并进行`iters`次迭代,每次迭代都对输入数据加上扰动后,再通过嵌入层进行处理,并计算出损失函数。然后,我们计算损失函数关于扰动的梯度,并对梯度进行符号函数操作。最后,我们对扰动进行更新,并进行截断。最终,我们返回对原始数据进行PGD攻击后的结果。 需要注意的是,在嵌入层中使用PGD攻击时,我们需要对输入数据进行嵌入处理,并将嵌入处理后的结果作为扰动的输入。这样才能保证扰动对嵌入层产生影响。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值