【TensorFlow】(三)tf.feature_column.shared_embedding_columns()函数的用法

1.作用

将sparse、categorical输入,转为dense column。这类似于embedding_column ,不同之处在于它产生嵌入共享相同的嵌入权重列的列表。在TensorFlow2.0中叫tf.feature_column.shared_embeddings()。

输入参数:

categorical_columns通过创建一个类别列的列表categorical_column_with_*功能。这些列将产生稀疏的ID是输入嵌入查找。所有列都必须是同一类型的,并且具有相同的参数,除了key 。例如,他们可以categorical_column_with_vocabulary_file与同vocabulary_file。一些或所有列也可能是weighted_categorical_column。
dimension一个整数,指定嵌入的尺寸,必须> 0。
combiner

如何指定一个字符串,以减少是否有单排多个条目。目前,“mean”,“sqrtn”和“sum”的支持,以“mean”的默认值。 “sqrtn”经常取得了较好的精度,特别是与针对输入为词的列。此每一个都可以被认为是在列水平归一化。欲了解更多信息,请参见tf.embedding_lookup_sparse 。

initializer在嵌入变量初始化所使用的变量的初始化功能。如果未指定,默认为truncated_normal_initializer均值0.0和标准偏差1/sqrt(dimension) 。
shared_embedding_collection_name这些列的可选总称。如果不给出一个合理的名称将根据名称来选择categorical_columns 。
ckpt_to_load_from字符串代表关卡名称/从中还原列权重模式。如果需要的话tensor_name_in_ckptNone 。
tensor_name_in_ckpt该名Tensorckpt_to_load_from从中恢复列权重。如果需要的话ckpt_to_load_fromNone 。
max_norm如果不是None ,如果它的L2范数大于这个值,结合之前各嵌入被裁剪。(避免参数embedding后的向量过大)
trainable无论嵌入是能够接受训练。默认为True。

输出:

稠密列表,结果的顺序遵循的顺序categorical_columns 。

2.例子

注意:

  1. tf.feature_column.shared_embedding_columns()函数的输入是对类别特征进行hash或者one-hot之后的list。
  2. categorical_column_with_*的bucket_size跟tf.feature_column.shared_embedding_columns()中的dimension没有之间关系,bucket_size是你对类别特征进行映射的大小;后者dimension是你要embedding的向量维度。
# -*- coding: utf-8 -*-
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 department
print "——————2————"
#组合特征列
columns = [department]
print columns
columns = tf.feature_column.shared_embedding_columns(columns, 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.05679376  0.30380946 -0.00690177 -0.0920149  -0.37978074 -0.03548807
   0.03643319  0.01148186  0.08708773  0.19076113]
 [-0.05679376  0.30380946 -0.00690177 -0.0920149  -0.37978074 -0.03548807
   0.03643319  0.01148186  0.08708773  0.19076113]
 [ 0.1966852   0.08005933  0.02070881 -0.04092572 -0.1450257  -0.34694198
  -0.10393345  0.00058411  0.3635449   0.4857725 ]
 [ 0.07504455 -0.06521942  0.06507228  0.17408054 -0.40250075 -0.01091835
   0.35192814 -0.20619783  0.29015994  0.1381938 ]
 [ 0.1966852   0.08005933  0.02070881 -0.04092572 -0.1450257  -0.34694198
  -0.10393345  0.00058411  0.3635449   0.4857725 ]]

多个量共享embedding,维度变长,double增长,用途:同一个类型的变量,共享同一一个空间?待完善。

# -*- coding: utf-8 -*
import tensorflow as tf

sess = tf.Session()
# 特征数据
features = {
    'department': ['sport', 'sport', 'drawing', 'gardening', 'travelling'],
    'dddd': ['sport', 'sport', 'drawing', 'gardening', 'travelling'],
}
# 特征列
department = tf.feature_column.categorical_column_with_hash_bucket('department', 10, dtype=tf.string)
dd = []
dd.append(department)
dd.append(tf.feature_column.categorical_column_with_hash_bucket('dddd', 10, dtype=tf.string))

print "—————1—————"
print department
print "——————2————"
# 组合特征列
columns = dd
print columns
columns = tf.feature_column.shared_embedding_columns(columns, 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.09610736 -0.35665867 -0.46561095  0.08378798  0.24317417  0.2871368
   0.04707814  0.41457146  0.15167095  0.23440133  0.09610736 -0.35665867
  -0.46561095  0.08378798  0.24317417  0.2871368   0.04707814  0.41457146
   0.15167095  0.23440133]
 [ 0.09610736 -0.35665867 -0.46561095  0.08378798  0.24317417  0.2871368
   0.04707814  0.41457146  0.15167095  0.23440133  0.09610736 -0.35665867
  -0.46561095  0.08378798  0.24317417  0.2871368   0.04707814  0.41457146
   0.15167095  0.23440133]
 [ 0.06731322  0.24726458 -0.07253622 -0.51096314  0.4155461   0.25300828
   0.04620391  0.48813507  0.31652704  0.21498448  0.06731322  0.24726458
  -0.07253622 -0.51096314  0.4155461   0.25300828  0.04620391  0.48813507
   0.31652704  0.21498448]
 [ 0.25455624 -0.15391532 -0.05924602 -0.51533717 -0.05295704  0.30715698
   0.02884303  0.11610222 -0.08384481  0.40862226  0.25455624 -0.15391532
  -0.05924602 -0.51533717 -0.05295704  0.30715698  0.02884303  0.11610222
  -0.08384481  0.40862226]
 [ 0.06731322  0.24726458 -0.07253622 -0.51096314  0.4155461   0.25300828
   0.04620391  0.48813507  0.31652704  0.21498448  0.06731322  0.24726458
  -0.07253622 -0.51096314  0.4155461   0.25300828  0.04620391  0.48813507
   0.31652704  0.21498448]]

参考:

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

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值