TensorFlow自学第2篇——线性回归

很多道友都说,MNIST是深度学习领域的Hello World,我认为这种说法欠妥。应该这么说,线性回归是深度学习领域的Hello World,MNIST是深度学习领域的排序算法。毕竟,我学会了4536251和弦,但并不能证明我会弹奏《彩虹》。一家之言,切勿对号入座。

在我们训练或者测试过程中,总会遇到需要保存训练完成的模型,然后从中恢复继续我们的测试或者其它使用。模型的保存和恢复也是通过tf.train.Saver类去实现,它主要通过将Saver类添加OPS保存和恢复变量到checkpoint。它还提供了运行这些操作的便利方法。

tf.train.Saver(var_list=None, reshape=False, sharded=False, max_to_keep=5, keep_checkpoint_every_n_hours=10000.0, name=None, restore_sequentially=False, saver_def=None, builder=None, defer_build=False, allow_empty=False, write_version=tf.SaverDef.V2, pad_step_number=False)
var_list:指定将要保存和还原的变量。它可以作为一个dict或一个列表传递.
max_to_keep:指示要保留的最近检查点文件的最大数量。创建新文件时,会删除较旧的文件。如果无或0,则保留所有检查点文件。默认为5(即保留最新的5个检查点文件。)
keep_checkpoint_every_n_hours:多久生成一个新的检查点文件。默认为10,000小时

保存模型参数

保存我们的模型需要调用Saver.save()方法。save(sess, save_path, global_step=None),checkpoint是专有格式的二进制文件,将变量名称映射到张量值。

恢复模型参数

恢复模型的方法是restore(sess, save_path),save_path是以前保存参数的路径,我们可以使用tf.train.latest_checkpoint来获取最近的检查点文件(也恶意直接写文件目录)

自定义命令行参数

tf.app.run(),默认调用main()函数,运行程序。main(argv)必须传一个参数。tf.app.flags,它支持应用从命令行接受参数,可以用来指定集群配置等。在tf.app.flags下面有各种定义参数的类型:

DEFINE_string(flag_name, default_value, docstring)
DEFINE_integer(flag_name, default_value, docstring)
DEFINE_boolean(flag_name, default_value, docstring)
DEFINE_float(flag_name, default_value, docstring)
第一个也就是参数的名字,路径、大小等等。第二个参数提供具体的值。第三个参数是说明文档。

tf.app.flags.FLAGS,在flags有一个FLAGS标志,它在程序中可以调用到我们前面具体定义的flag_name。

举个栗子

下面的例程是视频讲解中的例程,介于时间问题,把注释都写在代码里了,简洁易懂。

"""
算法:线性回归
策略:均方误差,求损失函数loss
优化:梯度下降,调整学习率减小损失
日期:2019-01-15
"""

import tensorflow as tf
import os
# 忽略不必要的警告信息
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 定义命令行参数
# 1、首先定义哪些参数需要在运行时候指定
# 2、程序中获取定义的命令行参数

# 参数:名字、默认值、说明
tf.app.flags.DEFINE_integer("max_step", 100, "模型训练的步数")
tf.app.flags.DEFINE_string("model_dir", "", "模型文件的加载路径")
# 定义获取命令行参数
FLAGS = tf.app.flags.FLAGS

def myregression():

    """
    自实现一个线性预测, 变量作用域variable_scope在tensorboard中便于简化观察
    :return: None
    """
    with tf.variable_scope("data"):
        # 1、准备数据, X 特征值[100, 1] Y 目标值[100]
        x = tf.random_normal([100, 1], mean=1.76, stddev=0.5, name="x_data")

        # 矩阵相乘,必须是二维
        y_true = tf.matmul(x, [[0.7]]) + 0.8

    with tf.variable_scope("model"):
        # 2、建立线性回归模型,1个特征值,1个偏置值,1个权重 y=wx+b
        # 随机给一个权重和偏置的值,计算损失,然后在当前状态下优化
        # 用变量Variable(而不是常量constant)进行定义,才能跟随梯度下降同步优化
        # trainable参数:指定该变量能否跟着梯度下降一起优化
        weight = tf.Variable(tf.random_normal([1, 1], mean=0.0, stddev=1.0), name="w", trainable=True)
        bias = tf.Variable(0.0, name="b", trainable=True)

        y_predict = tf.matmul(x, weight) + bias

    with tf.variable_scope("loss"):
        # 3、建立损失函数,均方误差
        loss = tf.reduce_mean(tf.square(y_true - y_predict))

    with tf.variable_scope("optimize"):
        # 4、梯度下降,优化损失,学习率
        train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)

    # 定义初始化变量的op
    init_op = tf.global_variables_initializer()

    # 添加权重参数,损失值等在tensorboard中的观察情况
    # 1、在session之前收集tensor
    tf.summary.scalar("losses", loss)
    tf.summary.histogram("weights", weight)
    # 2、定义合并tensor的op,写入事件文件
    merged = tf.summary.merge_all()

    # 定义一个保存模型的实例
    saver = tf.train.Saver()

    # 通过会话运行程序
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init_op)

        # 打印最先随机初始化的权重和偏置
        print("随机初始化的权重为:%f, 偏置为:%f" %(weight.eval(), bias.eval()))

        # 建立事件文件
        filewriter = tf.summary.FileWriter("./summary/", graph=sess.graph)  # 文件路径

        # 加载模型,覆盖模型当中随机定义的参数,从上次训练的参数结果开始
        if os.path.exists("./saver/checkpoint"):
            saver.restore(sess, "./saver/model")

        # 循环训练,运行优化
        for i in range(1501): # 1501可替换为FLAGS.max_step,以便在命令行传入
            sess.run(train_op)
            # 3、运行合并的tensor
            summary = sess.run(merged)
            filewriter.add_summary(summary, i)

            if(i%100 == 0):
                saver.save(sess, "./saver/model")
                print("第%d次训练,权重为:%f, 偏置为:%f" % (i, weight.eval(), bias.eval()))
    return None

if __name__=="__main__":

    myregression()

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