首页 > 其他 > 详细

Tensorflow学习笔记2019.01.22

时间:2019-01-22 13:49:57      阅读:306      评论:0      收藏:0      [点我收藏+]

技术分享图片tensorflow学习笔记2

edit by Strangewx 2019.01.04

4.1 机器学习基础

4.1.1 一般结构:

技术分享图片

 

技术分享图片

初始化模型参数:通常随机赋值,简单模型赋值0

训练数据:一般打乱。random.shuffle()

在训练数据上推断模型:得到输出

计算损失:loss(X, Y)多种损失函数

调整模型参数:最小化损失 SGD等优化方法。

评估:70%:30% 分训练集和校验集

代码框架:
  1. 首先模型参数初始化,

  2. 然后为每个训练闭环中的运算定义一个方法:读取训练数据input,计算推断模型inference,计算相对期望输出的损失loss,调整模型参数train,评估训练模型evaluate,

  3. 之后启动一个Session会话对象,并进行闭环训练。

  4. 模型满意之后,导出模型,用它对所需要的数据进行推断,例如:为冰激凌App用户推荐不同口味的冰激凌。

import tensorflow as tf
?
#初始化变量和模型参数,定义训练闭环中的运算
?
def inference(X):
   #计算推断模型在数据X上的输出,并将结果返回。
?
def loss(X, Y):
   #依据训练数据X和期望输出Y计算损失
   
def inputs():
   #读取或生成训练数据X,期望输出Y
   
def train(total_loss):
   #依据计算的总损失,训练或调整模型参数。
   
def evalute(sess, X, Y):
   #队训练模型进行评估
   
#在一个会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
   
   tf.global_variables_initializer().run()
   
   X, Y = inputs()
 
   total_loss = loss(X, Y)
   train_op = train(total_loss)
   
   coor = tf.train.Coordinator()
   threads = tf.train.start_queue_rnners(sess=sess, coor=coord)
   
   #实际训练迭代轮数
   training_steps = 1000
   for step in range(training_steps):
       sess.run([train_op])
       #为了调试和学习的目的,查看损失在训练过程中的变化
       if step % 100 == 0:
           print("loss:",sess.run([total_loss]))
   
   evalute(sess, X, Y)
   
   coord.request_stop()
   coord.join(thread)
   sess.close()  

 

保存训练检查点&恢复
  • tf.train.Saver()类

目的:

将数据流图中的变量保存到专门的二进制文件中。周期性保存所有变量,创建检查点(checkpoint)文件,并在必要时从最近的检查点恢复。

每次调用tf.train.Saver.save 方法,都会创建一个 my-model-step的检查点文件,如my-model-1000,my-model-2000等。默认情况保存近5次的文件

在上述框架稍作修改:

#模型定义代码 ...
#创建一个Saver()类
saver = tf.train.Saver()
?
#在一个会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
   #模型设置...
   
   #实际的闭环训练
   for step in range(training_steps):
       sess.run([train_op])
       
       if step % 1000 == 0:
           saver.save(sess, ‘my-model‘, global_step=step)
           
   #模型评估。。。
   #最终模型保存
   saver.save(sess, ‘my-model‘, global_step=training_steps)
   
   sess.close()  
  • tf.train.get_checkpoint_state

验证之前是否有检查点文件被保存下来

  • tf.train.Saver.restore

负责恢复变量值。

#在一个会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
   #模型设置...
   
   initial_step = 0
   
   #验证之前是否存在检查点文件
   ckpt = tf.train.get_checkpoint_state(os.path.dirname(__file__))
   if ckpt and ckpt.model_checkpoint_path:
       #从检查点恢复模型参数
       saver.restore(sess, ckpt.model_checkpoint_path)
       initial_step = int(ckpt.model_checkpoint_path.split(‘-‘, 1)[1])
   
   #实际的闭环训练
   for step in range(initial_step, training_steps):
       #...
?

4.1.2 整合架构

包括:一般架构,训练点保存和恢复

