首先我们来做个猜数字的游戏。如图,已知上面4行数字【A,B,C,D】列,求第5行D列的值。
可以说,这是一个奥数题,A,B,C,D列之间应该是有隐藏规则的,数学敏锐的同学可能可以发现其规则为:
D =A *2 + B *3 +C * 4
因此,代入A=5, B=8, C=6 计算得出第5行的D列应该是60
在这个游戏里面,数学天赋是一个人的直觉,而我们本次实现的AI程序也具备这个“直觉功能 ”, 对于有任意隐藏规则的数据进行学习, 揣摩出隐藏规则之后,用于新输入数据的计算,并给出相同规则目标值的近似值。
import numpy as np
import tensorflow as tf
#训练输入表格中ABC列数据
X=np.mat([
[1.,4.,2.]
,[2.,2.,5.]
,[3.,5.,6.]
,[4.,8.,9.]
]).astype(np.float32)
#训练输出表格D列数据
Y=np.mat([
[22.]
,[30.]
,[45.]
,[68.]
]).astype(np.float32)
#预测输入数据
x_input=np.mat([
[5.,8.,6.]
]).astype(np.float32)
#预测输出数据 隐藏的规则: 第一个数 *2 + 第二个数 *3 + 第三个数 *4
# y_output=60
#模型的输入
xs = tf.placeholder(tf.float32,[None,3])
ys = tf.placeholder(tf.float32,[None,1])
#b初始化为0
b = tf.Variable(0,dtype=tf.float32)
#w指定为随机数,参数分别为 ([神经网络输入size,神经网络 输出size],随机值最小阀值, 随机值最大阀值)
w = tf.Variable(tf.random_uniform([3,1],0,1),dtype=tf.float32)
#计算x*w +b
z = tf.add(tf.matmul(xs,w),b)
#用relu函数进行激活
#计算loss值,采用差的平方,再求平均数
cost = tf.reduce_mean(tf.square(y-ys))
#定义反向传播的方法
train = tf.train.GradientDescentOptimizer(0.01).minimize(cost)
#启动TF
init = tf.global_variables_initializer()
session = tf.Session()
session.run(init)
#执行50000次反向传播,训练w,b
for i in range(50000):
session.run(train,feed_dict=)
#训练完毕后输入新值进行计算,得到预测结果
#打印预测结果58, 和60非常接近,预测成功
print session.run(predict)
大家可以尝试改变训练的数据,自己定义一些新的隐藏规则,如果不是太复杂的话,该程序应该基本都能识别(复杂的规则需要优化代码)。隐藏规则的载体是参数w和b, 这2个参数初始化为随机数和0,之后每次在for循环中运行都会进行有方向地改动,让所有行满足x(A,B,C) * w +b的结果和D的差异(平方差)最小。因此一旦w,b的最优解确定了, 对于新给出来第5行的A,B,C, 求出D=x(A,B,C) * w +b,D为同规则下的近似值。
AI从代码功能层次上看,就是要对数字隐藏规则的暴力识别,不管是图像识别,语音识别,写诗,翻译,问答等,归根到底,在AI程序中都会先把数据转换成一组存在隐藏规则的数字,之后成千上万次计算,暴力识别规则, 模拟规则的近似方案,然后用已识别的规则去匹配新的图片或者声音数据 ,从而得到判断的结果。
领取专属 10元无门槛券
私享最新 技术干货