tf.one_hot()

一、独热编码

独热编码(one-hot encoding),独热编码一般是在有监督学习中对数据集进行标注时候使用的,指的是在分类问题中,将存在数据类别的那一类用X表示,不存在的用Y表示,这里的X常常是1, Y常常是0。

e.g.如果我们有3类问题,有数据(Xi,Yi),其中类别Yi有3种取值。

如果Yj为第一类那么其独热编码为:

如果Yj为第二类那么其独热编码为:

只对存在有该类别的数的位置上进行标记为1,其他皆为0。一般用于计算交叉熵损失函数。

二、tf.one_hot()

tf.one_hot()函数是将input转化为one-hot类型数据输出,相当于将多个数值联合放在一起作为多个相同类型的向量,可用于表示各自的概率分布,通常用于分类任务中作为最后的FC层的输出,有时翻译成“独热”编码。 

one_hot(
    indices,#输入,这里是一维的
    depth,# one hot dimension.
    on_value=None,#output 默认1
    off_value=None,#output 默认0
    axis=None,
    dtype=None,
    name=None
)

需要指定indices,和depth,其中depth是编码深度,on_value和off_value相当于是编码后的开闭值,如同我们刚才描述的X值和Y值,需要和dtype相同类型(指定了dtype的情况下),axis指定编码的轴。

indices表示输入的多个数值,通常是矩阵形式;depth表示输出的尺寸。 
由于one-hot类型数据长度为depth位,其中只用一位数字表示原输入数据,这里的on_value就是这个数字,默认值为1,one-hot数据的其他位用off_value表示,默认值为0。

indices = 0 对应的输出是[1, 0 … 0, 0], indices = 1 对应的输出是[0, 1 … 0, 0], 依次类推,最大可能值的输出是[0, 0 … 0, 1]。

三、例子

import tensorflow as tf  

classes = 3
labels = tf.constant([0,1,2]) # 输入的元素值最小为0,最大为2
output = tf.one_hot(labels,classes)

sess = tf.Session()
with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    output = sess.run(output)
    print("output of one-hot is : ",output)
output of one-hot is :  
[[ 1.  0.  0.]
 [ 0.  1.  0.]
 [ 0.  0.  1.]]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
代码分析如下: ```python def cnn_model(features, target): # 对target进行one-hot编码 target = tf.one_hot(target, 15, 1, 0) # 对features中的词进行embedding,得到词向量 word_vectors = tf.contrib.layers.embed_sequence(features, vocab_size=n_words, embed_dim=EMBEDDING_SIZE, scope='words') # 在词向量上增加一个维度,用于卷积 word_vectors = tf.expand_dims(word_vectors, 3) with tf.variable_scope('CNN_Layer1'): # 添加卷积层 conv1 = tf.contrib.layers.convolution2d(word_vectors, N_FILTERS, FILTER_SHAPE1, padding='VALID') # 对卷积结果进行ReLU非线性变换 conv1 = tf.nn.relu(conv1) # 对卷积结果进行最大池化 pool1 = tf.nn.max_pool(conv1, ksize=[1, POOLING_WINDOW, 1, 1], strides=[1, POOLING_STRIDE, 1, 1], padding='SAME') # 对池化结果进行转置,以满足形状要求 pool1 = tf.transpose(pool1, [0, 1, 3, 2]) with tf.variable_scope('CNN_Layer2'): # 添加卷积层 conv2 = tf.contrib.layers.convolution2d(pool1, N_FILTERS, FILTER_SHAPE2, padding='VALID') # 对卷积结果进行ReLU非线性变换 conv2 = tf.nn.relu(conv2) # 对卷积结果进行最大池化 pool2 = tf.squeeze(tf.reduce_max(conv2, 1), squeeze_dims=[1]) # 将池化结果送入全连接层,输出最终的分类结果 logits = tf.contrib.layers.fully_connected(pool2, 15, activation_fn=None) loss = tf.losses.softmax_cross_entropy(target, logits) train_op = tf.contrib.layers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer='Adam', learning_rate=LEARNING_RATE) return ({ 'class': tf.argmax(logits, 1), 'prob': tf.nn.softmax(logits) }, loss, train_op) ``` 1. `tf.one_hot(target, 15, 1, 0)`:对target进行one-hot编码,将每个词转化为一个长度为15的向量,其中对应的位置为1,其余为0。 2. `tf.contrib.layers.embed_sequence(features, vocab_size=n_words, embed_dim=EMBEDDING_SIZE, scope='words')`:对features(即输入的词)进行embedding,将每个词转化为一个EMBEDDING_SIZE维的向量。 3. `tf.expand_dims(word_vectors, 3)`:在词向量上增加一个维度,用于卷积。 4. `tf.contrib.layers.convolution2d(word_vectors, N_FILTERS, FILTER_SHAPE1, padding='VALID')`:添加卷积层,使用N_FILTERS个大小为FILTER_SHAPE1的滤波器进行卷积操作。 5. `tf.nn.relu(conv1)`:对卷积结果进行ReLU非线性变换。 6. `tf.nn.max_pool(conv1, ksize=[1, POOLING_WINDOW, 1, 1], strides=[1, POOLING_STRIDE, 1, 1], padding='SAME')`:对卷积结果进行最大池化,使用大小为POOLING_WINDOW的池化窗口,步长为POOLING_STRIDE。 7. `tf.transpose(pool1, [0, 1, 3, 2])`:对池化结果进行转置,将第3维和第4维交换,以满足后续卷积层的输入要求。 8. `tf.contrib.layers.convolution2d(pool1, N_FILTERS, FILTER_SHAPE2, padding='VALID')`:添加卷积层,使用N_FILTERS个大小为FILTER_SHAPE2的滤波器进行卷积操作。 9. `tf.nn.relu(conv2)`:对卷积结果进行ReLU非线性变换。 10. `tf.squeeze(tf.reduce_max(conv2, 1), squeeze_dims=[1])`:对卷积结果进行最大池化,并去除不必要的维度。 11. `tf.contrib.layers.fully_connected(pool2, 15, activation_fn=None)`:将池化结果送入全连接层,输出最终的分类结果。 12. `tf.losses.softmax_cross_entropy(target, logits)`:计算损失函数,使用softmax交叉熵作为损失函数。 13. `tf.contrib.layers.optimize_loss(loss, tf.contrib.framework.get_global_step(), optimizer='Adam', learning_rate=LEARNING_RATE)`:使用Adam优化器最小化损失函数,更新模型参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蹦跶的小羊羔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值