"""
身份证问题的引入
"""
"""
多层全连接神经网络
身份证问题的引入
规则如下:
1.我们可知,身份证由18位数字组成
2.身份证的倒数第二个数字代表性别男女,奇数为男,偶数为女,这是一个很简单的基本规则
问题的由来:
加入我们不知道这个规则,但是收集了一大堆身份证,我们希望通过神经网络来寻找这个规律
"""
"""
问题分析:
已知信息由身份证号和它对应的持有者性别组成,
因此身份证号可以作为神经网络的输入
持有者可以作为神经网络计算结果的目标值
由于性别只有男女,所以本问题很明显是一个二分类问题
初步判断不是一个线性问题,因为线性问题会随着权重值的变化有一个线性变化的规律
如果我们预知了这个与性别有关的编号规则,会发现这也不是一个跳变的非线性问题
"""
"""
尝试解决问题:
我们尝试设计以往的单层网络模型来解决这个身份证问题
先构建一个身份证问题的单层神经网络模型图 如下
"""
import tensorflow as tf
import random
random.seed() #产生随机数种子
x = tf.placeholder(tf.float32) #输入
yTrain = tf.placeholder(tf.float32) #目标值
w = tf.Variable(tf.random_normal([4], mean=0.5, stddev=0.1), dtype=tf.float32) #w是一个4维的向量,其中每一个数字都被置为随机数,随机数符合正态分布
b = tf.Variable(0, dtype=tf.float32) #偏移量
n1 = w*x + b #n1节点
y = tf.nn.sigmoid(tf.reduce_sum(n1)) #求n节点的和 并 用sigmoid函数输出y值 , y值 要么为0 要么为1
loss = tf.abs(y-yTrain) #误差率
optimizer = tf.train.RMSPropOptimizer(0.01) #以0.01调整优化器
train = optimizer.minimize(loss) #以最小化原则调整误差率
sess = tf.Session() #会话对象
sess.run(tf.global_variables_initializer()) #对可变参数进行初始化
lossSum = 0.0 #定义此变量记录训练中误差的总和
#开始模拟真实数据
for i in range(500):
#产生四个随机0到9数字
xDataRandom = [int(random.random()*10), int(random.random()*10), int(random.random()*10), int(random.random()*10)]
if xDataRandom[2] % 2 == 0:
yTrainDataRandom = 0
else:
yTrainDataRandom = 1;
result = sess.run([train, x, yTrain, y, loss], feed_dict={x:xDataRandom, yTrain:yTrainDataRandom})
lossSum = lossSum + float(result[len(result)-1])
print("i:%d, loss:%10.10f, avgloss:%10.10f" % (i, float(result[len(result)-1]), lossSum/(i+1)))
运行结果如图:
可知 avgloss平均误差会在0.47这范围内浮动,基本稳定下来了,再加训练次数也不能使误差越来越小。这就说明目前的神经网络模型结构已经无法解决当前这个问题。
由此提出 多层全连接神经网络模型
借由老铁的文语结束:站在高处望深渊,坠入深渊识攀爬
人不活一个点, 人活起伏
ps:露露同学(老铁)一直是我崇拜的偶像,这么多年来,我很少看见女生这么优秀,真心的!点赞!
后续内容见下一章内容(记于2020.03.08 23:02)