tensorflow 梯度下降以及summary

# 保证脚本与Python3兼容
from __future__ import print_function

import os

import tensorflow as tf
import numpy as np
from utils import createSummaryWriter, generateLinearData, createLinearModel    #导入utils

def gradientDescent(X, Y, model, learningRate=0.01, maxIter=10000, tol=1.e-6):
    """
    利用梯度下降法训练模型。

    参数
    ----
    X : np.array, 自变量数据

    Y : np.array, 因变量数据

    model : dict, 里面包含模型的参数,损失函数,自变量,应变量。
    """
    # 确定最优化算法
    method = tf.train.GradientDescentOptimizer(learning_rate=learningRate)
    optimizer = method.minimize(model["loss_function"])
    # 增加日志
    tf.summary.scalar("loss_function", model["loss_function"])
    tf.summary.histogram("params", model["model_params"])
    tf.summary.scalar("first_param", tf.reduce_mean(model["model_params"][0]))
    tf.summary.scalar("last_param", tf.reduce_mean(model["model_params"][-1]))
    summary = tf.summary.merge_all()
    # 在程序运行结束之后,运行如下命令,查看日志
    # tensorboard --logdir logs/
    # Windows下的存储路径与Linux并不相同
    if os.name == "nt":
        summaryWriter = createSummaryWriter("logs\\gradient_descent")
    else:
        summaryWriter = createSummaryWriter("logs/gradient_descent")
    # tensorflow开始运行
    sess = tf.Session()
    # 产生初始参数
    init = tf.global_variables_initializer()
    # 用之前产生的初始参数初始化模型
    sess.run(init)
    # 迭代梯度下降法
    step = 0
    prevLoss = np.inf
    diff = np.inf
    # 当损失函数的变动小于阈值或达到最大循环次数,则停止迭代
    while (step < maxIter) & (diff > tol):
        _, summaryStr, loss = sess.run(
            [optimizer, summary, model["loss_function"]],
            feed_dict={model["independent_variable"]: X,
                       model["dependent_variable"]: Y})
        # 将运行细节写入目录
        summaryWriter.add_summary(summaryStr, step)
        # 计算损失函数的变动
        diff = abs(prevLoss - loss)
        prevLoss = loss
        step += 1
    summaryWriter.close()
    # 在Windows下运行此脚本需确保Windows下的命令提示符(cmd)能显示中文
    # 输出最终结果
    print("模型参数:\n%s" % sess.run(model["model_params"]))
    print("迭代次数:%s" % step)
    print("损失函数值:%s" % loss)

def run():
    """
    程序入口
    """
    # dimension表示自变量的个数,num表示数据集里数据的个数。
    dimension = 30
    num = 10000
    # 随机产生模型数据
    X, Y = generateLinearData(dimension, num)
    # 定义模型
    model = createLinearModel(dimension)
    # 使用梯度下降法,估计模型参数
    gradientDescent(X, Y, model)

if __name__ == "__main__":
    run()

utils:

"""
此脚本用于随机生成线性模型数据、定义模型以及其他工具
"""

import numpy as np
import tensorflow as tf

def generateLinearData(dimension, num):
    """
    随机产生线性模型数据

    参数
    ----
    dimension :int,自变量个数

    num :int,数据个数

    返回
    ----
    x :np.array,自变量

    y :np.array,因变量
    """
    np.random.seed(1024)
    beta = np.array(range(dimension)) + 1
    x = np.random.random((num, dimension))
    epsilon = np.random.random((num, 1))
    # 将被预测值写成矩阵形式,会极大加快速度
    y = x.dot(beta).reshape((-1, 1)) + epsilon
    return x, y

def createLinearModel(dimension):
    """
    搭建模型,包括数据中的自变量,应变量和损失函数

    参数
    ----
    dimension : int,自变量的个数

    返回
    ----
    model :dict,里面包含模型的参数,损失函数,自变量,应变量
    """
    np.random.seed(1024)
    # 定义自变量和应变量
    x = tf.placeholder(tf.float64, shape=[None, dimension], name=‘x‘)
    ## 将被预测值写成矩阵形式,会极大加快速度
    y = tf.placeholder(tf.float64, shape=[None, 1], name="y")
    # 定义参数估计值和预测值
    betaPred = tf.Variable(np.random.random([dimension, 1]))
    yPred = tf.matmul(x, betaPred, name="y_pred")
    # 定义损失函数
    loss = tf.reduce_mean(tf.square(yPred - y))
    model = {"loss_function": loss, "independent_variable": x,
        "dependent_variable": y, "prediction": yPred, "model_params": betaPred}
    return model

def createSummaryWriter(logPath):
    """
    检查所给路径是否已存在,如果存在删除原有日志。并创建日志写入对象

    参数
    ----
    logPath :string,日志存储路径

    返回
    ----
    summaryWriter :FileWriter,日志写入器
    """
    if tf.gfile.Exists(logPath):
        tf.gfile.DeleteRecursively(logPath)
    summaryWriter = tf.summary.FileWriter(logPath, graph=tf.get_default_graph())
    return summaryWriter

