模型构造 讨论区


#84

应该就是第一个dense的输出,进行固定参数的变换之后,再作为输入进入原来的那个dense内吧,这样就是复用一层dense,更新的是同一套参数,等价于两个dense共享一套参数


#85

嗯嗯 虽然还有一些小问题 但是 很感谢您的热心解答!


#86

兄弟,你找到答案了吗?同一层调用了两次, 反向传播的时候,以哪一次的梯度来更新参数呢?


#87

我在照着沐神的视频敲batch_normalization的时候遇到了一点问题

def batch_norm(data, mode, moving_mean, moving_variance, gamma, beta):
if len(data.shape) == 4:
    mean = nd.mean(data, axis=(0, 2, 3), keepdims=True)
    variance = nd.mean((data-mean)**2, axis=(0, 2, 3), keepdims=True)
else:
    mean = nd.mean(data, axis=0, keepdims=True)
    variance = nd.mean((data - mean) ** 2, axis=0, keepdims=True)
if mode == "train":
    data_m = (data - mean) / nd.sqrt(variance + 1e-2)
    moving_mean[:] = 0.9 * moving_mean + 0.1 * mean
    moving_variance[:] = 0.9 * moving_variance + 0.1 * variance
else:
    data_m = (data - moving_mean) / nd.sqrt(moving_variance + 1e-2)
return gamma * data_m + beta

moving_mean1 = nd.zeros(shape=(1, w1.shape[0], 1, 1), ctx=ctx)

他会报错:

Traceback里一直说我这一行:
moving_mean[:] = 0.9 * moving_mean + 0.1 * mean

错误是:
Check failed: AGInfo::IsNone(*output): Assigning to NDArrays that are already in a computational graph will cause undefined behavior when evaluating gradients.

这里我 moving_mean1 没给梯度 不知道是哪里错了 能帮忙看下吗 谢谢


#88

其他的地方应该没错,因为如果我让test的时候也计算均值和方差的话,出来的结果是ok的
就是在train的时候保存 moving_mean 和moving_variance 的时候报错
能不能帮我看下 对于python的函数传值我也一直理不清 谢谢


#89

建议你先看一下现在的新PDF吧,感觉这个照着视频敲的程序,逻辑上有问题,如果是预测模式,有必要去计算平均值、方差吗,直接根据传入的参数更新就行了,可能是视频比较旧了???还有就是你这个缩进要注意一点!!!


#90

可能是版本的 问题吧,我现在输出的结果就是和你预想的一样。


#91

我想问问, 4.1.1.的net(X)以及output[2],在做什么,输出的是什么,有什么意义吗?


#92

请问重复使用Dense层有什么作用呢?我在输出结果里没有发现不同,但是debug时候会有不同,比如若是写了重复使用Dense,我在第一层后写一个print,会输出正常的2*20的矩阵。若是没有写重复使用Dense,那个print就会输出一个被relu处理过的矩阵,请问为什么会这样?