深度学习2.0-神经网络
文章目录
- 1.BP神经网络基本原理
- 2.一个三层BP网络
- 3.编码一个神经元
- 4.把神经元组装成网络
- 5.编码神经网络前馈
- 6.定义损失函数-MSE及代码
- 7.最小化神经网络损失-反向传播
- 8.随机梯度下降
- 9.完整神经网络
参考: 使用python从头实现BP神经网络
1.BP神经网络基本原理
利用输出后的误差来估计输出层的直接前导层的误差,再用这个误差估计更前一层的误差,如此一层一层的反传下去,就获得了所有其他各层的误差估计。
2.一个三层BP网络
3.编码一个神经元
利用python的Numpy库来完成其中数学运算
import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))class Neuron:def __init__(self,weights,bias):'''所有参数初始化:param weights:权重:param bias: 偏置'''self.weights = weightsself.bias = biasdef feedforward(self,input):'''前馈过程:给定输入得到输出的过程:param input::return: output'''total = np.dot(self.weights,input) + self.biasreturn sigmoid(total)if __name__ == '__main__':weihts = np.array([0,1])bias = 4neuron = Neuron(weihts,bias)x = np.array([2,3]) # 输入print(neuron.feedforward(x)) # 0.9990889488055994
4.把神经元组装成网络
5.编码神经网络前馈
import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))class Neuron:def __init__(self,weights,bias):'''所有参数初始化:param weights:权重:param bias: 偏置'''self.weights = weightsself.bias = biasdef feedforward(self,input):'''前馈过程:给定输入得到输出的过程:param input::return: output'''# np.dot(a,b):如果a和b是一维数组,那么返回的就是向量的内积# 如果a和b都是二维数组,那么它返回的就是矩阵乘法total = np.dot(self.weights,input) + self.biasreturn sigmoid(total)class OurNeuralNetwork:'''A neural network with:- 2 inputs- a hidden layer with 2 neurons (h1, h2)- an output layer with 1 neuron (o1)Each neuron has the same weights and bias:- w = [0, 1]- b = 0'''def __init__(self):weights = np.array([0,1])bias = 0self.h1 = Neuron(weights,bias)self.h2 = Neuron(weights,bias)self.o1 = Neuron(weights,bias)def feedforward(self,x):out_h1 = self.h1.feedforward(x)out_h2 = self.h2.feedforward(x)# the inputs for o1 are the outputs from h1 and h2out_o1 = self.o1.feedforward(np.array([out_h1,out_h2]))return out_o1if __name__ == '__main__':outnetwork = OurNeuralNetwork()x = np.array([2,3])print(outnetwork.feedforward(x)) # 0.7216325609518421
6.定义损失函数-MSE及代码
在训练网络之前,我们需要量化当前的网络是『好』还是『坏』,从而可以寻找更好的网络。这就是定义损失的目的。
我们在这里用平均方差(MSE)损失:
让我们仔细看看:
n是样品数,这里等于4(Alice、Bob、Charlie和Diana)。
y表示要预测的变量,这里是性别。
y_{true} 是变量的真实值(『正确答案』)。例如,Alice的 y_{true} 就是1(男性)。
y_{pred} 是变量的预测值。这就是我们网络的输出。
(y_{true}-y_{pred})^2 被称为方差(squared error)。我们的损失函数就是所有方差的平均值。预测效果越好,损失就越少。
更好的预测 = 更少的损失!
训练网络 = 最小化它的损失
import numpy as npdef mse_loss(y_true,y_pred):# y_true and y_pred are numpy arrays of the same lengthreturn ((y_true - y_pred) ** 2).mean()y_true = np.array([1,0,0,1])
y_pred = np.array([0,0,0,0])print(mse_loss(y_true,y_pred)) # 0.5
7.最小化神经网络损失-反向传播
8.随机梯度下降
9.完整神经网络
#!usr/bin/env python
# -*- coding:utf-8 _*-
"""
@author: liujie
@software: PyCharm
@file: 完整神经网络.py
@time: 2020/11/10 10:56
"""
import numpy as npdef sigmoid(x):'''激活函数:f(x) = 1 / (1 + e^(-x)):param x::return:'''return 1 / (1 + np.exp(-x))def deriv_sigmoid(x):# sigmoid求导fx = sigmoid(x)return fx * (1-fx)def mse_loss(y_true,y_pred):# y_true and y_pred are numpy arrays of the same lengthreturn ((y_true - y_pred) ** 2).mean()class OurNeuralNetwork:'''A neural network with:- 2 inputs- a hidden layer with 2 neurons (h1, h2)- an output layer with 1 neuron (o1)*** DISCLAIMER ***:The code below is intended to be simple and educational, NOT optimal.Real neural net code looks nothing like this. DO NOT use this code.Instead, read/run it to understand how this specific network works.'''def __init__(self):'''将weights、bias初始化'''# weightsself.w1 = np.random.normal()self.w2 = np.random.normal()self.w3 = np.random.normal()self.w4 = np.random.normal()self.w5 = np.random.normal()self.w6 = np.random.normal()# biasself.b1 = np.random.normal()self.b2 = np.random.normal()self.b3 = np.random.normal()def feedforward(self,x):# x is a numpy array with 2 elementsh1 = sigmoid(self.w1 * x[0] + self.w2 * x[1] + self.b1)h2 = sigmoid(self.w3 * x[0] + self.w4 * x[1] + self.b2)o1 = sigmoid(self.w5 * h1 + self.w6 * h2 + self.b3)return o1def train(self,data,all_y_trues):'''- data is a (n x 2) numpy array, n = # of samples in the dataset.- all_y_trues is a numpy array with n elements.Elements in all_y_trues correspond to those in data.'''learn_rate = 0.1epochs = 1000for epoch in range(epochs):for x,y_true in zip(data,all_y_trues):# feedforwardsum_h1 = self.w1 * x[0] + self.w2 * x[1] + self.b1h1 = sigmoid(sum_h1)sum_h2 = self.w3 * x[0] + self.w4 * x[1] + self.b2h2 = sigmoid(sum_h2)sum_o1 = self.w5 * h1 + self.w6 * h2 + self.b3o1 = sigmoid(sum_o1)y_pred = o1# calculate partial derivativesd_L_d_ypred = -2 * (y_true - y_pred)# Neuron o1d_ypred_d_w5 = h1 * deriv_sigmoid(sum_o1)d_ypred_d_w6 = h2 * deriv_sigmoid(sum_o1)d_ypred_d_b3 = deriv_sigmoid(sum_o1)d_ypred_d_h1 = self.w5 * deriv_sigmoid(sum_o1)d_ypred_d_h2 = self.w6 * deriv_sigmoid(sum_o1)# Neuron h1d_h1_d_w1 = x[0] * deriv_sigmoid(sum_h1)d_h1_d_w2 = x[1] * deriv_sigmoid(sum_h1)d_h1_d_b1 = deriv_sigmoid(sum_h1)# Neuron h2d_h2_d_w3 = x[0] * deriv_sigmoid(sum_h2)d_h2_d_w4 = x[1] * deriv_sigmoid(sum_h2)d_h2_d_b2 = deriv_sigmoid(sum_h2)# --- Update weights and biases# Neuron h1self.w1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w1self.w2 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_w2self.b1 -= learn_rate * d_L_d_ypred * d_ypred_d_h1 * d_h1_d_b1# Neuron h2self.w3 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w3self.w4 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_w4self.b2 -= learn_rate * d_L_d_ypred * d_ypred_d_h2 * d_h2_d_b2# Neuron o1self.w5 -= learn_rate * d_L_d_ypred * d_ypred_d_w5self.w6 -= learn_rate * d_L_d_ypred * d_ypred_d_w6self.b3 -= learn_rate * d_L_d_ypred * d_ypred_d_b3# --- Calculate total loss at the end of each epochif epoch % 10 == 0:y_preds = np.apply_along_axis(self.feedforward, 1, data)loss = mse_loss(all_y_trues, y_preds)print("Epoch %d loss: %.3f" % (epoch, loss))if __name__ == '__main__':# Define datasetdata = np.array([[-2, -1], # Alice[25, 6], # Bob[17, 4], # Charlie[-15, -6], # Diana])all_y_trues = np.array([1, # Alice0, # Bob0, # Charlie1, # Diana])# Train our neural network!network = OurNeuralNetwork()network.train(data, all_y_trues)# test# Make some predictionsemily = np.array([-7, -3]) # 128 pounds, 63 inchesfrank = np.array([20, 2]) # 155 pounds, 68 inchesprint("Emily: %.3f" % network.feedforward(emily)) # 0.951 - Fprint("Frank: %.3f" % network.feedforward(frank)) # 0.039 - M
搞定了一个简单的神经网络,快速回顾一下:介绍了神经网络的基本结构——神经元;
在神经元中使用S型激活函数;
神经网络就是连接在一起的神经元;
构建了一个数据集,输入(或特征)是体重和身高,输出(或标签)是性别;
学习了损失函数和均方差损失;
训练网络就是最小化其损失;
用反向传播方法计算偏导;
用随机梯度下降法训练网络;
接下来你还可以:用机器学习库实现更大更好的神经网络,例如TensorFlow、Keras和PyTorch;
在浏览器中实现神经网络;
其他类型的激活函数;
其他类型的优化器;
学习卷积神经网络,这给计算机视觉领域带来了革命;
学习递归神经网络,常用语自然语言处理;
深度学习2.0-神经网络相关推荐
- 【深度学习】卷积神经网络速成
[深度学习]卷积神经网络速成 文章目录 [深度学习]卷积神经网络速成 1 概述 2 组成 2.1 卷积层 2.2 池化层 2.3 全连接层 3 一个案例 4 详细分析 1 概述 前馈神经网络(feed ...
- 谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络、CV、NLP 难点解析
谷歌新 AI 实验室主管 Hugo 深度学习教程:神经网络.CV.NLP 难点解析 [日期:2016-12-16] 来源:新智元 作者: [字体:大 中 小] 11月22日,谷歌在蒙特利尔的 ...
- CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录
CV之YOLOv3:深度学习之计算机视觉神经网络Yolov3-5clessses训练自己的数据集全程记录 目录 视频请观看 训练输出记录 视频请观看 深度学习之计算机视觉神经网络训练Yolov3-5c ...
- CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录
CV之YOLO:深度学习之计算机视觉神经网络tiny-yolo-5clessses训练自己的数据集全程记录 目录 训练全部流程记录 训练全部流程记录 1.采用tiny-yolo-5clessses训练 ...
- 深度学习之循环神经网络(12)预训练的词向量
深度学习之循环神经网络(12)预训练的词向量 在情感分类任务时,Embedding层是从零开始训练的.实际上,对于文本处理任务来说,领域知识大部分是共享的,因此我们能够利用在其它任务上训练好的词向量 ...
- 深度学习之循环神经网络(11-b)GRU情感分类问题代码
深度学习之循环神经网络(11-b)GRU情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorfl ...
- 深度学习之循环神经网络(11-a)LSTM情感分类问题代码
深度学习之循环神经网络(11-a)LSTM情感分类问题代码 1. Cell方式 代码 运行结果 2. 层方式 代码 运行结果 1. Cell方式 代码 import os import tensorf ...
- 深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战
深度学习之循环神经网络(11)LSTM/GRU情感分类问题实战 1. LSTM模型 2. GRU模型 前面我们介绍了情感分类问题,并利用SimpleRNN模型完成了情感分类问题的实战,在介绍完更为强 ...
- 深度学习之循环神经网络(10)GRU简介
深度学习之循环神经网络(10)GRU简介 1. 复位门 2. 更新门 3. GRU使用方法 LSTM具有更长的记忆能力,在大部分序列任务上面都取得了比基础RNN模型更好的性能表现,更重要的是,LST ...
- 深度学习之循环神经网络(9)LSTM层使用方法
深度学习之循环神经网络(9)LSTM层使用方法 1. LSTMCell 2. LSTM层 在TensorFlow中,同样有两种方式实现LSTM网络.既可以使用LSTMCell来手动完成时间戳上面的循 ...
最新文章
- 【Leetcode】刷题之路4(python版)
- HEOI2017游记
- 怎样下载C/C++的免费、开源且跨平台IDE——Code::Blocks
- Web程序员的Mysql进阶序二之sql多条数据插入、多条数据更新、多表同时查询
- 安装Hbase(分布式)遇到一些问题及解决方法
- thikphp 控制器
- 以眼睛的名义:一些光度学概念的解析
- 多个Excel合并为一个Excel表
- webex无法用计算机呼叫,CiscoWebExMeetingsServer疑难解答指引.PDF
- C语言 输出乘法口诀表
- R语言Tukey检验进行事后检验(post hoc)实战:单因素方差分析告诉我们并不是所有的群体手段的效果是均等的,确切地找出哪些组彼此不同使用Tukey检验
- Java类属性字段校验(validation的使用)
- 火车采集器html规则,火车头采集器代码过滤方法
- 解放生产力!20 个必知必会 VSCode 小技巧
- JAVA儿童接种系统计算机毕业设计Mybatis+系统+数据库+调试部署
- 去除水印PNAS-latex
- 三角网导线平差实例_三角网近似平差及边长计算表
- 支持手机,滑动拖动验证
- 退出码 -1073740791 (0xC0000409)
- 观《源代码》(电影)有感