deep learning 入门

目录


纪要

深度学习 3天
TensorFlow框架使用 1天
数据读取、神经网络基础 1天
卷积神经网络、验证码识别 1天

1、深度学习介绍
2、TensorFlow框架的使用
    1)TensorFlow的结构
    2)TensorFlow的各个组件
        图
        会话
        张量
        变量
    3)简单的线性回归案例 - 将TensorFlow用起来
1.1 深度学习与机器学习的区别
    1.1.1 特征提取方面
    1.1.2 数据量和计算性能要求
    1.1.3 算法代表
1.2 深度学习的应用场景
1.3 深度学习框架介绍
    1.3.1 常见深度学习框架对比
    1.3.2 TensorFlow的特点
    1.3.3 TensorFlow的安装
        1 CPU版本
        2 GPU版本
            CPU:诸葛亮
                综合能力比较强
                核芯的数量更少
                更适用于处理连续性(sequential)任务。
            GPU:臭皮匠
                专做某一个事情很好
                核芯的数量更多
                更适用于并行(parallel)任务
2.1 TF数据流图
    2.1.1 案例:TensorFlow实现一个加法运算
    2 TensorFlow结构分析
        一个构建图阶段
            流程图:定义数据(张量Tensor)和操作(节点Op)
        一个执行图阶段
            调用各方资源,将定义好的数据和操作运行起来
    2.1.2 数据流图介绍
        TensorFlow
        Tensor - 张量 - 数据
        Flow - 流动
2.2 图与TensorBoard
    2.2.1 什么是图结构
        图结构:
            数据(Tensor) + 操作(Operation)
    2.2.2 图相关操作
        1 默认图
            查看默认图的方法
                1)调用方法
                    用tf.get_default_graph()
                2)查看属性
                    .graph
        2 创建图
            new_g = tf.Graph()
            with new_g.as_default():
                定义数据和操作
    2.2.3 TensorBoard:可视化学习
        1 数据序列化-events文件
            tf.summary.FileWriter(path, graph=sess.graph)
        2 tensorboard
    2.2.4 OP
        数据:Tensor对象
        操作:Operation对象 - Op
        1 常见OP
            操作函数        &                           操作对象
            tf.constant(Tensor对象)           输入Tensor对象 -Const-输出 Tensor对象
            tf.add(Tensor对象1, Tensor对象2)   输入Tensor对象1, Tensor对象2 - Add对象 - 输出 Tensor对象3
        2 指令名称
            一张图 - 一个命名空间
2.3 会话
    2.3.1 会话
        tf.Session:用于完整的程序当中
        tf.InteractiveSession:用于交互式上下文中的TensorFlow ,例如shell
        1)会话掌握资源,用完要回收 - 上下文管理器
        2)初始化会话对象时的参数
            graph=None
            target:如果将此参数留空(默认设置),
            会话将仅使用本地计算机中的设备。
            可以指定 grpc:// 网址,以便指定 TensorFlow 服务器的地址,
            这使得会话可以访问该服务器控制的计算机上的所有设备。
            config:此参数允许您指定一个 tf.ConfigProto
            以便控制会话的行为。例如,ConfigProto协议用于打印设备使用信息
        3)run(fetches,feed_dict=None)
        3 feed操作
            a = tf.placeholder(tf.float32, shape=)
            b = tf.placeholder(tf.float32, shape=)
2.4 张量Tensor
    print()
    ndarray
    2.4.1 张量(Tensor)
        张量 在计算机当中如何存储?
        标量 一个数字                 0阶张量
        向量 一维数组 [2, 3, 4]       1阶张量
        矩阵 二维数组 [[2, 3, 4],     2阶张量
                    [2, 3, 4]]
        ……
        张量 n维数组                  n阶张量
        1 张量的类型
        2 张量的阶
        创建张量的时候,如果不指定类型
        默认 tf.float32
            整型 tf.int32
            浮点型 tf.float32
    2.4.2 创建张量的指令
    2.4.3 张量的变换
        ndarray属性的修改
            类型的修改
                1)ndarray.astype(type)
                tf.cast(tensor, dtype)
                    不会改变原始的tensor
                    返回新的改变类型后的tensor
                2)ndarray.tostring()
            形状的修改
                1)ndarray.reshape(shape)
                    -1 自动计算形状
                2)ndarray.resize(shape)
                静态形状 - 初始创建张量时的形状
                1)如何改变静态形状
                    什么情况下才可以改变/更新静态形状?
                        只有在形状没有完全固定下来的情况下
                    tensor.set_shape(shape)
                2)如何改变动态形状
                    tf.reshape(tensor, shape)
                    不会改变原始的tensor
                    返回新的改变形状后的tensor
                    动态创建新张量时,张量的元素个数必须匹配
    2.4.4 张量的数学运算