import tensorflow as tf
?
#初始化变量和模型参数,定义训练闭环中的运算
?
def inference(X):
   #计算推断模型在数据X上的输出,并将结果返回。
?
def loss(X, Y):
   #依据训练数据X和期望输出Y计算损失
   
def inputs():
   #读取或生成训练数据X,期望输出Y
   
def train(total_loss):
   #依据计算的总损失,训练或调整模型参数。
   
def evalute(sess, X, Y):
   #队训练模型进行评估
   
#--checkpoint--创建一个Saver()类
saver = tf.train.Saver()
?
#在一个会话对象中启动数据流图,搭建流程
with tf.Session() as sess:
   
   tf.global_variables_initializer().run()
   
   X, Y = inputs()
 
   total_loss = loss(X, Y)
   train_op = train(total_loss)
   
   coor = tf.train.Coordinator()
   threads = tf.train.start_queue_rnners(sess=sess, coor=coord)
   
   
   #--checkpoint恢复--
   initial_step = 0
   #验证之前是否存在检查点文件
   ckpt = tf.train.get_checkpoint_state(os.path.dirname(__file__))
   if ckpt and ckpt.model_checkpoint_path:
       #从检查点恢复模型参数
       saver.restore(sess, ckpt.model_checkpoint_path)
       initial_step = int(ckpt.model_checkpoint_path.split(‘-‘, 1)[1])  
   
   
   #实际训练迭代轮数
   training_steps = 10000
   for step in range(initial_step, training_steps):
       sess.run([train_op])
       #为了调试和学习的目的,查看损失在训练过程中的变化
       if step % 100 == 0:
           print("loss:",sess.run([total_loss]))
       #--checkpoint--每1000次保存训练检查点
       if step % 1000 == 0:
           saver.save(sess, ‘my-model‘, global_step=step)
   
   evalute(sess, X, Y)
   
   #--checkpoint--最终模型保存
   saver.save(sess, ‘my-model‘, global_step=training_steps)
   
   coord.request_stop()
   coord.join(thread)
   sess.close()  

 

4.2 线性回归

Y=XW + b

实例:脂肪含量和年龄,体重的关系。

代码:

import tensorflow as tf
import numpy as np
?
#初始化变量和模型参数
W = tf.Variable(tf.zeros([2,1]), name="weights")
b = tf.Variable(0., name="bias")
?
#定义闭环训练的方法
def inference(X):
   return tf.matmul(X, W) + b
?
def loss(X, Y):
   #此处采用均方误差
   Y_predicted = inference(X)
   return tf.reduce_sum(tf.squared_difference(Y, Y_predicted))
   
def inputs():
   #体重年龄
   weight_age = [[84, 46], [73, 20], [65, 52], [70, 30],[76, 57],
                  [69, 25], [63, 28], [72, 36], [79, 57], [75, 44],
                  [27, 24], [89, 31], [65, 52], [57, 23], [59, 60],
                  [69, 48] ,[60, 34], [79, 51], [75, 50], [82, 34],
                  [59, 46], [67, 23],[85, 37], [55, 40], [63, 30]]
   #血脂含量
   blood_fat_content = [354, 190, 405, 263, 451, 302, 288,385, 402,
                          365, 209, 290, 346, 254, 395, 434, 220, 374,
                          308,220, 311, 181, 274, 303, 244]
?
   return tf.to_float(weight_age), tf.to_float(blood_fat_content)
?
def train(total_loss):
   learning_rate = 0.0000001
   return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)
?
def evaluate(sess, X, Y):
   print(sess.run(inference([[80., 25.]])))
   print(sess.run(inference([[65., 25.]])))
   print(sess.run(inference([[84., 46.]])))
?
with tf.Session() as sess:
   
   tf.global_variables_initializer().run()
   
   X, Y = inputs()
   total_loss = loss(X, Y)
   train_op = train(total_loss)
   
?
   # 开启一个协调器  
   coord = tf.train.Coordinator()  
   # 使用start_queue_runners 启动队列填充  
   threads = tf.train.start_queue_runners(sess, coord)
   #实际训练迭代轮数
   training_steps = 5000
   for step in range(training_steps):
       sess.run([train_op])
       #为了调试和学习的目的,查看损失在训练过程中的变化
       if step % 1000 == 0:
           print("loss:",sess.run([total_loss]))
           print(W.eval(), b.eval())
   
   evaluate(sess, X, Y)
   coord.request_stop()
   coord.join(threads)
   sess.close()
‘‘‘
输出:
loss: [7608772.5]
[[2.6675313]
[1.5194209]] 0.03884
loss: [5330322.0]
[[3.5245109]
[1.5017073]] 1.1460863
loss: [5318362.0]
[[3.512061 ]
[1.4964026]] 2.2396185
loss: [5306486.5]
[[3.4996552]
[1.4911169]] 3.3292856
loss: [5294695.0]
[[3.4872932]
[1.4858491]] 4.415105
---evaluate result---
[[320.51013]]
[[268.3853]]
[[365.50278]]
‘‘‘  

 

小插曲《typora使用指南》

参考:https://blog.csdn.net/moonclearner/article/details/52842679

表情

????

公式:输入两个‘$$’+回车,输入公式

 技术分享图片

 

4.3、对数几率回归

泰坦尼克问题,此代码未跑通。。。。gg了

import tensorflow as tf
import numpy as np
import os
?
#初始化变量和模型参数
W = tf.Variable(tf.zeros([5,1]), name="weights")
b = tf.Variable(0., name="bias")
?
#定义闭环训练的方法
?
#用于输入值合并,因为sigmoid只接受单一值输入。
def combine_inputs(X):
   
   return tf.matmul(X, W) + b
?
def inference(X):
   return tf.sigmoid(combine_inputs(X))
?
                     
?
def loss(X, Y):
   #此处采用交叉熵,预测越离谱,惩罚越大。因此模型不可能做出特别离谱的预测
   Y_predicted = inference(X)
   return tf.reduce_sum(tf.nn.sigmoid_cross_entropy_with_logits(logits=combine_inputs(X), labels=Y))
?
#编写文件读取,加载解析它,并床间一个批次batc来读取排列在某张量中的多行数据,以提升计算的效率。
def read_csv(batch_size, file_name, record_defaults):
   filename_queue = tf.train.string_input_producer([os.path.split(os.path.dirname("__file__"))[0] + "/" + file_name])
   
   reader = tf.TextLineReader(skip_header_lines=1)
   key, value = reader.read(filename_queue)
   
   #decode_csv 会将字符串(文本行)转换到具有默认值的有张量组成的元组中,它还会为每一列设置数据类型
   decoded = tf.decode_csv(value, record_defaults=record_defaults)
   
   #实际上会读取一个文件,并加载一个张量中的batch_size行。
   return tf.train.shuffle_batch(decoded, batch_size=batch_size, capacity=batch_size*50, min_after_dequeue=batch_size)
                               
                     
def inputs():
   passenger_id, survived, pclass, name, sex, age, sibsp, parch, ticket, fare, cabin, embarked = read_csv\
  (100,"train.csv", [[0.0],[0.0],[0],[""],[""],[0.0],[0.0],[0.0],[""],[0.0],[""],[""]])
   
   #替换属性值
   #船舱等级:三维布尔值
   is_first_class = tf.to_float(tf.equal(pclass, [1]))
   is_second_class = tf.to_float(tf.equal(pclass, [2]))
   is_third_class = tf.to_float(tf.equal(pclass, [3]))
   #性别:单一值
   gender = tf.to_float(tf.equal(sex, ["female"]))
   
   #最终将所有的特征归为一个矩阵,并且转置,使其每行对应一个样本,每列对应一个特征
   #此处只用到船舱等级,性别,年龄。因为其他维度特征存在一定程度的缺失值,此处制作简单模型,故暂且不考虑其他特征
   features = tf.transpose(tf.stack([is_first_class, is_second_class, is_third_class, gender, age]))
   survived = tf.reshape(survived, [100, 1])
   
   return features, survived
