一些人类通过直觉可以很快解决的问题,目前却很难通过计算机解决。这就是人工智能需要解决的问题。
机器学习:如果一个程序可以在任务T上,随着经验E的增加,效果P也可以随之增加,则称这个程序可以从经验中学习。
在使用逻辑回归算法分类垃圾邮件时,最终效果不仅取决于训练数据,也依赖于从数据中提取的特征。
一旦解决了数据表达(比如直角坐标和极坐标的转化)和特征提取,很多人工智能任务也就解决了90%。
深度学习解决的核心问题之一就是自动地将简单的特征组合成更加复杂的特征,并使用这些组合特征解决问题。深度学习与传统机器学习算法的区别在于基础特征提取后多了多层复杂特征提取,此步骤使得最后的权重学习变得更加简单有效。
在TensorFlow中,张量可以被简单理解为多维数据,表明了它的数据结构,Flow则体现了它的计算模型。它是一个通过计算图的形式来表述计算的编程系统。
TensorFlow程序一般可以分为两个阶段,第一个阶段定义计算图中所有的计算。第二个阶段执行计算。下图为计算定义阶段的样例。
# -*- coding: utf-8 -*- import tensorflow as tf a=tf.constant([1.0,2.0],name="a") b=tf.constant([2.0,3.0],name="b") result=a+b
张量并没有真正保存数字,它保存的是如何得到这些数字的计算过程。
https://playground.tensorflow.org 可以进入tensorflow游乐场。
tf.Variable 作用就是保存和更新神经网络中的参数
例如:weights=tf.Variable(tf.random_normal([2,3],stddev=2))会产生一个2*3的矩阵,矩阵中元素的均值为0,标准差为2,正态分布。
# -*- coding: utf-8 -*- import tensorflow as tf #代码实现了神经网络的前向传播过程 #x用常量表示 w1=tf.Variable(tf.random_normal((2,3),stddev=1,seed=1))#虽定义,但未真正运行,所以需要后续的run w2=tf.Variable(tf.random_normal((3,1),stddev=1,seed=1)) x=tf.constant([[0.7,0.9]])#1*2 a=tf.matmul(x,w1)# 1*2 2*3 1*3 y=tf.matmul(a,w2)# 1*3 3*1 1*1 sess=tf.Session() sess.run(w1.initializer) sess.run(w2.initializer) print(sess.run(y))#输出 [[3.957578]] sess.close()
完整的训练神经网络程序,解决二分类问题
# -*- coding: utf-8 -*- import tensorflow as tf from numpy.random import RandomState #完整神经网络样例 batch_size = 8 w1 = tf.Variable(tf.random_normal([2,3],stddev = 1,seed = 1)) w2 = tf.Variable(tf.random_normal([3,1],stddev = 1,seed = 1)) x = tf.placeholder(tf.float32,shape=(None,2),name = 'x-input') y_ = tf.placeholder(tf.float32,shape=(None,1),name = 'y-input') #定义神经网络前向传播过程 a = tf.matmul(x,w1) y = tf.matmul(a,w2) #定义损失函数和反向传播算法 cross_entropy = -tf.reduce_mean( y_*tf.log(tf.clip_by_value(y,1e-10,1.0)+(1-y_))*tf.log(tf.clip_by_value(1-y,1e-10,1.0))) train_step = tf.train.AdamOptimizer(0.001).minimize(cross_entropy) #通过随机数生成一个模拟数据集 rdm = RandomState(1) dataset_size = 128 X = rdm.rand(dataset_size,2)#(128,2) Y = [[int(x1+x2<1)] for (x1,x2) in X] #print(Y)#[[0], [1], [1], [1],...]所有x1+x2<1的样例都被认为为正样本 #创建一个会话来运行tensorflow程序 with tf.Session() as sess: init_op = tf.initialize_all_variables() sess.run(init_op) #print(sess.run(w1)) # print(sess.run(w2))#未经训练的权值 STEPS = 5000 for i in range(STEPS):#i从0~4999 start = (i*batch_size) % dataset_size#每次选8个样本进行训练 end = min(start+batch_size,dataset_size) #通过选取的样本训练神经网络并更新参数 sess.run(train_step,feed_dict = {x:X[start:end],y_:Y[start:end]}) if i%1000 == 0:#只是为了输出 #每隔一段时间计算在所有数据上的交叉熵并输出,交叉熵越小说明预测的结果和真实的结果差距越小 total_cross_entropy = sess.run( cross_entropy,feed_dict={x:X,y_:Y}) print("After %d training step,cross entropy on all data is %g" % (i,total_cross_entropy)) #print(sess.run(w1)) # print(sess.run(w2))
图为输入数据