2.5 变量OP
    TensorFlow - 变量
    存储模型参数
    2.5.1 创建变量
        变量需要显式初始化,才能运行值
    2.5.2 使用tf.variable_scope()修改变量的命名空间
        使得结构更加清晰
2.6 高级API
    2.6.1 其它基础API
    2.6.2 高级API
2.7 案例:实现线性回归
    2.7.1 线性回归原理复习
        1)构建模型
            y = w1x1 + w2x2 + …… + wnxn + b
        2)构造损失函数
            均方误差
        3)优化损失
            梯度下降
    2.7.2 案例:实现线性回归的训练
        准备真实数据
            100样本
            x 特征值 形状 (100, 1)
            y_true 目标值 (100, 1)
            y_true = 0.8x + 0.7
        假定x 和 y 之间的关系 满足
            y = kx + b
            k ≈ 0.8 b ≈ 0.7
            流程分析:
            (100, 1) * (1, 1) = (100, 1)
            y_predict = x * weights(1, 1) + bias(1, 1)
            1)构建模型
            y_predict = tf.matmul(x, weights) + bias
            2)构造损失函数
            loss = tf.reduce_mean(tf.square(y_predict - y_true))
            3)优化损失
            optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(loss)
            5 学习率的设置、步数的设置与梯度爆炸
    2.7.3 增加其他功能
        1 增加变量显示
            1)创建事件文件
            2)收集变量
            3)合并变量
            4)每次迭代运行一次合并变量
            5)每次迭代将summary对象写入事件文件
        2 增加命名空间
        3 模型的保存与加载
            saver = tf.train.Saver(var_list=None,max_to_keep=5)
            1)实例化Saver
            2)保存
                saver.save(sess, path)
            3)加载
                saver.restore(sess, path)
        4 命令行参数使用
            1)tf.app.flags
            tf.app.flags.DEFINE_integer("max_step", 0, "训练模型的步数")
            tf.app.flags.DEFINE_string("model_dir", " ", "模型保存的路径+模型名字")
            2)FLAGS = tf.app.flags.FLAGS
            通过FLAGS.max_step调用命令行中传过来的参数
            3、通过tf.app.run()启动main(argv)函数

代码

import tensorflow as tf
import os
os.environ['TF_CPP_MIN_LOG_LEVEL']='2'


"""
出处:
https://www.bilibili.com/video/av39049499?p=18&spm_id_from=pageDriver
"""



def tensorflow_demo():
    """
    TensorFlow的基本结构
    :return:
    """
    # 原生python加法运算
    a = 2
    b = 3
    c = a + b
    print("普通加法运算的结果:\n", c)

    # TensorFlow实现加法运算
    a_t = tf.constant(2)
    b_t = tf.constant(3)
    c_t = a_t + b_t
    print("TensorFlow加法运算的结果:\n", c_t)

    # 开启会话
    with tf.Session() as sess:
        c_t_value = sess.run(c_t)
        print("c_t_value:\n", c_t_value)

    return None

def graph_demo():
    """
    图的演示
    :return:
    """
    # TensorFlow实现加法运算
    a_t = tf.constant(2, name="a_t")
    b_t = tf.constant(3, name="a_t")
    c_t = tf.add(a_t, b_t, name="c_t")
    print("a_t:\n", a_t)
    print("b_t:\n", b_t)
    print("c_t:\n", c_t)
    # print("c_t.eval():\n", c_t.eval())

    # 查看默认图
    # 方法1:调用方法
    default_g = tf.get_default_graph()
    print("default_g:\n", default_g)

    # 方法2:查看属性
    print("a_t的图属性:\n", a_t.graph)
    print("c_t的图属性:\n", c_t.graph)


    # 自定义图
    new_g = tf.Graph()
    # 在自己的图中定义数据和操作
    with new_g.as_default():
        a_new = tf.constant(20)
        b_new = tf.constant(30)
        c_new = a_new + b_new
        print("a_new:\n", a_new)
        print("b_new:\n", b_new)
        print("c_new:\n", c_new)
        print("a_new的图属性:\n", a_new.graph)
        print("c_new的图属性:\n", c_new.graph)

    # 开启会话
    with tf.Session() as sess:
        # c_t_value = sess.run(c_t)
        # 试图运行自定义图中的数据、操作
        # c_new_value = sess.run((c_new))
        # print("c_new_value:\n", c_new_value)
        print("c_t_value:\n", c_t.eval())
        print("sess的图属性:\n", sess.graph)
        # 1)将图写入本地生成events文件
        tf.summary.FileWriter("./tmp/summary", graph=sess.graph)

    # 开启new_g的会话
    with tf.Session(graph=new_g) as new_sess:
        c_new_value = new_sess.run((c_new))
        print("c_new_value:\n", c_new_value)
        print("new_sess的图属性:\n", new_sess.graph)


    return None


