目标:
我是机器学习和神经网络实验的新手。我想建立一个网络,将一系列 5 张图像作为输入并预测下一张图像。我的数据集完全是人工的,只是为了我的实验。作为说明,这里有几个输入和预期输出的例子:
数据点和目标的图像来自同一来源:一个数据点的目标图像出现在其他数据点中,反之亦然。
我做了什么:
现在我已经建立了一个带有一个隐藏层的感知器,输出层给出了预测的像素。这两层是密集的,由 sigmoid 神经元组成,我使用均方误差作为目标。由于图像相当简单且变化不大,因此效果很好:使用 200-300 个示例和 50 个隐藏单元,我得到了很好的错误值 (0.06) 和对测试数据的良好预测。网络使用梯度下降(使用学习率缩放)进行训练。以下是我得到的各种学习曲线,以及错误随时期数的演变:
我正在尝试做的事情:
这一切都很好,但现在我想减少数据集的维度,以便它可以扩展到更大的图像和更多的例子。所以我申请了PCA。但是,我没有将其应用于数据点列表,而是应用于图像列表,原因有两个:
- 在整个数据集上,协方差矩阵为 24000x24000,这不适合我笔记本电脑的内存;
- 通过对图像进行处理,我还可以压缩目标,因为它们是由相同的图像组成的。
由于图像看起来都很相似,我设法将它们的尺寸从 4800 (40x40x3) 减小到 36,同时仅损失 1e-6 的方差。
什么不起作用:
当我将缩减的数据集及其缩减的目标输入网络时,梯度下降非常快地收敛到高误差(大约 50 !)。您可以看到与上面的等效图:
我没想到学习曲线可以从一个高值开始,然后下降并回升......梯度下降如此快停止的通常原因是什么?是否可以链接到参数初始化(我使用 GlorotUniform,千层面库的默认值)。
然后我注意到,如果我提供减少的数据但原始(未压缩)目标,我会恢复初始性能。因此,在目标图像上应用 PCA 似乎不是一个好主意。这是为什么?毕竟,我只是将输入和目标乘以同一个矩阵,所以训练输入和目标仍然以神经网络应该能够计算出来的方式联系起来,不是吗?我错过了什么?
即使我引入 4800 个单元的额外层,以使 sigmoid 神经元的总数相同,我也会得到相同的结果。总结一下,我试过:
- 24000 像素 => 50 sigmoid => 4800 sigmoid(= 4800 像素)
- 180 "像素" => 50 sigmoid => 36 sigmoid (= 36 "像素")
- 180“像素”=> 50 sigmoid => 4800 sigmoid(= 4800 像素)
- 180 个“像素”=> 50 个 sigmoid => 4800 个 sigmoid => 36 个 sigmoid(= 36 个“像素”)
- 180 "像素" => 50 sigmoid => 4800 sigmoid => 36 线性 (= 36 "像素")
(1) 和 (3) 工作正常;但不是(2)、(4)和(5),我不明白为什么。特别是,由于(3)有效,(5)应该能够找到与(3)相同的参数以及最后一个线性层中的特征向量。这对神经网络来说是不可能的吗?