(1)对于单个数值型的变量,比如所示函数值,使用scalar函数记录它的信息

(2)对于矩阵型变量比如模型参数使用histogram函数记录信息。 如果想追踪某个特定参数,需要先将特定参数转化为标量,再用scalar函数记录信息

(3)summary类定义的操作和其他tensorflow操作一样,只有在Session()对象调用它们时才会真正运行,手工调用效率显然不高,所以使用merge_all函数将他们合并为一个操作。

(4)为了记录产生的日志,需要创建tf.summary.FileWriter对象,。然后在每次迭代梯度下降法的使用时,将相应的日志写入文件。

原文地址:https://www.cnblogs.com/francischeng/p/9736777.html

时间: 2024-11-06 09:41:26

tensorflow 梯度下降以及summary的相关文章

Tensorflow梯度下降应用

import tensorflow as tfimport numpy as np #使用numpy生成随机点x_data = np.random.rand(100)y_data = x_data*0.1 + 0.2 #构造一个线性模型b = tf.Variable(0.0)k = tf.Variable(0.0)y = k*x_data+b #二次代价函数loss = tf.reduce_mean(tf.square(y_data-y))#误差平方求平均值#定义一个梯度下降来进行训练的优化器o

Tensorflow 梯度下降实例

# coding: utf-8 # #### 假设我们要最小化函数 $y=x^2$, 选择初始点 $x_0=5$ # #### 1. 学习率为1的时候,x在5和-5之间震荡. # In[1]: import tensorflow as tf TRAINING_STEPS = 10 LEARNING_RATE = 1 x = tf.Variable(tf.constant(5, dtype=tf.float32), name="x") y = tf.square(x) train_op

Tensorflow细节-P84-梯度下降与批量梯度下降

1.批量梯度下降 批量梯度下降法是最原始的形式,它是指在每一次迭代时使用所有样本来进行梯度的更新.从数学上理解如下: 对应的目标函数(代价函数)即为: (1)对目标函数求偏导: (2)每次迭代对参数进行更新: 优点: ??(1)一次迭代是对所有样本进行计算,此时利用矩阵进行操作,实现了并行. ??(2)由全数据集确定的方向能够更好地代表样本总体,从而更准确地朝向极值所在的方向.当目标函数为凸函数时,BGD一定能够得到全局最优. 缺点: ??(1)当样本数目 m 很大时,每迭代一步都需要对所有样本

深度解读最流行的优化算法:梯度下降

深度解读最流行的优化算法:梯度下降 By 机器之心2016年11月21日 15:08 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战.(本文的中文版 PDF 下载地址) 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent)

梯度下降优化算法综述

本文翻译自Sebastian Ruder的"An overview of gradient descent optimization algoritms",作者首先在其博客中发表了这篇文章,其博客地址为:An overview of gradient descent optimization algoritms,之后,作者将其整理完放在了arxiv中,其地址为:An overview of gradient descent optimization algoritms,在翻译的过程中以

机器学习最常用优化之一——梯度下降优化算法综述

转自:http://www.dataguru.cn/article-10174-1.html 梯度下降算法是机器学习中使用非常广泛的优化算法,也是众多机器学习算法中最常用的优化方法.几乎当前每一个先进的(state-of-the-art)机器学习库或者深度学习库都会包括梯度下降算法的不同变种实现.但是,它们就像一个黑盒优化器,很难得到它们优缺点的实际解释.这篇文章旨在提供梯度下降算法中的不同变种的介绍,帮助使用者根据具体需要进行使用. 这篇文章首先介绍梯度下降算法的三种框架,然后介绍它们所存在的

优化算法—梯度下降

转自:https://www.cnblogs.com/shixiangwan/p/7532858.html 梯度下降法,是当今最流行的优化(optimization)算法,亦是至今最常用的优化神经网络的方法.本文旨在让你对不同的优化梯度下降法的算法有一个直观认识,以帮助你使用这些算法.我们首先会考察梯度下降法的各种变体,然后会简要地总结在训练(神经网络或是机器学习算法)的过程中可能遇到的挑战. 目录: 梯度下降的各种变体 批量梯度下降(Batch gradient descent) 随机梯度下降

2.监督学习应用.梯度下降

// 搜索算法 --- 挨个尝试 1. 梯度下降 批梯度下降, 随机梯度下降 2. 矩阵求导方法

【转】梯度下降

回归与梯度下降: 回归在数学上来说是给定一个点集,能够用一条曲线去拟合之,如果这个曲线是一条直线,那就被称为线性回归,如果曲线是一条二次曲线,就被称为二次回归,回归还有很多的变种,如locally weighted回归,logistic回归,等等,这个将在后面去讲. 用一个很简单的例子来说明回归,这个例子来自很多的地方,也在很多的open source的软件中看到,比如说weka.大概就是,做一个房屋价值的评估系统,一个房屋的价值来自很多地方,比如说面积.房间的数量(几室几厅).地段.朝向等等,