小编Xia*_*eng的帖子

当涉及向量时移动闭包的关键字

有人告诉我,当move在闭包中使用关键字时,闭包将获取其环境中变量副本的所有权。但这段代码不会编译:

use std::thread;
use std::time::Duration;

fn main() {
    let mut data = vec![1, 2, 3];

    for i in 0..3 {
        thread::spawn(move || {
            data[i] += 1;
        });
    }

    thread::sleep(Duration::from_millis(50));
}
Run Code Online (Sandbox Code Playgroud)

错误信息是

use std::thread;
use std::time::Duration;

fn main() {
    let mut data = vec![1, 2, 3];

    for i in 0..3 {
        thread::spawn(move || {
            data[i] += 1;
        });
    }

    thread::sleep(Duration::from_millis(50));
}
Run Code Online (Sandbox Code Playgroud)

对此的一些解释

Rust 知道这不安全!如果我们在每个线程中都有一个对数据的引用,并且该线程拥有该引用的所有权,那么我们将拥有三个所有者!

这是否意味着复制仅复制堆栈上的元数据而不是堆上的真实数据?换句话说,复制引用是因为数据类型本身本质上是引用类型,而不是指通过&mut语法创建的引用。move关键字在堆栈上复制数据是否适用于所有数据类型?因此,当涉及到类似类型时,i32它会按值复制,如果是像向量这样的类型,则按引用复制。

我的初衷是了解move关键字的确切行为。仔细查看 Rust 文档后,我认为它遵循一般变量绑定的移动语义。在这种情况下,“数据”的所有权只能转移一次。尽管更改0..30..1 …

rust

5
推荐指数
1
解决办法
2173
查看次数

在 tf.layers.conv2d 中将 kernel_regularizer 设置为 l2_regularizer 是什么意思?

我在其他问题中发现使用张量流在卷积网络中进行 L2 正则化的标准方法如下。

对于每个conv2d层,设置参数kernel_regularizerl2_regularizer这样的

regularizer = tf.contrib.layers.l2_regularizer(scale=0.1)
layer2 = tf.layers.conv2d(
    inputs,
    filters,
    kernel_size,
    kernel_regularizer=regularizer)
Run Code Online (Sandbox Code Playgroud)

然后在损失函数中,收集reg损失

  reg_losses = tf.get_collection(tf.GraphKeys.REGULARIZATION_LOSSES)
  reg_constant = 0.01  # Choose an appropriate one.
  loss = my_normal_loss + reg_constant * sum(reg_losses)
Run Code Online (Sandbox Code Playgroud)

包括我在内的很多人都犯了跳过第二步的错误。这意味着kernel_regularizer没有很好地理解的含义。我有一个我无法证实的假设。那是

通过设置kernel_regularizer单层,您告诉网络将这一层的内核权重转发到网络末端的损失函数,以便稍后您可以选择(通过您编写的另一段代码)将它们包含在损失函数中的最终正则化项。而已。

它是正确的还是有更好的解释?

conv-neural-network tensorflow

2
推荐指数
1
解决办法
2934
查看次数

标签 统计

conv-neural-network ×1

rust ×1

tensorflow ×1