title: 深度学习之非线性问题
date: 2019-11-17 10:31:00
tags:
- python
- TensorFlow
问题引入
家长们猜测学校的三好学生评选规则,但这次情况不一样了,孩子们的总分不知道,仅知道是否评选上三好学生的结果和孩子的分数
解决思路
先通过随机函数批量生成实验数据,此处模拟的是孩子们的家长向系统投喂数据。然后我们要使用的是 sigmod 函数,这里利用的是 sigmod 在 -5 ~ 5 之间会突变的特性,结果为 0或者1,恰好可以代表是三好学生或者不是三好学生。然后我们还需注意代码中偏移量b 的使用,否则我们的答案只会一直未0或1,达不到突变的效果。
实验代码
import tensorflow as tf
import numpy as np
import random
random.seed()
rowCount = 10000
goodCount = 0
xDataRandom = np.full((rowCount, 3), 0, dtype=np.float32)
yTrainRandom = np.full(rowCount, 0, dtype=np.float32)
for i in range(rowCount):
for j in range(3):
if i % 2 == 0:
xDataRandom[i][j] = np.floor(random.random() * 41 + 60)
else:
xDataRandom[i][j] = np.floor(random.random() * 8 + 93)
if xDataRandom[i][0] * 0.6 + xDataRandom[i][1] * 0.3 + xDataRandom[i][2] * 0.1 >= 95:
yTrainRandom[i] = 1
goodCount += 1
else:
yTrainRandom[i] = 0
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)
w1 = tf.nn.softmax(w)
y = w1 * x
yMid = tf.reduce_sum(y) - b
yResult = tf.nn.sigmoid(yMid)
loss = tf.abs(yTrain - yResult)
optimizer = tf.train.RMSPropOptimizer(0.1)
train = optimizer.minimize(loss)
sess = tf.Session()
init = tf.global_variables_initializer()
sess.run(init)
for i in range(10000):
result = sess.run([train, x, w1, yResult, yMid, b, yTrain, loss], feed_dict={x: xDataRandom[i % rowCount], yTrain: yTrainRandom[i % rowCount]})
if i % 100 == 0:
print(result)