zoukankan      html  css  js  c++  java
  • 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]也会报错

    作为一个张量来对待

  • 相关阅读:
    背水一战 Windows 10 (61)
    背水一战 Windows 10 (60)
    背水一战 Windows 10 (59)
    背水一战 Windows 10 (58)
    背水一战 Windows 10 (57)
    背水一战 Windows 10 (56)
    背水一战 Windows 10 (55)
    背水一战 Windows 10 (54)
    背水一战 Windows 10 (53)
    背水一战 Windows 10 (52)
  • 原文地址:https://www.cnblogs.com/flightless/p/12003032.html
Copyright © 2011-2022 走看看