如何找到为什么RBM无法正常工作
How to find why a RBM does not work correctly?
我正在尝试实现RBM,并且正在MNIST数据集上进行测试。但是,它似乎没有融合。
我有28x28可见单元和100个隐藏单元。我正在使用50号尺寸的迷你批次。对于每个时期,我都遍历整个数据集。我的学习率为0.01,动量为0.5。权重是基于平均0.0的高斯分布和0.01的高斯分布随机生成的。可见的和隐藏的偏差初始化为0。我使用的是逻辑sigmoid函数作为激活。
每个时期后,我计算所有迷你批次的平均重建误差,这是我遇到的错误:
epoch 0: Reconstruction error average: 0.0481795
epoch 1: Reconstruction error average: 0.0350295
epoch 2: Reconstruction error average: 0.0324191
epoch 3: Reconstruction error average: 0.0309714
epoch 4: Reconstruction error average: 0.0300068
我绘制了要检查的权重的直方图(从左到右:HIDDENS,权重,Visibles。顶部:权重,底部:更新):
epoch 3之后的权重直方图时期之后的权重直方图3 http://baptiste-wicht.com/static/finals/histogram_epoch_3.png
epoch 4之后的权重直方图段4 http://baptiste-wicht.com/static/finals/histogram_epoch_4.png
但是,除了隐藏的偏见看起来有些怪异之外,剩下的似乎还可以。
我还试图绘制隐藏的权重:
epoch 3
之后epoch之后的权重http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_3.png
epoch 4
之后的权重epoch之后的权重http://baptiste-wicht.com/static/finals/hiddens_weights_epoch_4.png
(使用该功能,它们以两种颜色绘制:
static_cast<size_t>(value > 0 ? (static_cast<size_t>(value * 255.0) << 8) : (static_cast<size_t>(-value * 255.)0) << 16) << " ";
)
在这里,它们根本没有意义...
如果我走得更远,重建误差会增加一点,但不要超过0.025。即使我改变了一段时间后,它也会更高,然后下降一点,但并不有趣。此外,在更多时代之后,权重没有意义。在我看到的大多数示例实现中,重复完成完整数据集后两到三次,权重是有意义的。
我还尝试从可见单元重建图像,但结果似乎几乎是随机的。
我该怎么做才能检查实施中出了什么问题?权重应该在一定范围内吗?数据中似乎真的很奇怪吗?
完成代码:https://github.com/wichtounet/dbn/blob/master/include/rbm.hpp
您使用的学习率很小。在大多数由SGD培训的NN中,您从更高的学习率开始,然后随着时间的流逝而衰减。搜索学习率或自适应学习率,以查找有关此信息的更多信息。
第二,在实施一种新算法时,我建议找到引入它并重现其结果的论文。好的纸张应包括使用的大多数设置 - 或用于确定设置的方法。
如果纸张不可用,或者在您无法访问的数据集上进行了测试,请找到工作实现并在使用相同设置时比较输出。如果实现不兼容实现,请关闭未共享的尽可能多的功能。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 为什么STD ::计数将常数传递给Lambda,而不是在弦上工作时而不是字符
- C++程序已停止工作-求解常微分方程