def session_demo():
    """
    会话的演示
    :return:
    """

    # TensorFlow实现加法运算
    a_t = tf.constant(2, name="a_t")
    b_t = tf.constant(3, name="a_t")
    c_t = tf.add(a_t, b_t, name="c_t")
    print("a_t:\n", a_t)
    print("b_t:\n", b_t)
    print("c_t:\n", c_t)
    # print("c_t.eval():\n", c_t.eval())

    # 定义占位符
    a_ph = tf.placeholder(tf.float32)
    b_ph = tf.placeholder(tf.float32)
    c_ph = tf.add(a_ph, b_ph)
    print("a_ph:\n", a_ph)
    print("b_ph:\n", b_ph)
    print("c_ph:\n", c_ph)

    # 查看默认图
    # 方法1:调用方法
    default_g = tf.get_default_graph()
    print("default_g:\n", default_g)

    # 方法2:查看属性
    print("a_t的图属性:\n", a_t.graph)
    print("c_t的图属性:\n", c_t.graph)

    # 开启会话
    with tf.Session(config=tf.ConfigProto(allow_soft_placement=True,
                                        log_device_placement=True)) as sess:
        # 运行placeholder
        c_ph_value = sess.run(c_ph, feed_dict={a_ph: 3.9, b_ph: 4.8})
        print("c_ph_value:\n", c_ph_value)
        # c_t_value = sess.run(c_t)
        # 试图运行自定义图中的数据、操作
        # c_new_value = sess.run((c_new))
        # print("c_new_value:\n", c_new_value)
        # 同时查看a_t, b_t, c_t
        a, b, c = sess.run([a_t, b_t, c_t])
        print("abc:\n", a, b, c)
        print("c_t_value:\n", c_t.eval())
        print("sess的图属性:\n", sess.graph)
        # 1)将图写入本地生成events文件
        tf.summary.FileWriter("./tmp/summary", graph=sess.graph)

    return None

def tensor_demo():
    """
    张量的演示
    :return:
    """
    tensor1 = tf.constant(4.0)
    tensor2 = tf.constant([1, 2, 3, 4])
    linear_squares = tf.constant([[4], [9], [16], [25]], dtype=tf.int32)

    print("tensor1:\n", tensor1)
    print("tensor2:\n", tensor2)
    print("linear_squares_before:\n", linear_squares)

    # 张量类型的修改
    l_cast = tf.cast(linear_squares, dtype=tf.float32)
    print("linear_squares_after:\n", linear_squares)
    print("l_cast:\n", l_cast)

    # 更新/改变静态形状
    # 定义占位符
    # 没有完全固定下来的静态形状
    a_p = tf.placeholder(dtype=tf.float32, shape=[None, None])
    b_p = tf.placeholder(dtype=tf.float32, shape=[None, 10])
    c_p = tf.placeholder(dtype=tf.float32, shape=[3, 2])
    print("a_p:\n", a_p)
    print("b_p:\n", b_p)
    print("c_p:\n", c_p)
    # 更新形状未确定的部分
    # a_p.set_shape([2, 3])
    # b_p.set_shape([2, 10])
    # c_p.set_shape([2, 3])
    # 动态形状修改
    a_p_reshape = tf.reshape(a_p, shape=[2, 3, 1])
    print("a_p:\n", a_p)
    # print("b_p:\n", b_p)
    print("a_p_reshape:\n", a_p_reshape)
    c_p_reshape = tf.reshape(c_p, shape=[2, 3])
    print("c_p:\n", c_p)
    print("c_p_reshape:\n", c_p_reshape)

    return None

