• tensorflow中的一些语法问题


    一、tf.range()生成数字序列

    range()函数用于创建数字序列变量,有以下两种形式:

    range(limit, delta=1, dtype=None, name='range')
    range(start, limit, delta=1, dtype=None, name='range')

    该数字序列开始于 start 并且将以 delta 为增量扩展到不包括 limit 时的最大值结束,类似python的range函数。

    二、tf.expand_dims()

    TensorFlow中,想要维度增加一维,可以使用tf.expand_dims(input, dim, name=None)函数。当然,我们常用tf.reshape(input, shape=[])也可以达到相同效果,但是有些时候在构建图的过程中,placeholder没有被feed具体的值,这时就会包下面的错误:TypeError: Expected binary or unicode string, got 1

    tf.expand_dims(x,[]) 列表的内容表示在第几个维度上增加

    例子如下:

    # 't' is a tensor of shape [2]
    shape(expand_dims(t, 0)) ==> [1, 2]
    shape(expand_dims(t, 1)) ==> [2, 1]
    shape(expand_dims(t, -1)) ==> [2, 1]

    # 't2' is a tensor of shape [2, 3, 5]
    shape(expand_dims(t2, 0)) ==> [1, 2, 3, 5]
    shape(expand_dims(t2, 2)) ==> [2, 3, 1, 5]
    shape(expand_dims(t2, 3)) ==> [2, 3, 5, 1]

    三、tf.tile()

    tf.tile()在指定维度上复制tensor一定次数 [2,1]表示在第一个维度上(行)重复2次,列上重复1次 
    import tensorflow as tf
    
    with tf.Session() as sess:
        a = tf.constant([[15, 16], [17, 18]])
        b = tf.tile(a, [1, 3])
        c = tf.tile(a, [3, 2])
        print('------------------------------------')
        print(sess.run(a))
        print('------------------------------------')
        print(sess.run(b))
        print('------------------------------------')
        print(sess.run(c))

    输出值如下:

    [[15 16]
     [17 18]]
    ------------------------------------
    [[15 16 15 16 15 16]
     [17 18 17 18 17 18]]
    ------------------------------------
    [[15 16 15 16]
     [17 18 17 18]
     [15 16 15 16]
     [17 18 17 18]
     [15 16 15 16]
     [17 18 17 18]]

     四、tf.strided_slice函数

    tf.strided_slice(
        input_,
        begin,
        end,
        strides=None,
        begin_mask=0,
        end_mask=0,
        ellipsis_mask=0,
        new_axis_mask=0,
        shrink_axis_mask=0,
        var=None,
        name=None
    )

    粗略地说,这个运算从给定的 input_ 张量中提取一个尺寸 (end-begin)/stride 的片段.从 begin 片段指定的位置开始,继续添加 stride 索引,直到所有维度都不小于 end.请注意,步幅可能是负值,这会导致反向切片.

    一个案例:

    t = tf.constant([[[1, 1, 1], [2, 2, 2]],
                     [[3, 3, 3], [4, 4, 4]],
                     [[5, 5, 5], [6, 6, 6]]])
    tf.strided_slice(t, [1, 0, 0], [2, 1, 3], [1, 1, 1])  # [[[3, 3, 3]]]
    tf.strided_slice(t, [1, 0, 0], [2, 2, 3], [1, 1, 1])  # [[[3, 3, 3],
                                                          #   [4, 4, 4]]]
    tf.strided_slice(t, [1, -1, 0], [2, -3, 3], [1, -1, 1])  # [[[4, 4, 4],
                                                             #   [3, 3, 3]]]

    五、训练过程中batch_size的设置问题

    一般来说,会设置成一个固定的值,直接使用。但是可以发现当预测时或者在解码器端(以机器翻译为例),如下:

     # 去掉句末的<EOS>
     ending = tf.strided_slice(self.decoder_targets, [0, 0], [self.batch_size, -1], [1, 1])
     # 添加上句首的<GO>
     self.decoder_inputs = tf.concat([tf.fill([self.batch_size, 1], self.en_word2id_dict['<GO>']), ending], 1) #将batch_size改成ending[0],防止不足一个batch的情况出现

    会用到batch_size,而当最后的样本不足一个batch_size时,表现为ending的第一维度不是batch_size,那么会出现维度不匹配的错误。

    所有可以将batch_size设置为超参数:

    batch_size=tf.placeholder(tf.int32,[],name='batch_size') #[None]也会报错

    作为一个张量来对待

  • 相关阅读:
    怎样应对突发性的开发需求
    ASP.NET过滤HTML标签只保留换行与空格的方法
    sqlserver 各种判断是否存在(表名、函数、存储过程等)
    Timing advance of GSM(时间提前量)
    对.NET中Hashtable和ArryList的理解
    GPS原始经纬度转百度经纬度
    baidu经纬度坐标与google经纬度坐标都转换
    .NET资料之-根据两点经纬度计算直线距离
    .net处理JSON简明教程
    在asp.net中要不使用其他插件的情况下只能使用定时器来检查, 并执行任务.
  • 原文地址:https://www.cnblogs.com/flightless/p/12003032.html
Copyright © 2020-2023  润新知