zoukankan      html  css  js  c++  java
  • sparse_tensor feed_dict的时候十分不方便。

    假如说,你再处理文本的时候,写tfrecord的时候用的变长的类型,

    example = tf.train.Example(features=tf.train.Features(feature={
    'feats': _int64_feature(query_feats)
    }))

    那么读的时候会用到

    features = tf.parse_single_example(
    serialized_example,
    features={
    'feats': tf.VarLenFeature(tf.int64)
    })
    feats=features['feats']
    return feats

    这个东西返回值会是一个sparse_tensor,那么在embding_lookup的时候需要用到sparse的函数:

    tf.nn.embedding_lookup_sparse(emb,feats, None, combiner="sum")

    这在你用tfrecord的时候不会有什么问题,因为tensorflow会自动给你转换成sparse_tensor从而进行embding_lookup_sparse。

    但是当你需要feed_dict进行测试的时候,非常不方便:

    加入图是这么定义的:

    sp_t=tf.sparse_placeholder(tf.int64)

    res =tf.nn.embedding_lookup_sparse(emb,sp_t, None, combiner="sum")

    举个简单的例子,比如我的矩阵是[1,2]

    那么你feed_dict的时候需要:

    sess.run(res,feed_dict={sp_t:tf.SparseTensorValue([[0,1], [0,2]], [1, 2], [1, 3]) })

    你看多麻烦,你是需要把你的稀疏矩阵的格式转化成SparseTensorValue的格式,

    所以呢,我看了一部分人是这么搞的,

    1,在生成tfrecord的进行padding,所有处理都当成dense来处理。这样的缺点是tfrecord占用空间比较大

    2,在读取到sparse tensor之后使用sparse_to_dense函数转成dense,build graph的时候用dense的来build,这样feed的时候也用可以直接输入的dense的矩阵。注意(sparse_to_dense可以指定padding的长度,sparse_tensor_to_dense会padding到自身最大的长度,如果是每个batch sequence长度不一样的话,用sparse_tensor_to_dense)

    参考:

    http://stackoverflow.com/questions/41105751/feeding-tensorflow-sparse-matrix-for-sparse-dense-multiplication-getting-the-fo

  • 相关阅读:
    Java内部类详解
    Mac连接linux服务器
    mac 添加环境变量(jmeter添加至环境变量中)
    Charles使用断点修改返回或请求参数
    解决git clone速度慢的问题
    group by分组后获得每组中时间最大的那条记录
    使用Charles进行弱网测试
    http常见的状态码
    Mac使用Charles抓取ios手机APP中的https请求
    airtest使用poco方法的断言知识
  • 原文地址:https://www.cnblogs.com/dmesg/p/6882531.html
Copyright © 2011-2022 走看看