def variable_demo():
    """
    变量的演示
    :return:
    """
    # 创建变量
    with tf.variable_scope("my_scope"):
        a = tf.Variable(initial_value=50)
        b = tf.Variable(initial_value=40)
    with tf.variable_scope("your_scope"):
        c = tf.add(a, b)
    print("a:\n", a)
    print("b:\n", b)
    print("c:\n", c)

    # 初始化变量
    init = tf.global_variables_initializer()

    # 开启会话
    with tf.Session() as sess:
        # 运行初始化
        sess.run(init)
        a_value, b_value, c_value = sess.run([a, b, c])
        print("a_value:\n", a_value)
        print("b_value:\n", b_value)
        print("c_value:\n", c_value)

    return None

def linear_regression():
    """
    自实现一个线性回归
    :return:
    """
    with tf.variable_scope("prepare_data"):
        # 1)准备数据
        X = tf.random_normal(shape=[100, 1], name="feature")
        y_true = tf.matmul(X, [[0.8]]) + 0.7

    with tf.variable_scope("create_model"):
        # 2)构造模型
        # 定义模型参数 用 变量
        weights = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Weights")
        bias = tf.Variable(initial_value=tf.random_normal(shape=[1, 1]), name="Bias")
        y_predict = tf.matmul(X, weights) + bias

    with tf.variable_scope("loss_function"):
        # 3)构造损失函数
        error = tf.reduce_mean(tf.square(y_predict - y_true))

    with tf.variable_scope("optimizer"):
        # 4)优化损失
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)

    # 2_收集变量
    tf.summary.scalar("error", error)
    tf.summary.histogram("weights", weights)
    tf.summary.histogram("bias", bias)

    # 3_合并变量
    merged = tf.summary.merge_all()

    # 创建Saver对象
    saver = tf.train.Saver()

    # 显式地初始化变量
    init = tf.global_variables_initializer()

    # 开启会话
    with tf.Session() as sess:
        # 初始化变量
        sess.run(init)

        # 1_创建事件文件
        file_writer = tf.summary.FileWriter("./tmp/linear", graph=sess.graph)

        # 查看初始化模型参数之后的值
        print("训练前模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))

        # 开始训练
        # for i in range(100):
        #     sess.run(optimizer)
        #     print("第%d次训练后模型参数为:权重%f,偏置%f,损失为%f" % (i+1, weights.eval(), bias.eval(), error.eval()))
        #
        #     # 运行合并变量操作
        #     summary = sess.run(merged)
        #     # 将每次迭代后的变量写入事件文件
        #     file_writer.add_summary(summary, i)
        #
        #     # 保存模型
        #     if i % 10 ==0:
        #         saver.save(sess, "./tmp/model/my_linear.ckpt")
        # 加载模型
        if os.path.exists("./tmp/model/checkpoint"):
            saver.restore(sess, "./tmp/model/my_linear.ckpt")

        print("训练后模型参数为:权重%f,偏置%f,损失为%f" % (weights.eval(), bias.eval(), error.eval()))


    return None

# 1)定义命令行参数
tf.app.flags.DEFINE_integer("max_step", 100, "训练模型的步数")
tf.app.flags.DEFINE_string("model_dir", "Unknown", "模型保存的路径+模型名字")

# 2)简化变量名
FLAGS = tf.app.flags.FLAGS

def command_demo():
    """
    命令行参数演示
    :return:
    """
    print("max_step:\n", FLAGS.max_step)
    print("model_dir:\n", FLAGS.model_dir)

    return None

def main(argv):
    print("code start")
    return None


if __name__ == "__main__":
    # 代码1:TensorFlow的基本结构
    # tensorflow_demo()
    # 代码2:图的演示
    # graph_demo()
    # 代码3:会话的演示
    # session_demo()
    # 代码4:张量的演示
    # tensor_demo()
    # 代码5:变量的演示
    # variable_demo()
    # 代码6:自实现一个线性回归
    # linear_regression()
    # 代码7:命令行参数演示
    # command_demo()
    tf.app.run()

讲义

https://gitee.com/xu_kai_xuyouqian/tsdemo/blob/master/笔记整理.ipynb

posted @ 2021-07-14 00:01  Janey91  阅读(71)  评论(0编辑  收藏  举报