使用tensorflow创建一个简单的三层神经网络(3)

上一遍文章我们用三个零件的输入前向传播获取到了输出值,我们可以把它当做我们训练数据的中的一个batch,我们的训练数据会有多个batch组成,我们会定义损失函数来计算当前神经网络的预测答案和真实答案之间的差距,正常零件的label为1,坏零件的label为0,我们要算的就是我们神经网络输出层的值和这个我们预先知道的输入层的label之间的差距。然后一个batch结束时,反向运用随机梯度下降SGD算法更新w和biases来生成新的w和biases供下一个batch使用,以此来缩小这个差距。直到训练数据的所有batch结束时也就是一个轮(epoch)完成,然后再把训练数据进行相同的多轮训练,继续缩小这个差距。也就是多轮的epach训练迭代。

tensorflow实现反向传播


接下来我们用tensorflow接着实现神经网络的反向传播

import tensorflowas tf

# 定义变量

w1 = tf.Variable(tf.random_normal([2,3],stddev=1),name="w1")

w2 = tf.Variable(tf.random_normal([3,1],stddev=1),name="w2")

biases1 = tf.Variable(tf.zeros([3]),name="b1")# 隐藏层的偏向bias

biases2 = tf.Variable(tf.zeros([1]),name="b1")# 输出层的偏向bias

# 使用placeholder

x = tf.placeholder(tf.float32,shape=[None,2],name="input")

a = tf.matmul(x,w1) + biases1

y = tf.matmul(a,w2) + biases2

上面的运算前面提到过可以理解为张量(tensor)结构的运算,只有sess.run()才是对数据的运算 我们此时得到了第一轮的输出y

此时我们运用交叉熵函数来计算我们的预测答案和真实答案之间的差距

假设我们想在的训练集如下:

X = [[0.7,0.9],

        [0.1,0.4],

        [0.5,0.8],

        [0.6,0.9],

        [0.2,0.4],

       [0.6,0.8]]

Y = [[1.,0.,1.,1.,0.,1.]]

Y = np.array(Y).T         #把行向量转为列向量

# 训练集数据的大小

date_size =len(X)

# 定义训练数据batch的大小

batch_size =3

以为我们的训练数据有6个零件,我现在设一个batch为3,以为一个epoch由多个batch组成,所以我们现在的epoch有两个batch,也就是说训练一轮我们更新了两次权重和偏向


cross entropy和优化器


cross_entropy   cost function如下:

cross_entropy   cost function

这是分类问题常用的损失函数,我们的目的就是最小化这个C,常用的最小化这个有三种tf.train.GradientDescentOptimizer,tf.AdamOptimizer,tf.train.MomentumOptimizer,tensorflow称它们为优化器。第一个就是我们熟悉的随机梯度下降算法

tensorflow实现如下:


# 定义损失函数来刻画预测值与真实值之间的差距

cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))

learning_rate =0.1

train_step = tf.train.GradientDescentOptimizer(learning_rate).minimize(cross_entropy)


训练时我们是每一个batch正向传递结束都要都要调用cost function来计算与真实值得差距,并用优化器最小化这个值来反向更新权重和偏向,供下一个batch使用


with tf.Session()as sess:

      init_op = tf.global_variables_initializer()

      sess.run(init_op)

      for k in xrange(0,date_size,batch_size):

                   mini_batch = X[k:k+batch_size]

                   train_y = Y[k:k+batch_size]

                   sess.run(train_step,feed_dict={x:mini_batch,y_:train_y})

                   print sess.run(w1,feed_dict={x:mini_batch,y_:train_y})


以上我们就完成了一个epoch的训练,并打印了每次更新后的w,偏向biases,cross entropy也可以这样获取,这时的feed_dict可以理解我指针指向当前数据时,我们设定的变量的值


深度学习主要就是迭代的过程,一个epoch显然不行,我们用相同的训练数据进行多轮的迭代更新

with tf.Session()as sess:

      init_op = tf.global_variables_initializer()

      sess.run(init_op)

     for i in range(1000):   # 进行1000个epoch运算

            for k in xrange(0,date_size,batch_size):

                      mini_batch = X[k:k+batch_size]

                      train_y = Y[k:k+batch_size]

                      sess.run(train_step,feed_dict={x:mini_batch,y_:train_y})

                      print sess.run(w1,feed_dict={x:mini_batch,y_:train_y})

           if i %10==0:

                     total_cross_entropy = sess.run(cross_entropy,feed_dict={x:X,y_:Y})

                     print "第i轮的cross_entropy:",total_cross_entropy


运行结果:

w初始: [[-2.55538154 -0.95418036 -0.37363622]

[-0.28107387 -0.77055448 -1.99585176]]

第0轮 cross_entropy:0.0753737

