CH5 用神经网络解决线性问题
- 了解非线性问题、分类问题
- 掌握神经网络解决二分类问题
- 掌握随机生成训练数据的方法
非线性问题
三好学生问题:家长们再次凑到一起,但这次情况不一样了,孩子们的总分不知道,仅知道是否评选上三好学生的结果。
计算总分的规则仍然是:总分 = 德育分*60% + 智育分*30% + 体育分*10%
评选三好学生的标准是:总分 ≥ 95
家长不知道这两条规则。
这是一个典型的分类问题。学校一定是以德育分、智育分和体育分三项分数为依据,把学生们分成两类:三好学生和非三好学生。因此,这是一个常见的二分类问题。下图是用神经网络简述二分类问题。

分类问题一般是非线性的。
- 可以看出,当总分达到95之后,y值有一个跳变,并非线性的(一条直线)
- y=f(xA),跳变函数/阶跃函数
- “一票否决制”

设计神经网络模型
总分(0~100)= 德育分60% + 智育分30% + 体育分*10% -> 评选结果(0、1)
激活函数:把线性关系转换成非线性关系的函数。激活函数 sigmoid 函数的作用是把参数转换成为 0 到 1 之间的一个小数。

使用激活函数后的神经网络模型:

实现该网络模型的代码:
# import tensorflow as tf
import tensorflow.compat.v1 as tf
tf.compat.v1.disable_eager_execution()
x = tf.placeholder(dtype=tf.float32)
yTrain = tf.placeholder(dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
n1 = w * x
n2 = tf.reduce_sum(n1)
y = tf.nn.sigmoid(n2)
准备训练数据
使用 random 产生随机数
import random
random.seed() # 初始化随机数种子,增加随机性
random.random() # 产生一个 [0,1) 范围内的小数
r = random.random() * 10 # 通过乘以一个整数,使产生的随机数的范围增大,此处范围为 [0,10)
产生随机训练数据
import random
random.seed()
# 产生一个 [0,100] 范围内的整数代表某一科分数
xData = [int(random.random() * 101),int(random.random() * 101),int(random.random() * 101)]
# 按规则生成总分
xAll = xData[0] * 0.6 + xData[1] * 0.3 + xData[2] * 0.1
# 按规则生成评选结果
if xAll >= 95:
yTrainData = 1
else:
yTrainData = 0
print("xData: %s" %xData)
print("yTrainData: %s" %yTrainData)

优化产生的训练数据,产生一个[60,101) 范围内的更合理的分数:
xData = [
int(random.random() * 41 + 60),
int(random.random() * 41 + 60),
int(random.random() * 41 + 60)
]

产生更多结果为 1 的训练数据,产生一个[93,101)范围内的符合三好学生要求的分数:
xData = [
int(random.random() * 8 + 93),
int(random.random() * 8 + 93),
int(random.random() * 8 + 93)
]
为什么要使用随机数据来训练神经网络:
- 并非“剧透”,用于演示和验证
- 符合人工收集的规贝
- 满足神经网络大规模训练的需要
训练
# import tensorflow as tf
import tensorflow.compat.v1 as tf
import random
tf.compat.v1.disable_eager_execution()
random.seed()
x = tf.placeholder(dtype=tf.float32)
yTrain = tf.placeholder(dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
wn = tf.nn.softmax(w)
n1 = wn * x
n2 = tf.reduce_sum(n1)
y = tf.nn.sigmoid(n2)
loss = tf.abs(yTrain - y)
optimizer = tf.train.RMSPropOptimizer(0.1)
train = optimizer.minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(5):
xData = [
int(random.random() * 8 + 93),
int(random.random() * 8 + 93),
int(random.random() * 8 + 93)
]
xAll = xData[0] * 0.6 + xData[1] * 0.3 + xData[2] * 0.1
if xAll >= 95:
yTrainData = 1
else:
yTrainData = 0
result = sess.run(
[train, x, yTrain, w, n2, y, loss],
feed_dict={x:xData, yTrain:yTrainData}
)
print(result)
xData = [
int(random.random() * 41 + 60),
int(random.random() * 41 + 60),
int(random.random() * 41 + 60)
]
xAll = xData[0] * 0.6 + xData[1] * 0.3 + xData[2] * 0.1
if xAll >= 95:
yTrainData = 1
else:
yTrainData = 0
result = sess.run(
[train, x, yTrain, w, n2, y, loss],
feed_dict={x:xData, yTrain:yTrainData}
)
print(result)
观察训练结果:

增加偏移量 b 来加速训练:
+ b = tf.Variable(80, dtype=tf.float32)
- n2 = tf.reduce_sum(n1)
+ n2 = tf.reduce_sum(n1) - b
# import tensorflow as tf
import tensorflow.compat.v1 as tf
import random
tf.compat.v1.disable_eager_execution()
random.seed()
x = tf.placeholder(dtype=tf.float32)
yTrain = tf.placeholder(dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
b = tf.Variable(80, dtype=tf.float32)
wn = tf.nn.softmax(w)
n1 = wn * x
n2 = tf.reduce_sum(n1) - b
y = tf.nn.sigmoid(n2)
loss = tf.abs(yTrain - y)
optimizer = tf.train.RMSPropOptimizer(0.1)
train = optimizer.minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(5):
xData = [
int(random.random() * 8 + 93),
int(random.random() * 8 + 93),
int(random.random() * 8 + 93)
]
xAll = xData[0] * 0.6 + xData[1] * 0.3 + xData[2] * 0.1
if xAll >= 95:
yTrainData = 1
else:
yTrainData = 0
result = sess.run(
[train, x, yTrain, w, n2, y, loss],
feed_dict={x:xData, yTrain:yTrainData}
)
print(result)
xData = [
int(random.random() * 41 + 60),
int(random.random() * 41 + 60),
int(random.random() * 41 + 60)
]
xAll = xData[0] * 0.6 + xData[1] * 0.3 + xData[2] * 0.1
if xAll >= 95:
yTrainData = 1
else:
yTrainData = 0
result = sess.run(
[train, x, yTrain, w, n2, y, loss],
feed_dict={x:xData, yTrain:yTrainData}
)
print(result)

- b = tf.Variable(80, dtype=tf.float32)
+ b = tf.Variable(95, dtype=tf.float32)

批量产生随机训练数据:
import random
import numpy as np
tf.compat.v1.disable_eager_execution()
random.seed()
rowCount = 5
xData = np.full(
shape=(rowCount, 3),
fill_value=0,
dtype=np.float32
)
yTrainData = np.full(
shape=rowCount,
fill_value=0,
dtype=np.float32
)
for i in range(rowCount):
xData[i][0] = int(random.random() * 11 + 90)
xData[i][1] = int(random.random() * 11 + 90)
xData[i][2] = int(random.random() * 11 + 90)
xAll = xData[i][0] * 0.6 + xData[i][0] * 0.3 + xData[i][2] * 0.1
- numpy 是常用于数学计算的类库
- npful 函数用于向数组中填充初始数值
- 使用循环来生成批量的数据
# import tensorflow as tf
import tensorflow.compat.v1 as tf
import random
import numpy as np
tf.compat.v1.disable_eager_execution()
random.seed()
rowCount = 5
xData = np.full(
shape=(rowCount, 3),
fill_value=0,
dtype=np.float32
)
yTrainData = np.full(
shape=rowCount,
fill_value=0,
dtype=np.float32
)
goodCount = 0
for i in range(rowCount):
xData[i][0] = int(random.random() * 11 + 90)
xData[i][1] = int(random.random() * 11 + 90)
xData[i][2] = int(random.random() * 11 + 90)
xAll = xData[i][0] * 0.6 + xData[i][1] * 0.3 + xData[i][2] * 0.1
if xAll >= 95:
yTrainData[i] = 1
goodCount = goodCount + 1
else:
yTrainData[i] = 0
print("xData=%s" %xData)
print("yTrainData=%s" %yTrainData)
print("goodCount=%s" %goodCount)
x = tf.placeholder(dtype=tf.float32)
yTrain = tf.placeholder(dtype=tf.float32)
w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
b = tf.Variable(80, dtype=tf.float32)
wn = tf.nn.softmax(w)
n1 = wn * x
n2 = tf.reduce_sum(n1) - b
y = tf.nn.sigmoid(n2)
loss = tf.abs(yTrain - y)
optimizer = tf.train.RMSPropOptimizer(0.1)
train = optimizer.minimize(loss)
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(2):
for j in range(rowCount):
result = sess.run(
[train, x, yTrain, wn, b, n2, y, loss],
feed_dict={x:xData[j], yTrain:yTrainData[j]}
)
print(result)

可以看到,xData 是一个二维数组,其中包含了 5 条数据,每条是 3 项符合定义范围的分数。tTrainData 中包含 3 个 1,也就是说有 3 位学生符合三好学生的条件,接下来输出的 goodCount 也确实等于 3,再往下的训练也一切正常。
练习
编程生成 5
[-20,20)范围内的随机数,并用 TensorFlow 设法求出这些数字进行 sigmoid 操作后的结果。import tensorflow as tf
import random a = tf.placeholder(dtype=tf.float32)
b = tf.nn.sigmoid(a)
sess = tf.Session() for i in range(5):
print(sess.run(b, feed_dict={a: random.random() * 40 - 20}))
编程解决下述非线性问题
- 输入数据
[1,1,1],输出目标值:2 - 输入数据
[1,0,1],输出目标值:1 - 输入数据
[1,2,3],输出目标值:3
import tensorflow as tf x = tf.placeholder(shape=[3], dtype=tf.float32)
yTrain = tf.placeholder(shape=[], dtype=tf.float32) w = tf.Variable(tf.zeros([3]), dtype=tf.float32)
b = tf.Variable(0, dtype=tf.float32)
y = tf.reduce_sum(tf.nn.sigmoid(x * w + b)) loss = tf.abs(y - yTrain)
optimizer = tf.train.RMSPropOptimizer(0.1)
train = optimizer.minimize(loss) sess = tf.Session()
sess.run(tf.global_variables_initializer()) for i in range(1000):
print(sess.run([train, y, yTrain, loss], feed_dict={x: [1, 1, 1], yTrain: 2}))
print(sess.run([train, y, yTrain, loss], feed_dict={x: [1, 0, 1], yTrain: 1}))
print(sess.run([train, y, yTrain, loss], feed_dict={x: [1, 2, 3], yTrain: 3}))
- 输入数据
CH5 用神经网络解决线性问题的更多相关文章
- [ch04-03] 用神经网络解决线性回归问题
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力. 4.3 神经网络法 在梯度下降法中,我们简单讲述了一下神 ...
- 矩阵乘法&矩阵快速幂&矩阵快速幂解决线性递推式
矩阵乘法,顾名思义矩阵与矩阵相乘, 两矩阵可相乘的前提:第一个矩阵的行与第二个矩阵的列相等 相乘原则: a b * A B = a*A+b*C a*c+b*D c d ...
- 神经网络_线性神经网络 2 (Nerual Network_Linear Nerual Network 2)
1 LMS 学习规则 1.1 LMS学习规则定义 MSE=(1/Q)*Σe2k=(1/Q)*Σ(tk-ak)2,k=1,2,...,Q 式中:Q是训练样本:t(k)是神经元的期望输出:a(k)是神经元 ...
- SVM之解决线性不可分
SVM之问题形式化 SVM之对偶问题 SVM之核函数 >>>SVM之解决线性不可分 写在SVM之前——凸优化与对偶问题 上一篇SVM之核函数介绍了通过计算样本核函数,实际上将样本映射 ...
- 神经网络_线性神经网络 1 (Nerual Network_Linear Nerual Network 1)
2019-04-08 16:59:23 1 学习规则(Learning Rule) 1.1 赫布学习规则(Hebb Learning Rule) 1949年,Hebb提出了关于神经网络学习机理的“突触 ...
- [ch05-02] 用神经网络解决多变量线性回归问题
系列博客,原文在笔者所维护的github上:https://aka.ms/beginnerAI, 点击star加星不要吝啬,星越多笔者越努力 5.2 神经网络解法 与单特征值的线性回归问题类似,多变量 ...
- TensorFlow 用神经网络解决非线性问题
本节涉及点: 激活函数 sigmoid 产生随机训练数据 使用随机训练数据训练 加入偏移量b加快训练过程 进阶:批量生产随机训练数据 在前面的三好学生问题中,学校改变了评三好的标准 —— 总分> ...
- pytorch神经网络解决回归问题(非常易懂)
对于pytorch的深度学习框架,在建立人工神经网络时整体的步骤主要有以下四步: 1.载入原始数据 2.构建具体神经网络 3.进行数据的训练 4.数据测试和验证 pytorch神经网络的数据载入,以M ...
- MATLAB——神经网络构造线性层函数linearlayer
% example5_7.m x=-:; y=*x-; randn(); % 设置种子,便于重复执行 y=y+randn(,length(y))*1.5; % 加入噪声的直线 plot(x,y,'o' ...
- 神经网络_线性神经网络 3 (Nerual Network_Linear Nerual Network 3)
1 LMS 学习规则_解方程组 1.1 LMS学习规则举例 X1=[0 0 1]T,t1=0:X2=[1 0 1]T,t2=0:X3=[0 1 1]T,t3=0:X1=[1 1 1]T,t1=1. 设 ...
随机推荐
- E - Stamp
题目链接 : E - Stamp (atcoder.jp) 题意:给定长为n的s串,m的t串,和一个长度为n的x串,问你能否操作任意次数的操作, 每次操作都可以使x中长度为m的存在串变为t,最后使得变 ...
- Spring 注解之 @EnableTransactionManagement:Spring Boot 事务配置
Spring Boot 开启声明式事务支持 所有的数据访问技术都有事务处理机制,这些技术提供了API用来开启事务.提交事务以完成数据操纵,或者在发生错误的时候回滚数据.Spring支持声明式事务,这是 ...
- 洛谷 P3268 [JLOI2016]圆的异或并
洛谷 P3268 [JLOI2016]圆的异或并 题目描述 在平面上有两两不相交的\(n\)个圆,即其关系只有相离和包含.求这些圆的异或面积并. 异或面积并为:当一片区域被奇数个圆包含则计算其面积,否 ...
- 【2020.11.24提高组模拟】变换 (transform) 题解
[2020.11.24提高组模拟]变换 (transform) 题解 题意描述 给一个大小为\(n\)的\(01\)环\(A\),点编号为\(0,1,\dots,n-1\).每一个点\(i\)都与\( ...
- FastAPI安全异常处理:从401到422的奇妙冒险
title: FastAPI安全异常处理:从401到422的奇妙冒险 date: 2025/06/05 21:06:31 updated: 2025/06/05 21:06:31 author: cm ...
- python爬虫基本学习——函数
函数 概念:编写程序时,需要某块代码多次,为了提高编写效率和代码的重用,把具有独立功能的代码块组织为一个小模块,即函数. 代码练习 ''' #函数的定义 def printinfo(): print( ...
- taskiq异步分布式任务管理器 适用fastapi
taskiq 异步分布式任务管理器 https://taskiq-python.github.io/ 将 taskiq 视为 asyncio celery 实现.它使用几乎相同的模式,但它更加现代和灵 ...
- Spring IoC容器与依赖注入深度解析
在 Spring 生态系统中, 控制反转(IoC) 与 依赖注入(DI) 是实现组件解耦的核心机制.本文从容器架构.依赖注入实现.生命周期管理及面试高频问题四个维度,结合 Spring 源码与工程实践 ...
- HyperWorks实体网格划分
实体网格剖分 在 HyperMesh 中,使用 Solid Map 功能进行实体网格剖分.该面板如下图所示: 图 4-4 Solid Map 面板 Ø 通过 Solid Map Panel 进行实体网 ...
- UFT 对时间的处理
1. 当前时间的后n天 2. 当前时间的前n天 3. 当前时间 eg: