-
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]))
Tensorflow 笔记
最新推荐文章于 2023-08-17 15:11:30 发布