Tensorflow 笔记

  • tf.get_variable 和 tf.Variable的异同:

    • 他们都可以用来创建变量
    • 通过get_variable我们还可以获取到之前的变量,不过这需要和variable_scope配合使用,如下举例获取到在其他文件中定义的weights参数
    with tf.variable_scope(name, reuse=True):
    	res_dict[name] = []
    	res_dict[name].append(tf.get_variable('weights').eval())
    	res_dict[name].append(tf.get_variable('biases').eval())
    
    
    • 他们还有一个区别在于变量名称的参数。Variable函数,变量名称是一个可选的参数,但是对于get_variable函数来说,变量名称是一个必须的参数。get_variable会先试图创建一个变量,如果变量不存在,这直接创建该变量,如果变量存在并且get_variable的reuse指定的是true,则获取该参数,否则报错,程序终止。
  • tf.variable_scope 和 tf.name_scope的异同:

    • name_scope 是给op_name加前缀, variable_scope是给get_variable()创建的变量的名字加前缀。
    • 距离来说,我们这里要进行一个卷积操作,我们可以给在调用conv2d的时候可以指定name参数,那么name_scope这个参数就是给这里的name加上前缀
    • 而在定义变量的时候,我们也会指定name参数,那么variable_scope就是在这种情况下加上前缀。
    • name_scope还有一个很大的好处就是调整tensorboard形成图像的外观,因为同一个name_scope下的节点在tensorboard下会折叠起来,这样整体性会比较好。
  • sparse_softmax_cross_entropy_with_logits and softmax_cross_entropy_with_logits

    • 首先这两个函数都是计算交叉熵的。接受的参数都是两个,一个是labels,一个是logits。
    • 其中sparse_softmax_cross_entropy_with_logits中的labels不是one hot 编码格式。也就是说如果logits的shape是[10, 2] 那么labels的shape就是[10]。这里有一个不算bug的bug,就是如果我们的labels里面的值大于我们类别的个数,比如说这里我们有两个类,且我们labels里面有大于1的数字(such as 2,3 etc.) 该函数的计算结果就会出现NAN,而不是报错!
    • softmax_cross_entropy_with_logits 参数中的labels是one hot 编码格式,也就是说如果logits的shape是[10, 2] 那么labels的shape就是[10, 2]
  • 如何在tensorflow中对tensor选择出满足条件的行

    • 问题定义:比如说我们现在有一个tensor的形状是(100, 10),每一行代表一个样本,所以我们现在有100个样本。我们还有一个tensor的形状是(100),每一行代表的是一个样本的label。现在我们想选择出来label是1的所有样本组成一个新的tensor。

    • 具体实现的代码如下所示:

      selected_x = tf.gather(x_tensor,
                             tf.cast(
                                 tf.squeeze(
                                     tf.where(
                                         tf.equal(
                                             label_tensor,
                                             [i]
                                         ),
                                         None,
                                         None
                                     )
                                 ), tf.int32))
      
    • 在上述代码中,我们通过tf.gather函数实现选择的功能,他主要有两个参数:一个是dataset, 第二个是indices, 他返回的是dataset[indices, :]

    • tf.where(tensor1, tensor2, tensor3) 其实是一个三元操作。其中tensor1 是一个类型为bool类型的数组,tensor2和tensor3的长度(第一维的大小和tensor1相同)。如果对应位置tensor1为true,则从tensor2中选择出对应的元素,否则从tensor3中选择。如何tensor2和tensor3同时为None,则范围tensor1为true的下标。

  • 卷积核的膨胀操作

    • 在我们使用slim.conv2d的时候,里面有一个参数是rate,它如果是一个整数的话,代表的就是我们要对卷积核膨胀的系数。注意,这里我们膨胀的对象是卷积核。对卷积核的膨胀操作可以在不增加参数的前提条件下,扩大卷积核的感受野。

    • 比如说,我们对下面的3*3的卷积核进行rate等于2的膨胀,就能得到下面右边的新的卷积核,一般来说是对空的位置执行补0操作。
      卷积核膨胀操作

    • 这里我们参考这篇博客,得到卷积核膨胀的尺寸计算公式:膨胀的卷积核尺寸 = 膨胀系数 * (原始卷积核尺寸 - 1) + 1

  • control_dependencies

    • 我们在train一个model的时候,经常会看到with tf.control_dependencies([train_op]): 这段代码。
    • 在这里的tf.control_dependencies([tensor_or_op_list])其实是创造了一个上下文的context,在执行这个context里面的tensor或者是op的时候,会先执行control_dependencies里面的tensor或者是op
    • 比如说下面的代码,我们将add操作外不加control_dependencies,那我们的add_tensor将会一直是1
      def learn_control_dependency():
          import tensorflow as tf
          a = tf.Variable(0.0)
          add_op = tf.assign_add(a, 1.0)  # 该operation每执行一次,a就增加1 返回的是a的一个引用
          # with tf.control_dependencies([add_op]):
          add_tensor = tf.identity(a) + 1.0
      
      
          with tf.Session() as sess:
              sess.run(tf.local_variables_initializer())
              sess.run(tf.global_variables_initializer())
              print(sess.run(a))
              for idx in range(3):
                  print(sess.run([add_tensor]))
      
    • 如果我们将add_tensor外,加入一个control_dependencies,那么结果就是2 3 4。
      def learn_control_dependency():
      import tensorflow as tf
      a = tf.Variable(0.0)
      add_op = tf.assign_add(a, 1.0)  # 该operation每执行一次,a就增加1 返回的是a的一个引用
      # add_tensor_1 = tf.identity(a) + 1.0
      with tf.control_dependencies([add_op]):
          add_tensor = a + 1.0
      
      
      with tf.Session() as sess:
          sess.run(tf.local_variables_initializer())
          sess.run(tf.global_variables_initializer())
          print(sess.run(a))
          for idx in range(3):
              print(sess.run([add_tensor]))
      
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值