反向傳播Python版本: import numpy as np def sigmoid(x): return 1.0 / (1.0 + np.exp(-x)) def sigmoidDerivationx(x): x = sigmoid(x) return x * (1.0 - x) if __name__ == "__main__": # 初始化 x = [ 0.45, 0.85 ] y = [ 0.57, 0.84 ] w = [ [0.47, 0.23], [0.57, 0.78] ] b = 0.37 row = len(w) print('row = %d' % row) col = len(w[0]) print('col = %d' % col) o = [0.0] * row lr = 0.5 # 學習速率 epochs = 500 # 迭代次數 for epoch in range(epochs): # forward for j in range(col): o[j] = 0.0 for i in range(row): z = w[i][j] * x[i] + b o1 = sigmoid(z) o[j] += o1 #print('%f '%o[j]) # backward dpb = 0.0 for i in range(row): for j in range(col): dpW = (o[j] - y[j]) * sigmoidDerivationx(o[j]) * x[i] w[i][j] -= lr * dpW dpb += (o[i] - y[i]) * sigmoidDerivationx(o[i]) b -= lr * dpb * row for i in range(row): for j in range(col): print('%f ' % w[i][j], end='') print('') print('b = %f' % b) Loss = 0.0 for j in range(col): o[j] = 0.0 for i in range(row): z = w[i][j] * x[i] + b o1 = sigmoid(z) o[j] += o1 print('%f, %f'%(o[j], y[j])) Loss += 0.5 * pow(y[j] - o[j], 2) print('loss = %f' % Loss)
C語言版本:
#include <stdio.h> #include <math.h> #define ROW 2 #define COL 2 double sigmoid(double x) { return 1.0 / (1.0 + exp(-x)); } double sigmoidDerivationx(double x) { x = sigmoid(x); return x * (1.0 - x); } int main(void) { //初始化 double x[ROW] = { 0.45, 0.85 }; double y[ROW] = { 0.57, 0.84 }; double w[ROW][COL] = { {0.47, 0.23}, {0.57, 0.78} }; double o[ROW] = { 0.0, 0.0 }; double b = 0.37; double lr = 0.5; // 學習速率 int epochs = 500; // 迭代次數 int i, j; double z, o1; for (int epoch = 0; epoch < epochs; ++epoch) { // forward for(j = 0; j < COL; ++j) { o[j] = 0.0; for(i = 0; i < ROW; ++i) { z = w[i][j] * x[i] + b; o1 = sigmoid(z); o[j] += o1; } //printf("%f ", o[j]); } //printf("\n"); // backward double dpb = 0.0; for(i = 0; i < ROW; ++i) { for(j = 0; j < COL; ++j) { double dpW = (o[j] - y[j]) * sigmoidDerivationx(o[j]) * x[i]; w[i][j] -= lr * dpW; } dpb += (o[i] - y[i]) * sigmoidDerivationx(o[i]); } b -= lr * dpb * ROW; } for(i = 0; i < ROW; ++i) { for(j = 0; j < COL; ++j) { printf("%f ", w[i][j]); } printf("\n"); } printf("b = %f\n", b); double dLoss = 0.0; for(j = 0; j < COL; ++j) { o[j] = 0.0; for(i = 0; i < ROW; ++i) { z = w[i][j] * x[i] + b; o1 = sigmoid(z); o[j] += o1; } printf("%f, %f\n", o[j], y[j]); dLoss += 0.5 * pow(y[j] - o[j], 2.0); } printf("loss = %f\n", dLoss); return 0; }