此博客基于优达学院的深度学习课程
搭建一个简单的神经网络
总结
神经网络是一种在数据中识别模式的算法
反向传播是一种在更新权重训练过程中采用的一种技术 这个过程使用的是梯度下降法
深度学习=多层神经网络+大数据+大量的计算
实例
课程中的实例搭建了一个单层只有一个神经元的神经网络 使用该神经网络进行了一次简单的预测 下面进行重现课上的代码 争取本周能独立写出一个三层的神经网络
from numpy import exp,array,random,dot
class NeuralNetwork:
def __init__(self):
random.seed(1)#生成相同随机数
#建立单个神经元,其中有三个输入连接和一个输出连接
#把随机的权值赋给一个3X1的矩阵
self.synaptic_weights = 2*random.random((3,1))-1
# Sifmoid函数,在逻辑回归里讲到过,可翻阅资料,是一个S型函数
# 可将函数之标准化到0和1之间
def __sigmoid(self,x):
return 1/(1+exp(-x))
# Sigmoid函数的导函数 在梯度下降时使用 决定我们如何调整权重
def __sigmoid_derivative(self,x):
return x*(1-x)
#进行神经网络的训练并对每一次权值进行调整
def train(self,training_set_inputs,training_set_outputs,number_of_training_iterations):
for iteration in range(number_of_training_iterations):
#传入训练集
output = self.think(training_set_inputs)
#计算损失值
error = training_set_outputs-output
adjustment = dot(training_set_inputs.T,error*self.__sigmoid_derivative(output))
#调整权值
self.synaptic_weights+=adjustment
#神经网络思考的过程
def think(self,inputs):
return self.__sigmoid(dot(inputs,self.synaptic_weights))
if __name__=="__main__":
#建立一个单神经元的神经网络
neural_network = NeuralNetwork()
#输出初始的随机参数
print("Random starting synaptic weights:")
print(neural_network.synaptic_weights)
#训练集
training_set_inputs = array([[0,0,1],[1,1,1,],[1,0,1],[0,1,1]])
training_set_outputs= array([[0,1,1,0]]).T
#进行训练
neural_network.train(training_set_inputs,training_set_outputs,10000)
#输出训练后的参数值
print("New stnaptic weights after training:")
print(neural_network.synaptic_weights)
#用新样本测试神经网络
print("Considering new situation[1,0,0]->?:")
print(neural_network.think(array([1,0,0])))
Random starting synaptic weights:
[[-0.16595599]
[ 0.44064899]
[-0.99977125]]
New stnaptic weights after training:
[[ 9.67299303]
[-0.2078435 ]
[-4.62963669]]
Considering new situation[1,0,0]->?:
[0.99993704]