• 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

  • 相关阅读:
    LCD1602的第一个显示程序
    我的8*8点阵led做螺旋流水灯
    RS232电平TTL电平转换器MAX232相关
    如何自定义silverlight的加载页面
    关于一个页面中多个silverlight应用程序通信的总结
    ComboBox小技巧
    学习和分享的人
    转: 高效时间管理-介绍GTD
    转载:PHPexcel学习笔记2
    转载:PHPexcel学习笔记
  • 原文地址:https://www.cnblogs.com/dmesg/p/6882531.html
Copyright © 2020-2023  润新知