构建模型是在实际进行一个项目之前要进行的工作,相当于设计,要针对用户需求设计合适的预测模型和优化模型。
我们把机器学习运用到实际的工作中时,是期望机器可以具有一些人才有的智能。简单的说,输入是一个集合,输出也是一个集合,我们要建立输入集合与输出集合之间的关系模型,使系统接受到一个输入之后,可以经过这个关系模型的计算,映射到输出集合上的一个点。
而把输入和输出关联起来的这个关系模型,就是我们要创建的预测模型。这个模型可以很简单,比如,就是建立了
y=W*x+b
这样一个线性模型,也可以是比较复杂的模型。比如我们常用的包含多个隐藏层的卷积神经网络模型,都是建立起了输入与输出之间的一个关系,让我们接受到一个新的输入时,可以根据输入算出一个输出。
构建出预测模型之后,其实这个模型什么事也干不了,他就是我们随便写的一个表示输出与输入关系的函数,但在初始情况下,他并不能很好的完成这个任务。下面我们要做的事情就是用正确的数据带入这个函数,求出函数的参数,比如上面公式中的W和b。因为每一对正确的数据带进去都会得到一个参数,那么到底我们选择哪一个呢,这就是我们要构建的优化模型,也就是我们常说的损失函数,用一种在数学上可计算的方式,去逼近我们理想中的那个参数。
比如:
cross_entropy = -tf.reduce_sum(y * tf.log(y_fc2))
这样一个损失函数,函数的值cross_entropy 越小,就代表预测模型也好。那么我们就把问题转化为让损失函数趋于最小值的问题。
这里我们常用的方法是梯度下降法:
高等数学的理论告诉我们;
1)一个函数f(x,y)的对某个参数x的偏导数可以反应该函数在向量x附近的变化速度。
2)导函数的值为正代表函数递增,为负代表函数递减。
因此,这里我们只要使用链式法则,用cross_entropy 对每一层的权重参数w求偏导数,就可以得到权重参数的变化率,然后再用该参数的当前值减去(学习速度*偏导数的值),就可以完成权重参数的微调(减去,表示使导函数为负)。
这就是优化模型的训练原理,这里我们只要设计得出这个损失函数就行了。
TensorFlow的本意是张量流,就是通过使张量在图中流动的方式来计算。模型的实现过程,就是构建这个图的过程。构建图包括三部分内容:
x = tf.placeholder("float", [None, 784])
initial = tf.constant(0.1, shape = shape)
initial = tf.truncated_normal(shape = shape, stddev = 0.1, dtype = dtype, name = name)
#tf.truncated_normal这个函数产生正太分布,均值和标准差自己设定。
# shape表示生成张量的维度,mean是均值,stddev是标准差。
tf.Variable(initial)
hidden_conv1 = tf.nn.relu(conv2d(x_image, weight_conv1) + bias_conv1)
#tf.nn.relu()函数,激活函数,是将大于0的数保持不变,小于0的数置为0
hidden_pool1 = max_pool_2x2(hidden_conv1)
# create tensorflow structure
cross_entropy = -tf.reduce_sum(y * tf.log(y_fc2))
optimize = tf.train.AdamOptimizer(0.0001)
train = optimize.minimize(cross_entropy)
训练模型就是要使数据在上面构建的图中跑起来。
session = tf.Session()
init = tf.initialize_all_variables()
session.run(init)
for i in range(10000):
batch = mnist.train.next_batch(50)
session.run(train, feed_dict = {x:batch[0], y:batch[1], keep_prob:0.5})
实际预测,其实和训练一样,就是使用实际数据在上面构建图中的一次实际运行的过程,只是这次运行不需要反向传播去优化权值向量。
实际预测的另一个重要的工作是对输入参数进行预处理:
1)通过灰度化、去噪、切割等操作使输入数据变成“好的”数据。
2)使用reshape对输入数据进行形变,使其符合上面构建图的要求。
以上是个人初学机器学习对tensorFlow的一些理解,有不对的地方欢迎讨论交流。