TensorFlow笔记五
++@Author:LF
@Date:2017-12-29++
昨天学习了常用的损失函数——soft回归结合交叉熵。主要针对回归类问题,后面其实看了一下预测类问题的常用损失函数——均方误差。其实其他都一样,只是损失函数的定义有所区别。这里给出均方误差的损失函数:
TensorFlow的实现代码:
Mse = tf.reduce_mean(tf.square(y_-y))
这里关于均方误差损失函数就不多看了,以后涉及到再看。
今天还看了一下自定义损失函数,其实核心都没有变,只是处理数据的函数表达式不同罢了,针对不同的问题使用不同的损失函数。
其实,今天还研究了一下简单神经网络的全部构造,理解一下其代码含义。这里先给出一段代码和背景(这里选取的是书上的简单实例)。
背景:预测商品销量问题
介绍:在预测商品销量时,准确预测是最理想目标,如果预测结果比实际结果大,则商家损失的是生产成本;如果预测结果比实际结果小,则商家损失的是利润。这里假设一个商品成本1元,利润是10元,那么少预测一个少挣10元,多预测一个少挣1元。由于多预测和少预测的损失利润不对等,这里面就会涉及到一个损失系数。这里先给出一个当预测多于真实值和少于真实值时候有不同损失系数的损失函数:
下面贴出python代码:
import tensorflow as tf
from numpy.random import RandomState
batch_size = 8
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-output")
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
loss_less = 10
loss_more = 1
loss = tf.reduce_mean(tf.where(tf.greater(y, y_), (y-y_)*loss_more, (y_-y)*loss_less))
train_step = tf.train.AdadeltaOptimizer(0.001).minimize(loss)
rdm = RandomState(1)
dataset_size = 128
X = rdm.rand(dataset_size, 2)
Y = [[x1+x2+rdm.rand()/10-0.05] for (x1, x2) in X]
with tf.Session() as sess:
init_op = tf.initialize_all_variables()
sess.run(init_op)
STEPS = 5000
for i in range(STEPS):
start = (i*batch_size % dataset_size)
end = min(start + batch_size, dataset_size)
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]} )
print(sess.run(w1))
第一轮结果:[[-0.81131756] [ 1.48459935]]
最后一轮结果:[[-0.80721265][ 1.48823178]]
当然了我也不知道最后这个数据对不对- -不过呢,今天的目的不是解决这个实际问题,而是搞懂神经网络中的各部分作用。
神经网络程序理解
如图,其实我也不确定自己画的对不对,而且的确是在有点困的情况下画的,不过自己对自己能说通就好。
一个神经网络,肯定有输入数据和理想情况相应的正确输出数据,那么首先得定义相应数据的容器:
x = tf.placeholder(tf.float32, shape=(None, 2), name="x-input")
y_ = tf.placeholder(tf.float32, shape=(None, 1), name="y-output")
其次,对于输入数据而言,在神经网络中有一个前向传播的过程,所以得定义一个函数,对输入数据进行处理,这里就是简单的加权和,这里权重采用随机数初始化的方式,之前笔记有提过:
w1 = tf.Variable(tf.random_normal([2, 1], stddev=1, seed=1))
y = tf.matmul(x, w1)
然后是损失函数传参,对于此问题而言即是f(x,y)中的x和y的声明定义,来看背景,要在预测多和预测少之间找损失系数,那么x和y无疑一个是预测多的情况下损失了成本1元,一个预测少的情况下损失了利润10元:
loss_less = 10
loss_more = 1
loss = tf.reduce_mean(tf.where(tf.greater(y, y_), (y-y_)*loss_more, (y_-y)*loss_less))
然后采用反向传播优化算法,这里先不做讨论,之前有提过常用的为3个,今晚时间不足了,留到下次再说,先知道这个算法里面有两个量,一个是学习率,一个是损失函数值:
train_step = tf.train.AdadeltaOptimizer(0.001).minimize(loss)
一般而言其实到这里神经网络已经布置完了,当然了今晚的例子是比较简单的,接下来无疑就是运行了,那么数据集怎么来?好了,我自己随机数取一下,这里再简单说一下Python的随机数:
#随机数生成器,1是seed
rdm = RandomState(1)
#生成数据集大小是128组
dataset_size = 128
#生成数据集,维度是[128,2],相当于有128个[x1,x2]
X = rdm.rand(dataset_size, 2)
每组数据集肯定要有一个正确答案给机器比对吧,不然怎么训练呢?所以正确答案的数据集也由系统生成,规定由x1+x2+b组成,这里之所以有个b是随机量,在-0.05-0.05之间,至于作用吗,目前还不是特别懂,所以忽略先,反正不是很重要。所以生成了Y为正确数据集:
Y = [[x1+x2+rdm.rand()/10-0.05] for (x1, x2) in X]
接下来就是训练神经网络了,Session运行之前也都提过,定义一个训练次数5000,run的时候每一轮从数据集中取数据到输入数据的容器和正确数据集的容器中去。
with tf.Session() as sess:
init_op = tf.initialize_all_variables()
sess.run(init_op)
STEPS = 5000
for i in range(STEPS):
start = (i*batch_size % dataset_size)
end = min(start + batch_size, dataset_size)
sess.run(train_step, feed_dict={x: X[start:end], y_: Y[start:end]} )
print(sess.run(w1))
关于start和end的取法,刚开始可能是我比较笨不太理解,不过其实在纸上试一试就可以轻易得出,每次从数据集中取batch_size个数据来训练,先从8-16,依次类推,16轮是0-8,然后重复训练。
总结
今晚可以说是在代码的层次上进一步加深了解了神经网络的构造,其实还是有点难度的,中间还有一些python的语法上的小问题,加上肝了一波游戏T T。。所以时间并没有特别充足,不过现在还剩下一个就是反向传播的优化算法的原理方面没有了解,准备明晚可以试着学习一下。