BP簡單反向傳播 Python和C語言實現

反向傳播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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章