最近看了一篇文献
万士宁. 基于卷积神经网络的人脸识别研究与实现[D]. 电子科技大学, 2016.
觉得实现下,基本算从零开始,不知能否成功。
现在是基础学习:可以参考http://python.jobbole.com/82758/
首先选择Anaconda和python3.4,安装Numpy包。
代码:
# -*- coding: utf-8 -*-
"""
Spyder Editor
This is a temporary script file.
"""
import numpy as np
import math
#sigmoid function
def nonlin(x,deriv=False):
if(deriv==True):
return x*(1-x)
return 1/(1+np.exp(-x))
#input dataset
X=np.array([ [0,0,1],
[0,1,1],
[1,0,1],
[1,1,1] ])
#output dataset
y=np.array([[0,0,1,1]]).T
#seed random numbers to make calculation
#deleteministic (just a good practice)
np.random.seed(1)
#initialize weights randomly with mean 0
syn0 = 2*np.random.random((3, 2)) - 1
for iter in range(10000):
#forward propagation
l0=X
l1=nonlin(np.dot(l0,syn0))
# how much did we miss?
l1_error = y - l1
# multiply how much we missed by the
# slope of the sigmoid at the values in l1
l1_delta = l1_error * nonlin(l1,True)
# update weights
syn0 += np.dot(l0.T,l1_delta)
print("Output After Training:")
print(l1)
运行结果
Output After Training:
[[ 0.0096701 0.00966641]
[ 0.00786242 0.0078625 ]
[ 0.99359228 0.99359172]
[ 0.99211639 0.99211881]]
实现简单的BP反向传播算法,用输入去预测输出
定义一个输入输出为:
input output
0,0,1 0
1.1.1 1
1.0.1 1
0.1.1 0
变量定义说明
X输入数据集,形式为矩阵,每 1 行代表 1 个训练样本。
y输出数据集,形式为矩阵,每 1 行代表 1 个训练样本。l0网络第 1 层,即网络输入层。
l1网络第 2 层,常称作隐藏层。syn0第一层权值,突触 0 ,连接 l0 层与 l1 层。
*逐元素相乘,故两等长向量相乘等同于其对等元素分别相乘,结果为同等长度的向量。
–元素相减,故两等长向量相减等同于其对等元素分别相减,结果为同等长度的向量。
x.dot(y)若 x 和 y 为向量,则进行点积操作;若均为矩阵,则进行矩阵相乘操作;若其中之一为矩阵,则进行向量与矩阵相乘操作。