如何在MNIST上提高网络运行的准确性
How to increase accuracy of network running on MNIST
我遵循以下代码:https://github.com/HyTruongSon/Neural-Network-MNIST-CPP
这很容易理解。它的准确率为94%。我必须将其转换为具有更深层次(从5到10(的网络。为了让自己舒服,我只多加了一层。然而,无论我怎么训练,准确率都不会超过50%。我在每个隐藏层中添加了256个神经元。以下是我修改代码的方式:我添加了这样的额外层:
// From layer 1 to layer 2. Or: Input layer - Hidden layer
double *w1[n1 + 1], *delta1[n1 + 1], *out1;
// From layer 2 to layer 3. Or; Hidden layer - 2Hidden layer
double *w2[n2 + 1], *delta2[n2 + 1], *in2, *out2, *theta2;
// From layer 3 to layer 4. Or; Hidden layer - Output layer
double *w3[n3 + 1], *delta3[n3 + 1], *in3, *out3, *theta3;
// Layer 3 - Output layer
double *in4, *out4, *theta4;
double expected[n4 + 1];
前馈部分是这样修改的:
void perceptron() {
for (int i = 1; i <= n2; ++i) {
in2[i] = 0.0;
}
for (int i = 1; i <= n3; ++i) {
in3[i] = 0.0;
}
for (int i = 1; i <= n4; ++i) {
in4[i] = 0.0;
}
for (int i = 1; i <= n1; ++i) {
for (int j = 1; j <= n2; ++j) {
in2[j] += out1[i] * w1[i][j];
}
}
for (int i = 1; i <= n2; ++i) {
out2[i] = sigmoid(in2[i]);
}
/////
for (int i = 1; i <= n2; ++i) {
for (int j = 1; j <= n3; ++j) {
in3[j] += out2[i] * w2[i][j];
}
}
for (int i = 1; i <= 3; ++i) {
out3[i] = sigmoid(in3[i]);
}
////
for (int i = 1; i <= n3; ++i) {
for (int j = 1; j <= n4; ++j) {
in4[j] += out3[i] * w3[i][j];
}
}
for (int i = 1; i <= n4; ++i) {
out4[i] = sigmoid(in4[i]);
}
}
反向传播是这样改变的:
void back_propagation() {
double sum;
for (int i = 1; i <= n4; ++i) {
theta4[i] = out4[i] * (1 - out4[i]) * (expected[i] - out4[i]);
}
for (int i = 1; i <= n3; ++i) {
sum = 0.0;
for (int j = 1; j <= n4; ++j) {
sum += w3[i][j] * theta4[j];
}
theta3[i] = out3[i] * (1 - out3[i]) * sum;
}
for (int i = 1; i <= n3; ++i) {
for (int j = 1; j <= n4; ++j) {
delta3[i][j] = (learning_rate * theta4[j] * out3[i]) + (momentum * delta3[i][j]);
w3[i][j] += delta3[i][j];
}
}
/////////////
for (int i = 1; i <= n2; ++i) {
for (int j = 1; j <= n3; ++j) {
delta2[i][j] = (learning_rate * theta3[j] * out2[i]) + (momentum * delta2[i][j]);
w2[i][j] += delta2[i][j];
}
}
/////////////////
for (int i = 1; i <= n1; ++i) {
for (int j = 1 ; j <= n2 ; j++ ) {
delta1[i][j] = (learning_rate * theta2[j] * out1[i]) + (momentum * delta1[i][j]);
w1[i][j] += delta1[i][j];
}
}
}
我也发布了我的修改,因为我可能在这里的某个地方错了。一旦我将历元变量设置为1000,并让它训练24小时,仍然没有进展:(.我对此感到非常沮丧,我不知道我错在哪里了。
您忘记在从第3层到第2层的thetha2参数中添加反向传播了吗?
for (int i = 1; i <= n2; ++i) {
sum = 0.0;
for (int j = 1; j <= n3; ++j) {
sum += w2[i][j] * theta3[j];
}
theta2[i] = out2[i] * (1 - out2[i]) * sum;
}
相关文章:
- 如何在MNIST上提高网络运行的准确性
- Active Directory:从网络服务帐户下运行的Windows服务调用ADsOpenObject时失败
- 为什么我不能让 3 个网络摄像头与 pthreads 并行运行?
- 用于本地网络运行的客户端服务器体系结构
- 简单的多播应用程序无法在同一网络上的不同计算机上运行
- 在多台计算机上运行SFML tcp 网络程序
- MinGW 编译的可执行文件与网络无法在 x64 系统上运行
- 如何在网络 T 中运行超时的轮询
- 在使用高架特权运行时,如何正确检测网络驱动器
- 使用WordPress在网络服务器上运行C 应用程序
- 如何在运行时调整DLIB神经网络隐藏层的大小
- 网络应用程序可以在模拟器中运行,但不能在iPhone上运行
- 树莓派与 c++ 运行线程,在网络上发布数据
- 运行网络测试的方法
- 如何在 cocos2d-x 中的另一个线程中运行自定义网络代码
- 通过网络运行Qt应用程序
- 获取当前运行进程的网络适配器
- 在苹果设备上运行的 Websocket 的网络性能不佳
- 网络程序运行,但没有输出
- 我可以用c++制作一款可以在网络上运行的游戏吗?