tensorflow index问题-1

记录一下tensorflow中的tensor index的解决方法。

问题描述:对一个矩阵的不同行做max-pooling/softmax。
比如对下面的矩阵按照编号0,1,2,3

0
0
1
1
1
2
3
3

max/avg/sum/product op
- 使用tf.segment分段
- 仅仅支持简单操作,不支持比如分组softmax的操作

tf.segment_max(data, segment_ids, name=None)
data: A Tensor. Must be one of the following types: float32, float64, int32, int64, uint8, int16, int8, uint16, half.
segment_ids: A Tensor. Must be one of the following types: int32, int64. A 1-D tensor whose rank is equal to the rank of data’s first dimension. Values should be sorted and can be repeated.

self.pooled = tf.nn.dropout(poolre, dropout)
self.bag_pool = tf.segment_mean(self.pooled, self.bag_seg)

分组操作前后矩阵维度变化
data:[8,11] + segment_ids([0,0,1,1,1,2,3,3];0/1/2/3是组编号)
-> data:[4,11]

对分组进行softmax

self.select_weigh = tf.exp(tf.gather_nd(weigh, self.bag_param))
self.select_sum = tf.gather(tf.segment_sum(self.select_weigh, self.bag_seg), self.bag_seg)
self.select_softmax = self.select_weigh / self.select_sum
self.poolne = tf.segment_sum(tf.expand_dims(self.select_softmax, 1) * poolre, self.bag_seg)
self.pooled = tf.nn.dropout(self.poolne, dropout)

这里获得和原始向量大小相同的向量。
segment_sum和gather配合使用

self.select_sum = tf.gather(tf.segment_sum(self.select_weigh, self.bag_seg), self.bag_seg)

相除获得softmax

self.select_softmax = self.select_weigh / self.select_sum

通过broadcast乘法得到softmax后的矩阵

self.poolne = tf.segment_sum(tf.expand_dims(self.select_softmax, 1) * poolre, self.bag_seg)

对矩阵先进行列采样再行采样
取元素方式如下

0×
0×
1o
1o
1o
2*
3@
3@

下面语句的
bag_param:[[0,0],[1,0],[2,1],[3,1],[4,1],[5,2],[6,3],[7,3]]
就可以得到以上index操作

self.select_weigh = tf.exp(tf.gather_nd(weigh, self.bag_param))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值