zoukankan      html  css  js  c++  java
  • Tensor flow 实战Google深度学习框架 笔记Code Part TensorFlow 入门

    计算图的使用

    import tensorflow as tf
    a = tf.constant([1.0,2.0],name="a")
    b = tf.constant([2.0,3.0],name="b")
    result=a+b
    print(a.graph is tf.get_default_graph())
    import tensorflow as tf
    
    g1 =tf.Grapf()
    with g1.as_default():
        v=tf.get_variable("v",initializer=tf.zeros_initializer(shape=[1]))
    g2 =tf.Grapf()
    with g2.as_default():
        v=tf.get_variable("v",initializer=tf.ones_initializer(shape=[1]))
    
    with tf.Session(graph=g1) as sess:
        tf.initializer_all_variables().run()
        with tf.variable_scope("",reuse=True):
            print(sess.run(tf.get_variable("v")))
    
    with tf.Session(graph=g2) as sess:
        tf.initializer_all_variables().run()
        with tf.variable_scope("",reuse=True):
            print(sess.run(tf.get_variable("v")))
    g=tf.Graph()
    with g.device('/gpu:0'):
            result=a+b

    张量

    import tensorflow as tf
    #tf.constant是一个计算 计算的结果是一个张量 保存在变量a中
    a = tf.constant([1.0,2.0],name="a")
    b = tf.constant([2.0,3.0],name="b")
    result = tf.add(a,b,name="add")
    print result
    import tensotflow as tf 
    a = tf.constant([1,2],name="a")
    b = tf.constant([2.0,3.0],name="b")
    result=a+b
    #error:类型不匹配  改正:a = tf.constant([1,2],name="a",dtype=tf.float32)
    
    
    #使用张量记录中间结果
    a = tf.constant([1.0,2.0],name="a")
    b = tf.constant([2.0,3.0],name="b")
    result =a+b
    
    #直接计算向量的和 可读性差
    result = tf.constant([1.0,2.0],name="a")+ tf.constant([2.0,3.0],name="b")

     会话

    sess = tf.Session()
    
    sess.run(...)
    
    sess.close()
    with tf.Session() as sess:
        sess.run(...)
    sess = tf.Session()
    with sess.as_default():
        print(result.eval())
    sess = tf.Session()
    
    print(sess.run(result))
    print(result.eval(session=sess))
    #使用这个语句生成的会话会自动设置成默认会话
    sess = tf.InteractiveSession()
    print(result.eval())
    sess.close()
    #使用下句来配置需要生成的会话
    config = tf.ConfigProto(allow_soft_placement=True,log_device_placement=True)
    sess1=tf.InteractiveSession(config=config)
    sess2=tf.Session(config=config)

     实现神经网络

    #实现矩阵乘法功能
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    #随机初始化一个2*3的矩阵变量 标准差为2
    weights=tf.Variable(tf.random_normal(2,3),steddev=2)
    biases=tf.Variable(tf.zeros([3]))
    #通过其他变量的初始值来初始化新的变量
    w2=tf.Variable(weights.initialized_value())
    w3=tf.Variable(weights.initialized_value()*2.0)
    import tensorflow as tf
    w1 =tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2 =tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    
    x=tf.constant([0.7,0.9])
    
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    
    sess=tf.Session()
    
    sess.run(w1.initializer)
    sess.run(w2.initializer)
    
    print(sess.run(y))
    sess.close()
    #初始化所有变量
    init_op=tf.initialize_all_variables()
    sess.run(init_op)
    #维度和类型是变量最重要的两个属性
    w1 =tf.Variable(tf.random_normal([2,3],stddev=1),name="w1")
    w2 =tf.Variable(tf.random_normal([3,1],dtype=tf.float64,stddev=1,seed=1),
    name="w2")
    #程序将报错 类型错误
    w1.assign(w2)#tf.assign(A,new_number)赋值
    
    w1 =tf.Variable(tf.random_normal([2,3],stddev=1,seed=1),name="w1")
    w2 =tf.Variable(tf.random_normal([2,2],stddev=1,seed=1),name="w2")
    #程序将报错 维度不一致
    tf.assign(w1,w2)
    #通过设置参数validate=False  可以改变维度
    tf.assign(w1,w2,validate_shape=False)
    import tensorflow as tf
    w1 =tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2 =tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    #定义placeholder作为存放输入数据的地方 这里的维度也不一定要定义
    x=tf.placeholder(tf.float32,shape=(1,2),name="input")
    
    a=tf.matmul(x,w1)
    y=tf.matmul(a,w2)
    
    sess=tf.Session()
    init_op=tf.initialize_all_variables()
    sess.run(init_op)
    #下面将报错 因为没有输入数据
    print(sess.run(y))
    
    print(sess.run(y,feed_dict={x:[[0.7,0.9]]}))
    x=tf.placeholder(tf.float32,shape=(3,2),name="input")
    print(sess.run(y,feed_dict={x: [[0.7,0.9],[0.1,0.4],[0.5,0.8]]}))

     tf.clip_by_value(A, min, max):输入一个张量A,把A中的每一个元素的值都压缩在min和max之间。

    小于min的让它等于min,大于max的元素的值等于max。

    tf.log 对数计算

    求最大值tf.reduce_max(input_tensor, reduction_indices=None, keep_dims=False, name=None)

    求平均值tf.reduce_mean(input_tensor, reduction_indices=None, keep_dims=False, name=None)

    参数1--input_tensor:待求值的tensor。

    参数2--reduction_indices:在哪一维上求解。

    参数(3)(4)可忽略

    #定义损失函数来刻画预测值与真实值得差距
    cross_entropy=-tf.reduce_mean(
        y_*tf.log(tf.clip_by_value(y,le-10,1.0))
    
    #定义学习率 
    learning_rate=0.001
    
    #定义反向传播算法来优化神经网络中的参数
    train_step=	f.train.AamOptimizer(learining_rate).minimize(cross_entropy)

     三种常用优化方法

     tf.train.Optimizer 

     tf.train.GradientDescentOptimizer

     tf.train.AdadeltaOptimizer

    完整神经网络样例程序

    在一个模拟数据集上训练一个神经网络剞劂二分类问题

    import tensorflow
    
    #NumPy是一个科学计算的工具包 这里通过NumPy工具包生成模拟数据集
    from numpy.random import RandomState
    
    #定义训练数据batch的大小
    batch_size=8
    
    #定义神经网络参数 
    w1 =tf.Variable(tf.random_normal([2,3],stddev=1,seed=1))
    w2 =tf.Variable(tf.random_normal([3,1],stddev=1,seed=1))
    
    #在shape的一个维度上使用None 可以方便使用不同的batch的大小 在训练时需要把数据分
    #成比较小的batch 但是在测试时 可以一次性使用全部的数据 当数据集比较小时像这样比较
    #方便测试,但数据集比较大时,将大量数据放入一个batch可能会导致内存溢出(内存不够)
    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)
    y=tf.matmul(a,w2)
    
    #定义损失函数和方向传播算法
    cross_entropy=-tf.reduce.mean(
        y_*tf.log(tf.clip_by_value(y,le-10,1.0)))
    train_step=tf.train.AamOPtimizer(0.001).minimizer(cross_entropy)
    
    #通过随机数生成一个模拟数据集
    rdm=RandomState(1)
     dataset_size=128
    X=rdm.rand(dataset_size,2)
    
    #定义规则来给出样本的标签。在这里所有x1+x2<1的样例都被认为是正样本(比如零件#合格),而其他则认为i是不合格(比如零件不合格)。在这里用0来表示负样本,1来表示正#样本。大部分解决分类问题的神经网络都会采用0和1的表示方法。
    Y=[[int(x1+x2<1)] for (x1,x2) in X]
    
    #创建一个会话来运行TensorFlow程序。
    with tf.Session() as sess:
        init_op =tf.initialize_all_variables()
        #初始化变量
        sess.run(init_op)
        print sess.run(w1)
        print sess.run(w2)
    #输出初始化的参数(训练之前)
    
    #设定训练轮数
    STEPS=5000
    for i in range(STEPS):
        #每次选取batch_size个样本进行训练
        start =(i*batch_size)%dataset_size
        end =min (start+batch_size,dataset_size)
    
        #通过选取的样本训练神经网络并更新参数
        sess.run(train_step,
                     feed_dict={x:X[start:end],y_:Y[start:end]})
         if i%1000=0:
            #每隔一段时间计算在所有数据上的交叉熵并输出。=-=-=-=
            total_cross_entropy=sess.run(
                   cross_entropy,feed_dict={x:X,y_:Y})
            print("After %d training step(s) ,cross entropy on all data is %g"
                    %(i,total_cross_tntropy))
            #通过这个结果可以发现随着训练的进行 交叉熵是逐渐变小的 交叉熵越小说明预测
            # 结果和真实的结果差距越小
    
    print sess.run(w1)
    print sess.run(w2)
  • 相关阅读:
    event事件对象
    移动端布局模式
    事件冒泡和事件捕获
    移动web缓存介绍 ---摘录
    this的运用
    第一次演讲准备篇--css
    jquery内部技术分析
    java 编程思想笔记(五)——接口
    java 编程思想笔记(四)——多态
    java 编程思想笔记(三)——类的复用
  • 原文地址:https://www.cnblogs.com/IAMzhuxiaofeng/p/9028908.html
Copyright © 2011-2022 走看看