- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试使用 5 个卷积层的 CNN - 2 个隐藏层 - 1 个 Softmax。
架构是:
cv0->relu->cv1->relu-cv2->relu->cv3->relu->cv4->relu->cv5->hid1->relu->hid2->relu->logistic softmax
通过对图像中的 66 个补丁标记应用随机梯度。出于测试目的,训练仅应用于具有 20 个 epoch 的单张图像。
从网络中识别出错误在每次迭代中爆炸,因此梯度在第 4 轮的第 3 轮之后计算 nan。
4.702012
45338036.000000
74726722389225987403008805175296.000000
nan
正如您所见,在误差爆炸到非常高的值之后,梯度产生了 nan 并传播到所有网络中。
查看来自不同层权重值的单个节点以查看发生了什么:
第 8 层(softmax):
[ 0.05436778 0.02379715]
[ 0.28402206 -0.20585714]
[ -5.27361184e-02 9.52038541e-02]
[-7330.04199219 7330.12011719]
[nan nan]
layer6 (hid1):
[-0.0254469 0.00760095 ..., -0.00587915 0.02619855 0.03809309]
[-0.0254469 0.00760095 ..., -0.00587915 0.02619855 0.03809309]
[-0.0254469 0.00760095 ..., -0.00587915 0.02619855 0.03809309
[ -2.54468974e-02 1.79247314e+16 ..., -5.87915350e-03 2.61985492e-02 -2.06307964e+19]
[nan nan ..., nan nan nan]
layer0 (cv0):
初始化是
[[-0.01704694 -0.01683052 -0.0894756 ]
[ 0.12275343 -0.05518051 -0.09202443]
[-0.11599202 -0.04718829 -0.04359322]]
而第 3 个纪元是
[[-24165.15234375 -26490.89257812 -24820.1484375 ]
[-27381.8203125 -26653.3359375 -24762.28710938]
[-23120.56835938 -21189.44921875 -24513.65039062]]
很明显,权重值正在爆炸式增长。
学习率为 0.01 所以为了解决这个问题,我将学习率改为 0.001,Nan 有时消失,网络收敛,有时不收敛,网络充满 NaN。再次尝试使用 0.0001 的较小学习率,但我还没有看到 NaN。从我每次重新运行代码时得到的结果来看,结果确实不同,我认为这首先与权重初始化有关。
所以我尝试了不同的权重初始化:
对于带有relu的Conv层
W_bound_6 = numpy.sqrt(6. / (fan_in + fan_out))
W_bound_2 = numpy.sqrt(2. / (fan_in + fan_out))
W_values = numpy.asarray(
numpy.random.randn(filter_shape[0], filter_shape[1], filter_shape[2], filter_shape[3]) * W_bound_2,
dtype=theano.config.floatX)
以及隐藏层和softamx层
W_bound_2 = numpy.sqrt(2. / (filter_shape[0] + filter_shape[1]))
W_values = numpy.asarray(
numpy.random.randn(filter_shape[0], filter_shape[1]) * W_bound_2,
dtype=theano.config.floatX
)
并将 b 全部归零。
差别不大,我仍然看不出结果有什么不同。
我在这里发布我的问题:
代价函数
-T.mean(T.log(self.p_y_given_x)[T.arange(y.shape[0]), y])
更新函数
updates = [
(param_i, param_i - learning_rate * grad_i)
for param_i, grad_i in zip(classifier.params, grads)
]
最佳答案
我正在寻找不同的方法来避免这个问题,但正在寻找其他人提出的正式解决方案并阅读一些理论解决方案我会在这里写下我的答案,以帮助其他人遇到同样的问题。
这个问题背后的原因是使用了 softmax 和交叉熵。因此,当您计算梯度并跳入零或 inf 时,您会得到 nan,它正在传播反向词并抛出所有网络参数。
很少有人建议避免这个问题
解决方案:
在我的案例中,学习率解决了这个问题,但我仍在努力进一步优化它
关于python - 如何避免 Theano 计算梯度趋向于 NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40405334/
SQL 和一般开发的新手,我有一个表(COUNTRIES),其中包含字段(INDEX、NAME、POPULATION、AREA) 通常我添加一个客户端(Delphi)计算字段(DENSITY)和 On
我想使用 calc(100%-100px),但在我的 demo 中不起作用由于高度只接受像素,因此如何将此百分比值转换为像素。 最佳答案 以下将为您提供高度: $(window).height();
我正在尝试在 MySQL 中添加列并动态填充其他列。 例如我有一张表“数字”并具有第 1 列、第 2 列、第 3 列,这些总数应填充在第 4 列中 最佳答案 除非我误解了你的问题,否则你不只是在寻找:
我想返回简单计算的结果,但我不确定如何执行此操作。我的表格如下: SELECT COUNT(fb.engineer_id) AS `total_feedback`, SUM(fb.ra
我一直在尝试做这个程序,但我被卡住了,我仍然是一个初学者,任何帮助将不胜感激。我需要程序来做 打印一个 10 X 10 的表格,其中表格中的每个条目都是行号和列号的总和 包含一个累加器,用于计算所有表
这个计算背后一定有一些逻辑。但我无法得到它。普通数学不会导致这种行为。谁能帮我解释一下原因 printf ("float %f\n", 2/7 * 100.0); 结果打印 1.000000 为什么会
我想计算从 0 到 (n)^{1/2} - 1 的数字的 AND每个数字从 0 到 (n)^{1/2} - 1 .我想在 O(n) 中执行此操作时间,不能使用 XOR、OR、AND 运算。 具体来说,
如何在 Excel 中将公式放入自定义数字格式?例如(出于说明目的随机示例), 假设我有以下数据: 输入 输出 在不编辑单元格中的实际数据的情况下,我想显示单元格中的值除以 2,并保留两位小数: 有没
每次我在 Flutter 应用程序中调用计算()时,我都会看到内存泄漏,据我所知,这基本上只是一种生成隔离的便捷方法。我的应用程序内存占用增加并且在 GC 之后永远不会减少。 我已将我的代码简化为仅调
我有数字特征观察 V1通过 V12用于目标变量 Wavelength .我想计算 Vx 之间的 RMSE列。数据格式如下。 每个变量“Vx”以 5 分钟的间隔进行测量。我想计算所有 Vx 变量的观测值
我正在寻找一种使用 C 语言计算文件中未知字符数的简单方法。谢谢你的帮助 最佳答案 POSIX 方式(可能是您想要的方式): off_t get_file_length( FILE *file ) {
我正在使用 Postgres,并且我正试图围绕如何在连续日期跨度中得出第一个开始日期的问题进行思考。例如 :- ID | Start Date | End Date =================
我有一个订单表格,我在其中使用 jQuery 计算插件来汇总总数。 此求和工作正常,但生成的“总和”存在问题。总之,我希望用逗号替换任何点。 代码的基础是; function ($this) {
我在使用 double 变量计算简单算术方程时遇到问题。 我有一个具有 double 属性 Value 的组件,我将此属性设置为 100。 然后我做一个简单的减法来检查这个值是否真的是 100: va
我在这里看到了一些关于 CRC 32 计算的其他问题。但没有一个让我满意,因此是这样。 openssl 库是否有任何用于计算 CRC32 的 api 支持?我已经在为 SHA1 使用 openssl,
当我在PHP日期计算中遇到问题时,我感到惊讶。 $add = '- 30 days'; echo date('Y-m-01', strtotime($add)); // result is 2017-
我正在使用 javascript 进行练习,我编写了这个脚本来计算 2 个变量的总和,然后在第三个方程中使用这个总和!关于如何完成这项工作的任何想法都将非常有用! First Number:
我有一个来自EAC的提示单和一个包含完整专辑的FLAC文件。 我正在尝试制作一些python脚本来播放文件,因为我需要能够设置在flac文件中开始的位置。 如何从CueSheet格式MM:SS:FF转
这个问题已经有答案了: Adding two numbers concatenates them instead of calculating the sum (24 个回答) 已关闭去年。 我有一个
4000 我需要上面字段 name="quantity" 和 id="price" 中的值,并使用 javascript 函数进行计算,并将其显示在字段 id= 中仅当我单击计算按钮时才显示“总
我是一名优秀的程序员,十分优秀!