单层神经网络的搭建

此博客基于优达学院的深度学习课程

搭建一个简单的神经网络

总结
神经网络是一种在数据中识别模式的算法
反向传播是一种在更新权重训练过程中采用的一种技术 这个过程使用的是梯度下降法
深度学习=多层神经网络+大数据+大量的计算

实例

课程中的实例搭建了一个单层只有一个神经元的神经网络 使用该神经网络进行了一次简单的预测 下面进行重现课上的代码 争取本周能独立写出一个三层的神经网络

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]

你可能感兴趣的:(神经网络,神经网络)