第1轮 cross_entropy:0.0647165

第2轮 cross_entropy:0.0557314

第3轮 cross_entropy:0.0486983

第4轮 cross_entropy:0.041998

第5轮 cross_entropy:0.0355824

第6轮 cross_entropy:0.0324344

第7轮 cross_entropy:0.0296029

第8轮 cross_entropy:0.0270144

第9轮 cross_entropy:0.0246159

第10轮 cross_entropy:0.0223683

第11轮 cross_entropy:0.0202418

第12轮 cross_entropy:0.0182138

第13轮 cross_entropy:0.0162667

第14轮 cross_entropy:0.0143864

第15轮 cross_entropy:0.0125622

第16轮 cross_entropy:0.0107853

第17轮 cross_entropy:0.00904879

第18轮 cross_entropy:0.00734704

第19轮 cross_entropy:0.00567571

第20轮 cross_entropy:0.0040312

第21轮 cross_entropy:0.00241068

第22轮 cross_entropy:0.000811872

第23轮 cross_entropy:-0

第24轮 cross_entropy:-0

第25轮 cross_entropy:-0

第26轮 cross_entropy:-0

第27轮 cross_entropy:-0

第28轮 cross_entropy:-0

第29轮 cross_entropy:-0

第30轮 cross_entropy:-0

第31轮 cross_entropy:-0

第32轮 cross_entropy:-0

第33轮 cross_entropy:-0

第34轮 cross_entropy:-0

第35轮 cross_entropy:-0

第36轮 cross_entropy:-0

第37轮 cross_entropy:-0

第38轮 cross_entropy:-0

第39轮 cross_entropy:-0

第40轮 cross_entropy:-0

第41轮 cross_entropy:-0

第42轮 cross_entropy:-0

第43轮 cross_entropy:-0

第44轮 cross_entropy:-0

第45轮 cross_entropy:-0

第46轮 cross_entropy:-0

第47轮 cross_entropy:-0

第48轮 cross_entropy:-0

第49轮 cross_entropy:-0

第50轮 cross_entropy:-0

第51轮 cross_entropy:-0

第52轮 cross_entropy:-0

第53轮 cross_entropy:-0

第54轮 cross_entropy:-0

......

更新后w1: [[-2.59262252 -0.99667609 -0.33713353]

[-0.31940967 -0.81404811 -1.95825446]]


我们发现最小化的交叉熵变成了0,这样显然是不行的,这会导致过拟合,就是我们训练的结果在训练集上表现很好,在测试集上表现却不好,下篇文章我们会接着用tensorflow 改进这个问题


完整代码:

import tensorflowas tf

import numpyas np

import matplotlib.pyplotas plt

# 训练集X和对应的label Y,也就是零件的次品为0,正常零件为1

X = [[0.7,0.9],

[0.1,0.4],

[0.5,0.8],

[0.6,0.9],

[0.2,0.4],

[0.6,0.8]]

# X = np.array(X)

Y = [[1.,0.,1.,1.,0.,1.]]

Y = np.array(Y).T

# 训练集数据的大小

date_size =len(X)

# 定义训练数据batch的大小

batch_size =3

# 定义变量

w1 = tf.Variable(tf.random_normal([2,3],stddev=1),name="w1")

w2 = tf.Variable(tf.random_normal([3,1],stddev=1),name="w2")

biases1 = tf.Variable(tf.constant(0.001,shape=[3]),name="b1")# 隐藏层的偏向bias

biases2 = tf.Variable(tf.constant(0.001,shape=[1]),name="b2")# 输出层的偏向bias

# 使用placeholder

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) + biases1

y = tf.matmul(a,w2) + biases2

cross_entropy = -tf.reduce_mean(y_*tf.log(tf.clip_by_value(y,1e-10,1.0)))

learning_rate =0.001

train_step = tf.train.AdamOptimizer(learning_rate).minimize(cross_entropy)

with tf.Session()as sess:

         init_op = tf.global_variables_initializer()

         sess.run(init_op)

         print "w初始:",sess.run(w1)

        # print sess.run(biases1)

         for iin range(100):

                   for kin xrange(0, date_size, batch_size):

                          mini_batch = X[k:k + batch_size]

                          train_y = Y[k:k + batch_size]

                          sess.run(train_step,feed_dict={x: mini_batch, y_: train_y})

                          # print sess.run(w1, feed_dict={x: mini_batch, y_: train_y})

                         # print sess.rund(biases1, feed_dict={x: mini_batch, y_: train_y})

                  if i %1 ==0:

                          total_cross_entropy = sess.run(cross_entropy,feed_dict={x: X, y_: Y})

                          print "第%d轮 cross_entropy:%g" %(i,total_cross_entropy)

          print "更新后w1:",sess.run(w1)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容