?
?
def train(total_loss):
   learning_rate = 0.0000001
   return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)
?
def evaluate(sess, X, Y):
   predicted = tf.cast(inference(X) >0.5, tf.float)
   print(sess.run(tf.reduce_mean(tf.cast(tf.equal(Y, predicted)))))
?
with tf.Session() as sess:
   
   tf.global_variables_initializer().run()
   
   X, Y = inputs()
   print("data read success")
   total_loss = loss(X, Y)
   train_op = train(total_loss)
   
?
   # 开启一个协调器  
   coord = tf.train.Coordinator()  
   # 使用start_queue_runners 启动队列填充  
   threads = tf.train.start_queue_runners(sess, coord)
   
   print("kaishixulian")
   #实际训练迭代轮数
   training_steps = 5000
   for step in range(training_steps):
       sess.run([train_op])
       #为了调试和学习的目的,查看损失在训练过程中的变化
       if step % 1000 == 0:
           print("loss:",sess.run([total_loss]))
           print(W.eval(), b.eval())
   
   evaluate(sess, X, Y)
   coord.request_stop()
   coord.join(threads)
   sess.close()
 

sigmoid函数

技术分享图片

 

是一个概率分布函数,即给定某个特定的单个输入,该函数计算为“Yes”的概率值

技术分享图片

交叉熵:

 技术分享图片

 

实现:tf.nn.sigmoid_cross_entropy_with_logits(X, Y)

一般性公式:

 技术分享图片

 

 

当p=q时,交叉熵取得最小值。因此,交叉熵可以用来比骄傲一个分布和另一个分布的“吻合”情况,交叉熵越接近于熵,便是q对p最好的逼近,实际上,模型的输出和期望输出越接近,交叉熵也就越小。

交叉熵和平方误差L2对比:

技术分享图片

 

技术分享图片

发现:交叉熵输出了一个更大的惩罚。,借助交叉熵,当模型对期望输出为“Yes"的样本的预测概率接近于0时,惩罚就会接近于无穷大,使得模型训练完成后,模型不太可能做出这样的错误预测。这使得交叉熵模型更适合作为Yes or No模型的预测方法。

4.4、softmax分类:多分类

公式:

 技术分享图片

该函数返回值:包含C个分量的概率向量,每个分量对应一个类别。分量之和为1,因为softmax的公职要求每个样本必须对应一个类别,若和小于1,这说明存在一些隐藏类别;若大于1,则说明每个样本可能存在多个类别。

实现:tf.nn.softmax(X)

单个训练样本 i ,交叉熵形式:

 技术分享图片

将每个输出类别在样本熵的损失相加,对于每个训练样本的期望类别yc应该为1,其他类对应0,因此实际上这个和式只有一个损失值被记入,它度量了模型为知识类别预测的概率的可信度。

总损失,则将每个训练样本的损失相加。

 技术分享图片

实现:

1、稀疏版本:计算速度快。tf.nn.sparse_softmax_cross_entropy_with_logits

2、tf.nn.softmax_cross_entropy_with_logits()

预测类别选择:

tf.argmax():选择预测的输出值的中具有最大概率的那个类别。

 

4.5、多层神经网络

深层,异或问题解决,解决线性不可分问题。

4.6、梯度下降和误差反响传播

(1)梯度下降:

 技术分享图片

 

tf.summary.scalar() 函数在TensorBoard中查看损失函数的曲线。

 

一般采用随机权值,增加可靠近全局最优点附近开始下降的机会。

局部极小值很常见。有一些文献表明,就损失函数而言,所有这些极值点都接近等价,与全局最小点相比,他们的劣势并不明显。

梯度计算:

tf.gradients方法。

优化方法:

梯度下降,随机梯度下降。

(2)反向传播

技术分享图片

 技术分享图片

 

技术分享图片

 技术分享图片

 

 

Tensorflow学习笔记2019.01.22

原文:https://www.cnblogs.com/strangewx/p/10303186.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!