【美高梅开户网址】TensorFlow从入门到入门,tensorflow入门之陶冶简单的神经网络方法

在机器学习中恐怕会存在过拟合的标题,表现为在教练集上海展览中心现很好,但在测试集中显示不及磨练集中的那么好。

  1. 简单线性回归

     import tensorflow as tf
     import numpy 
    
     # 创造数据
     x_data = numpy.random.rand(100).astype(numpy.float32)
     y_data = x_data*0.1 + 0.3
    
     print(x_data,y_data)
    
     Weights = tf.Variable(tf.random_uniform([1],-1.0,1))
     biases = tf.Variable(tf.zeros([1]))
     y = Weights*x_data+biases
    
     loss = tf.reduce_mean(tf.square(y-y_data))
    
     optimizer = tf.train.GradientDescentOptimizer(0.5)
     train = optimizer.minimize(loss)
     init = tf.global_variables_initializer()
    
     sess = tf.Session()
     sess.run(init)
     for step in range(201):
         sess.run(train)
         if step%20 == 0:
             print(step,sess.run(Weights),sess.run(biases))
    
  2. 矩阵相乘,和Session()的二种采纳形式

     import tensorflow as tf
    
     #创建两个矩阵
     matrix1 = tf.constant([[3,3]])
     matrix2 = tf.constant([[2],[2]])
     product = tf.matmul(matrix1,matrix2)
     #到此都是在准备计算关系,并没有实际计算
    
     #启动session并计算的第一种形式
     sess = tf.Session()
     result = sess.run(product)
     print(result)
     sess.close()
    
     #启动session并计算的第二种方法
     with tf.Session() as sess:
         result = sess.run(product)
         print(result)
    
  3. 变量定义,常量定义,步骤定义,操作定义 ,Session
    本人对意况保存的风味

     # Tensorflow中必须定义变量,添加到构建的流图中  基本语法  state = tensorflow.Variable()  
    
     import tensorflow as tf
     #定义变量
     state = tf.Variable(0, name='counter')
     #定义常量
     one = tf.constant(1)
     #定义步骤
     new_value = tf.add(state,one)
     #定义赋值操作
     update = tf.assign(state, new_value)
    
     #定义变量以后初始化变量就是必须的
     init = tf.global_variables_initializer()
    
     #启动Session
     with tf.Session() as sess:
         sess.run(init)
         for _ in range(3):
             sess.run(update)
             print(sess.run(state))
    
  4. placeholder

     #placeholder 有时候会出现一些量我们不想在,定义流图阶段就把这些量写成常量,而是想计算的时候再输入。此时就要用到placeholder,定义流图的时候占位
     import tensorflow as tf
     #在 Tensorflow 中需要定义 placeholder 的 type ,一般为 float32 形式
     input1 = tf.placeholder(tf.float32)
     input2 = tf.placeholder(tf.float32)
    
     # mul = multiply 是将input1和input2 做乘法运算,并输出为 output 
     ouput = tf.multiply(input1, input2)
     with tf.Session() as sess:
         print(sess.run(ouput, feed_dict={input1: [7.], input2: [2.]}))
    
  5. 激励函数 (Activation
    Function),人工智能领域为了适应复杂多变的切实世界尤其找到的部分形状奇特的函数。特点大概须求:一.必须是非线性函数,因为要适于非线性难点。2.务必是可微分的,backpropagation抽样误差反向传递要运用到可微分天性。

  6. 添加层函数

     # 神经网络层的构建
     import tensorflow as tf
    
     #定义添加层的操作,新版的TensorFlow库中自带层不用手动怼
     def add_layer(inputs, in_size, out_size, activation_function = None):
         Weights = tf.Variable(tf.random_normal([in_size, out_size]))
         biases = tf.Variable(tf.zeros(1,out_size))+0.1
         Wx_plus_b = tf.matmul(inputs, Weights)+biases
         if activation_function is None:
             outputs = Wx_plus_b
         else:
             outputs = activation_function(Wx_plus_b)
         return outputs
    
  7. 数据可视化

     #结果可视化, 数据转换成图像
     # 1. matplotlib 
     import tensorflow as tf
     import numpy as np
     import matplotlib.pyplot as plt
    
     x_data = np.linspace(-1,1,300, dtype=np.float32)[:,np.newaxis]
     noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
     y_data = np.square(x_data) - 0.5 +noise
    
     plt.figure(1, figsize=(8, 6))
    
     plt.subplot(111)
     plt.plot(x_data, y_data, c='red', label='relu')
     plt.ylim((-1, 5))
     plt.legend(loc='best')
    
     plt.show()
    

    动画进度

      # 神经网络建造,训练过程
     import tensorflow as tf
     import numpy as np
     import matplotlib.pyplot as plt
    
     def add_layer(inputs, in_size, out_size, activation_function=None):
         Weights = tf.Variable(tf.random_normal([in_size, out_size]))
         biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
         Wx_plus_b = tf.matmul(inputs, Weights) + biases
         if activation_function is None:
             outputs = Wx_plus_b
         else:
             outputs = activation_function(Wx_plus_b)
         return outputs
    
     x_data = np.linspace(-1,1,300, dtype=np.float32)[:,np.newaxis]
     noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
     y_data = np.square(x_data) - 0.5 +noise
    
     xs = tf.placeholder(tf.float32,[None,1])
     ys = tf.placeholder(tf.float32,[None,1])
    
     #开始搭建神经网络
     #1个输入,10个输出 激励函数为tf.nn.relu
     l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
     #输出层定义
     prediction = add_layer(l1,10,1,activation_function=None)
     #误差计算 二者差的平方求和再取平均
     loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
     #学习效率参数 学习效率 0-1
     train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    
     #初始化变量
     init = tf.global_variables_initializer()
    
     #准备显示数据
     fig = plt.figure()
     ax = fig.add_subplot(1,1,1)
     ax.scatter(x_data, y_data)
     plt.ion()
     plt.show()
    
     #启动Session 开始训练
     with tf.Session() as sess:
         sess.run(init)
         for i in range(1000):
             sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
             #每过50步输出状态
             if i%50 == 0 :
                 # to visualize the result and improvement
                 try:
                     ax.lines.remove(lines[0])
                 except Exception:
                     pass
                 prediction_value = sess.run(prediction, feed_dict={xs: x_data})
                 # plot the prediction
                 lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
                 plt.pause(0.1)
    
  8. 加紧神经网络训练 包罗以下三种方式:

    1. Stochastic Gradient Descent (SGD)
    2. Momentum
    3. AdaGrad
    4. RMSProp
    5. Adam
  9. 计量可视化(tensorboard)

     # TensorFlow 中自带一个流图可视化工具tensorboard 可以用图的方式显示定义的流图
     # 神经网络建造,训练过程
     import tensorflow as tf
     import numpy as np
     import matplotlib.pyplot as plt
    
     def add_layer(inputs, in_size, out_size, activation_function=None):
         #都放到命名空间内
         with tf.name_scope('layer'):
             with tf.name_scope('weights'):
                 Weights = tf.Variable(
                 tf.random_normal([in_size, out_size]), 
                 name='W')
             with tf.name_scope('biases'):
                 biases = tf.Variable(
                 tf.zeros([1, out_size]) + 0.1, 
                 name='b')
             with tf.name_scope('Wx_plus_b'):
                 Wx_plus_b = tf.add(
                 tf.matmul(inputs, Weights), 
                 biases)
             if activation_function is None:
                 outputs = Wx_plus_b
             else:
                 outputs = activation_function(Wx_plus_b, )
             return outputs
    
     x_data = np.linspace(-1,1,300, dtype=np.float32)[:,np.newaxis]
     noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
     y_data = np.square(x_data) - 0.5 +noise
    
     #图结构分层 把两个placeholder放在一个方框中
     with tf.name_scope('inputs'):
         #站位名称给定 以前没有name参数
         xs= tf.placeholder(tf.float32, [None, 1],name='x_in') 
         ys= tf.placeholder(tf.float32, [None, 1],name='y_in')
    
     #开始搭建神经网络
     #1个输入,10个输出 激励函数为tf.nn.relu
     l1 = add_layer(xs,1,10,activation_function=tf.nn.relu)
     #输出层定义
     prediction = add_layer(l1,10,1,activation_function=None)
    
     with tf.name_scope('loss'):
         #误差计算 二者差的平方求和再取平均
         loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
    
     with tf.name_scope('train'):
         #学习效率参数 学习效率 0-1
         train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    
     #初始化变量
     init = tf.global_variables_initializer()
    
     #准备显示数据
     fig = plt.figure()
     ax = fig.add_subplot(1,1,1)
     ax.scatter(x_data, y_data)
     plt.ion()
     plt.show()
    
     #启动Session 开始训练
     with tf.Session() as sess:
         sess.run(init)
         #手动建立logs文件夹,运行后没有错误 再执行tensorboard --logdir logs
         writer = tf.summary.FileWriter("logs/", sess.graph)
         for i in range(1000):
             sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
             #每过50步输出状态
             if i%50 == 0 :
                 # to visualize the result and improvement
                 try:
                     ax.lines.remove(lines[0])
                 except Exception:
                     pass
                 prediction_value = sess.run(prediction, feed_dict={xs: x_data})
                 # plot the prediction
                 lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
                 plt.pause(0.1)
    
  10. 教练可视化,在计算结构中记录变量tf.summary.histogram(layer_name+'/weights',Weights)记录标量tf.summary.scalar('loss', loss)。Seesion起首化现在merged = tf.summary.merge_all()一定于开头化,通过rs = sess.run(merged,feed_dict={xs:x_data,ys:y_data}),writer.add_summary(rs, i)实行步进记录

    # TensorFlow 中自带一个流图可视化工具tensorboard 可以用图的方式显示定义的流图
    # 神经网络建造,训练过程
    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    def add_layer(inputs, in_size, out_size,layer_n, activation_function=None):
        #都放到命名空间内
        layer_name = 'layer%s'%layer_n
        with tf.name_scope('layer'):
            with tf.name_scope('weights'):
                Weights = tf.Variable(
                tf.random_normal([in_size, out_size]), 
                name='W')
            with tf.name_scope('biases'):
                biases = tf.Variable(
                tf.zeros([1, out_size]) + 0.1, 
                name='b')
            with tf.name_scope('Wx_plus_b'):
                Wx_plus_b = tf.add(
                tf.matmul(inputs, Weights), 
                biases)
            if activation_function is None:
                outputs = Wx_plus_b
            else:
                outputs = activation_function(Wx_plus_b, )
            #添加分析数据
            tf.summary.histogram(layer_name+'/weights',Weights)
            tf.summary.histogram(layer_name+'/biase',biases)
            tf.summary.histogram(layer_name+'/outputs',outputs)
            return outputs
    
    x_data = np.linspace(-1,1,300, dtype=np.float32)[:,np.newaxis]
    noise = np.random.normal(0,0.05,x_data.shape).astype(np.float32)
    y_data = np.square(x_data) - 0.5 +noise
    
    #图结构分层 把两个placeholder放在一个方框中
    with tf.name_scope('inputs'):
        #站位名称给定 以前没有name参数
        xs= tf.placeholder(tf.float32, [None, 1],name='x_in') 
        ys= tf.placeholder(tf.float32, [None, 1],name='y_in')
    
    #开始搭建神经网络
    #1个输入,10个输出 激励函数为tf.nn.relu
    l1 = add_layer(xs,1,10,1,activation_function=tf.nn.relu)
    #输出层定义
    prediction = add_layer(l1,10,1,2,activation_function=None)
    
    with tf.name_scope('loss'):
        #误差计算 二者差的平方求和再取平均
        loss = tf.reduce_mean(tf.reduce_sum(tf.square(ys-prediction),reduction_indices=[1]))
        #添加分析数据
        tf.summary.scalar('loss', loss)
    
    with tf.name_scope('train'):
        #学习效率参数 学习效率 0-1
        train_step = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
    
    #初始化变量
    init = tf.global_variables_initializer()
    
    #准备显示数据
    fig = plt.figure()
    ax = fig.add_subplot(1,1,1)
    ax.scatter(x_data, y_data)
    plt.ion()
    plt.show()
    
    #启动Session 开始训练
    with tf.Session() as sess:
        sess.run(init)
        #数据分析初始化
        merged = tf.summary.merge_all()
        #手动建立logs文件夹,运行后没有错误 再执行tensorboard --logdir logs
        writer = tf.summary.FileWriter("logs/", sess.graph)
        for i in range(1000):
            sess.run(train_step,feed_dict={xs:x_data,ys:y_data})
            #每过50步输出状态
            if i%50 == 0 :
                #图标统计
                rs = sess.run(merged,feed_dict={xs:x_data,ys:y_data})
                writer.add_summary(rs, i)
                # to visualize the result and improvement
                try:
                    ax.lines.remove(lines[0])
                except Exception:
                    pass
                prediction_value = sess.run(prediction, feed_dict={xs: x_data})
                # plot the prediction
                lines = ax.plot(x_data, prediction_value, 'r-', lw=5)
                plt.pause(0.1)
    
  11. 分类器:利用MNIST数据达成测试分类器,程序中重点新的读书点有一.
    MNIST数据采纳。二.优化指标函数中的交叉熵函数 叁.
    磨练方法选择梯度下跌法

    import tensorflow as tf
    
    def add_layer(inputs, in_size, out_size,layer_n, activation_function=None):
        #都放到命名空间内
        layer_name = 'layer%s'%layer_n
        with tf.name_scope('layer'):
            with tf.name_scope('weights'):
                Weights = tf.Variable(
                tf.random_normal([in_size, out_size]), 
                name='W')
            with tf.name_scope('biases'):
                biases = tf.Variable(
                tf.zeros([1, out_size]) + 0.1, 
                name='b')
            with tf.name_scope('Wx_plus_b'):
                Wx_plus_b = tf.add(
                tf.matmul(inputs, Weights), 
                biases)
            if activation_function is None:
                outputs = Wx_plus_b
            else:
                outputs = activation_function(Wx_plus_b, )
            #添加分析数据
            tf.summary.histogram(layer_name+'/weights',Weights)
            tf.summary.histogram(layer_name+'/biase',biases)
            tf.summary.histogram(layer_name+'/outputs',outputs)
            return outputs
    
    def compute_accuracy(v_xs, v_ys):
        global prediction
        y_pre = sess.run(prediction, feed_dict={xs: v_xs})
        correct_prediction = tf.equal(tf.argmax(y_pre,1), tf.argmax(v_ys,1))
        accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
        result = sess.run(accuracy, feed_dict={xs: v_xs, ys: v_ys})
        return result
    
    from tensorflow.examples.tutorials.mnist import input_data
    mnist = input_data.read_data_sets('MNIST_data',one_hot = True)
    
    xs = tf.placeholder(tf.float32,[None,784])
    ys = tf.placeholder(tf.float32,[None,10])
    
    prediction = add_layer(xs,784,10,1,activation_function=tf.nn.softmax)
    
    #loss函数(即最优化目标函数)选用交叉熵函数。交叉熵用来衡量预测值和真实值的相似程度,如果完全相同,它们的交叉熵等于零
    cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys*tf.log(prediction),reduction_indices=[1]))
    #train方法(最优化算法)采用梯度下降法。
    train_step = tf.train.GradientDescentOptimizer(0.5).minimize(cross_entropy)
    
    with tf.Session() as sess:
        sess.run(tf.global_variables_initializer())
        for i in range(1000):
            batch_xs,batch_ys = mnist.train.next_batch(100)
            sess.run(train_step,feed_dict={xs:batch_xs,ys:batch_ys})
            if i%50 == 0:
                print(compute_accuracy(mnist.test.images, mnist.test.labels))
    
  12. 过于拟合(Overfitting),过度学习。在拍卖具体难题的时候,数据出自是不可控的。总会现身对机器学习神经互连网不利的多少,来源至关心器重要能够分为,衡量测量误差,文化背景,外界滋扰。总括起来便是机械学习的神经互联网自设计之初就处理不了的数量。对于由于过分拟合人们找到了优化神经互连网的笔触。

    1. 充实数据量,机器学习的结果来自数据的思虑。数据量大了,有1个半个的十分数据也就不算什么了,或是出现争论的数来抵消(小可能率数据)。未有提升神经网络的身分。
    2. 正规化。
      1.修改测量误差计算函数,使得神经网络获得差异水平的举报。原始的 cost
      固有误差是如此总结, cost = 预测值-真实值的平方。假若 W 变得太大,
      大家就让 cost 也随之变大, 变成一种惩罚机制. 所以我们把 W
      自身思虑进来. 那里 abs 是相对值. 那一种样式的 正规化, 叫做 l1正规化. L二 规范和 l壹 类似, 只是相对值换到了平方. 其余的l三, l4也都以换到了立方和四遍方等等. 格局类似.
      用那几个情势,大家就能保险让学出来的线条不会过度扭曲.(引用https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-02-A-overfitting/)

      1. dropout。1种越发用在神经网络的规范的主意。Dropout
        的做法是从根本上让神经网络没机会过度正视.消息存在互连网中而不是最重要节点。
  13. overfitting和dropout 效果比较,dropout
    对于不另行的多寡很实惠可是一旦数据有限,过度磨炼的状态下效果会反弹。

    import tensorflow as tf
    import numpy as np
    import matplotlib.pyplot as plt
    
    tf.set_random_seed(1)
    np.random.seed(1)
    
    # Hyper parameters
    N_SAMPLES = 20
    N_HIDDEN = 300
    LR = 0.01
    
    # training data
    x = np.linspace(-1, 1, N_SAMPLES)[:, np.newaxis]
    y = x + 0.3*np.random.randn(N_SAMPLES)[:, np.newaxis]
    
    # test data
    test_x = x.copy()
    test_y = test_x + 0.3*np.random.randn(N_SAMPLES)[:, np.newaxis]
    
    # show data
    plt.scatter(x, y, c='magenta', s=50, alpha=0.5, label='train')
    plt.scatter(test_x, test_y, c='cyan', s=50, alpha=0.5, label='test')
    plt.legend(loc='upper left')
    plt.ylim((-2.5, 2.5))
    plt.show()
    
    # tf placeholders
    tf_x = tf.placeholder(tf.float32, [None, 1])
    tf_y = tf.placeholder(tf.float32, [None, 1])
    tf_is_training = tf.placeholder(tf.bool, None)  # to control dropout when training and testing
    
    # overfitting net
    o1 = tf.layers.dense(tf_x, N_HIDDEN, tf.nn.relu)
    o2 = tf.layers.dense(o1, N_HIDDEN, tf.nn.relu)
    o_out = tf.layers.dense(o2, 1)
    o_loss = tf.losses.mean_squared_error(tf_y, o_out)
    o_train = tf.train.AdamOptimizer(LR).minimize(o_loss)
    
    # dropout net
    d1 = tf.layers.dense(tf_x, N_HIDDEN, tf.nn.relu)
    d1 = tf.layers.dropout(d1, rate=0.5, training=tf_is_training)   # drop out 50% of inputs
    d2 = tf.layers.dense(d1, N_HIDDEN, tf.nn.relu)
    d2 = tf.layers.dropout(d2, rate=0.5, training=tf_is_training)   # drop out 50% of inputs
    d_out = tf.layers.dense(d2, 1)
    d_loss = tf.losses.mean_squared_error(tf_y, d_out)
    d_train = tf.train.AdamOptimizer(LR).minimize(d_loss)
    
    sess = tf.Session()
    sess.run(tf.global_variables_initializer())
    
    plt.ion()   # something about plotting
    
    for t in range(5000):
        sess.run([o_train, d_train], {tf_x: x, tf_y: y, tf_is_training: True})  # train, set is_training=True
    
        if t % 50 == 0:
            # plotting
            plt.cla()
            o_loss_, d_loss_, o_out_, d_out_ = sess.run(
                [o_loss, d_loss, o_out, d_out], {tf_x: test_x, tf_y: test_y, tf_is_training: False} # test, set is_training=False
            )
            plt.scatter(x, y, c='magenta', s=50, alpha=0.3, label='train'); 
            plt.scatter(test_x, test_y, c='cyan', s=50, alpha=0.3, label='test')
            plt.plot(test_x, o_out_, 'r-', lw=3, label='overfitting'); 
            plt.plot(test_x, d_out_, 'b--', lw=3, label='dropout(50%)')
            plt.text(0, -1.2, 'overfitting loss=%.4f' % o_loss_, fontdict={'size': 20, 'color':  'red'}); 
            plt.text(0, -1.5, 'dropout loss=%.4f' % d_loss_, fontdict={'size': 20, 'color': 'blue'})
            plt.legend(loc='upper left'); 
            plt.ylim((-2.5, 2.5)); 
            plt.pause(0.1)
    
    plt.ioff()
    plt.show()
    
  14. 卷积神经互连网,非常消耗总括能源,pc机器已经突显慢了。参考:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-03-A-CNN/

    import tensorflow as tf
    from tensorflow.examples.tutorials.mnist import input_data
    import numpy as np
    import matplotlib.pyplot as plt
    
    tf.set_random_seed(1)
    np.random.seed(1)
    
    BATCH_SIZE = 50
    LR = 0.001              # learning rate
    
    mnist = input_data.read_data_sets('./mnist', one_hot=True)  # they has been normalized to range (0,1)
    test_x = mnist.test.images[:2000]
    test_y = mnist.test.labels[:2000]
    
    # plot one example
    print(mnist.train.images.shape)     # (55000, 28 * 28)
    print(mnist.train.labels.shape)   # (55000, 10)
    plt.imshow(mnist.train.images[0].reshape((28, 28)), cmap='gray')
    plt.title('%i' % np.argmax(mnist.train.labels[0])); plt.show()
    
    tf_x = tf.placeholder(tf.float32, [None, 28*28]) / 255.
    image = tf.reshape(tf_x, [-1, 28, 28, 1])              # (batch, height, width, channel)
    tf_y = tf.placeholder(tf.int32, [None, 10])            # input y
    
    # CNN
    conv1 = tf.layers.conv2d(   # shape (28, 28, 1)
        inputs=image,
        filters=16,
        kernel_size=5,
        strides=1,
        padding='same',
        activation=tf.nn.relu
    )           # -> (28, 28, 16)
    pool1 = tf.layers.max_pooling2d(
        conv1,
        pool_size=2,
        strides=2,
    )           # -> (14, 14, 16)
    conv2 = tf.layers.conv2d(pool1, 32, 5, 1, 'same', activation=tf.nn.relu)    # -> (14, 14, 32)
    pool2 = tf.layers.max_pooling2d(conv2, 2, 2)    # -> (7, 7, 32)
    flat = tf.reshape(pool2, [-1, 7*7*32])          # -> (7*7*32, )
    output = tf.layers.dense(flat, 10)              # output layer
    
    loss = tf.losses.softmax_cross_entropy(onehot_labels=tf_y, logits=output)           # compute cost
    train_op = tf.train.AdamOptimizer(LR).minimize(loss)
    
    accuracy = tf.metrics.accuracy(          # return (acc, update_op), and create 2 local variables
        labels=tf.argmax(tf_y, axis=1), predictions=tf.argmax(output, axis=1),)[1]
    
    sess = tf.Session()
    init_op = tf.group(tf.global_variables_initializer(), tf.local_variables_initializer()) # the local var is for accuracy_op
    sess.run(init_op)     # initialize var in graph
    
    # following function (plot_with_labels) is for visualization, can be ignored if not interested
    from matplotlib import cm
    try: from sklearn.manifold import TSNE; HAS_SK = True
    except: HAS_SK = False; print('\nPlease install sklearn for layer visualization\n')
    def plot_with_labels(lowDWeights, labels):
        plt.cla(); X, Y = lowDWeights[:, 0], lowDWeights[:, 1]
        for x, y, s in zip(X, Y, labels):
            c = cm.rainbow(int(255 * s / 9)); plt.text(x, y, s, backgroundcolor=c, fontsize=9)
        plt.xlim(X.min(), X.max()); plt.ylim(Y.min(), Y.max()); plt.title('Visualize last layer'); plt.show(); plt.pause(0.01)
    
    plt.ion()
    for step in range(600):
        b_x, b_y = mnist.train.next_batch(BATCH_SIZE)
        _, loss_ = sess.run([train_op, loss], {tf_x: b_x, tf_y: b_y})
        if step % 50 == 0:
            accuracy_, flat_representation = sess.run([accuracy, flat], {tf_x: test_x, tf_y: test_y})
            print('Step:', step, '| train loss: %.4f' % loss_, '| test accuracy: %.2f' % accuracy_)
    
            if HAS_SK:
                # Visualization of trained flatten layer (T-SNE)
                tsne = TSNE(perplexity=30, n_components=2, init='pca', n_iter=5000); plot_only = 500
                low_dim_embs = tsne.fit_transform(flat_representation[:plot_only, :])
                labels = np.argmax(test_y, axis=1)[:plot_only]; plot_with_labels(low_dim_embs, labels)
    plt.ioff()
    
    # print 10 predictions from test data
    test_output = sess.run(output, {tf_x: test_x[:10]})
    pred_y = np.argmax(test_output, 1)
    print(pred_y, 'prediction number')
    print(np.argmax(test_y[:10], 1), 'real number')
    
  15. 神经互联网的保存或提取。

    1. 保存,本质是session的保存。

      import tensorflow as tf
      import numpy as np

      ## Save to file
      # remember to define the same dtype and shape when restore
      W = tf.Variable([[1,2,3],[3,4,5]], dtype=tf.float32, name=’weights’)
      b = tf.Variable([[1,2,3]], dtype=tf.float32, name=’biases’)

      # 替换到上边包车型客车写法:
      init = tf.global_variables_initializer()

      saver = tf.train.Saver()

      with tf.Session() as sess:

       sess.run(init)
       save_path = saver.save(sess, "my_net/save_net.ckpt")
       print("Save to path: ", save_path)
      
    2. 提取,session的恢复

    import tensorflow as tf
    import numpy as np
    
    # 先建立 W, b 的容器
    W = tf.Variable(np.arange(6).reshape((2, 3)), dtype=tf.float32, name="weights")
    b = tf.Variable(np.arange(3).reshape((1, 3)), dtype=tf.float32, name="biases")
    
    # 这里不需要初始化步骤 init= tf.initialize_all_variables()
    
    saver = tf.train.Saver()
    with tf.Session() as sess:
        # 提取变量
        saver.restore(sess, "my_net/save_net.ckpt")
        print("weights:", sess.run(W))
        print("biases:", sess.run(b))
    
  16. 循环神经网络。参考:https://morvanzhou.github.io/tutorials/machine-learning/tensorflow/5-07-A-RNN/

当使用Tensorflow磨练大批量深层的神经网络时,大家盼望去跟踪神经互连网的全体磨炼进程中的消息,比如迭代的经过中每一层参数是何等转移与遍布的,比如每一遍循环参数更新后模型在测试集与教练集上的准确率是什么的,比如损失值的变通景况,等等。假若能在磨练的进度中将一些音讯加以记录并可视化得表现出来,是还是不是对大家追究模型有越来越深的赞助与理解呢?

tensorflow入门之磨炼不难的神经网络方法,tensorflow神经互连网

这几天发轫学tensorflow,先来做一下上学记录

壹.神经网络消除难点步骤:

1.领到难题中实体的特征向量作为神经网络的输入。也正是说要对数码集实行特色工程,然后知道各种样本的表征维度,以此来定义输入神经元的个数。

二.定义神经网络的构造,并定义怎样从神经网络的输入获得输出。相当于说定义输入层,隐藏层以及输出层。

三.透过磨炼多少来调整神经网络中的参数取值,那是练习神经网络的进度。壹般的话要定义模型的损失函数,以及参数优化的不二等秘书诀,如交叉熵损失函数和梯度降低法调优等。

4.运用磨炼好的模型预测未知的数目。也等于评估模型的好坏。

【美高梅开户网址】TensorFlow从入门到入门,tensorflow入门之陶冶简单的神经网络方法。贰.教练简单的向前传播神经互连网

须臾间教练的神经模型是最简便的1类,而且是线性的(也等于说未有用激活函数去线性话),未有反向传播的进度,只是简短的表明神经互联网工作的流水生产线。

import tensorflow as tf

#定义隐藏层参数,每个w变量是一个tensor(可以当成是n*m的数组,n表示上一层结点个数,m表示本层结点个数)表示上一层与本层的连接权重,这里先随机定义权重
w1=tf.Variable(tf.random_normal([2,3],stddev=1))
w2=tf.Variable(tf.random_normal([3,1],stddev=1))

#定义存放输入数据的地方,也就是x向量,这里shape为前一个传入训练的样本个数,后面出入每个样本的维度大小
x=tf.placeholder(tf.float32,shape=(None,2),name="input")
#矩阵乘法
a=tf.matmul(x,w1)
y=tf.matmul(a,w2)

with tf.Session() as sess:
  #新版本好像不能用这个函数初始化所有变量了
  init_op=tf.initialize_all_variables()
  sess.run(init_op)
  #feed_dict用于向y中的x传入参数,这里传入3个,则y输出为一个3*1的tensor
  print(sess.run(y,feed_dict={x:[[0.7,0.9],[1.0,1.5],[2.1,2.3]]}))

到现在,三个用x的每种维度乘以两层权重之后输出单个值得线性神经网络就定义好了。

3.定义损失函数以及反向传播算法

有了地方的功底,大家得以定义损失函数以及反向传播算法去拟合数据了,非线性数据我们得以定义激活函数去线性化。还有一对细节正是学习率的难题,本次使用的是动态学习率,首先把学习率设定为相比大的值,加快收敛,然后趁着迭代次数的充实,学习率不断下挫,防止错过局地最小值。还有三个题材,正是预防过拟合。1般神经网络幸免过拟合的策略有三种,一种是正则化,1种是dropout,大家姑且不作探讨后者

损失函数:交叉熵

反向传播算法:梯度下落法

激活函数:relu

# -*- coding: utf-8 -*-
"""
Created on Fri Aug 18 14:02:19 2017

@author: osT
"""
import tensorflow as tf 
import numpy as np
#导入数据,这里的数据是每一行代表一个样本,每一行最后一列表示样本标签,0-32一共33个类
data=np.loadtxt('train_data.txt',dtype='float',delimiter=',')

#将样本标签转换成独热编码
def label_change(before_label):
  label_num=len(before_label)
  change_arr=np.zeros((label_num,33))
  for i in range(label_num):
    #该样本标签原本为0-32的,本人疏忽下32标记成33
    if before_label[i]==33.0:
      change_arr[i,int(before_label[i]-1)]=1
    else:
      change_arr[i,int(before_label[i])]=1
  return change_arr

#定义神经网络的输入输出结点,每个样本为1*315维,以及输出分类结果
INPUT_NODE=315
OUTPUT_NODE=33

#定义两层隐含层的神经网络,一层300个结点,一层100个结点
LAYER1_NODE=300
LAYER2_NODE=100

#定义学习率,学习率衰减速度,正则系数,训练调整参数的次数以及平滑衰减率
LEARNING_RATE_BASE=0.5
LEARNING_RATE_DECAY=0.99
REGULARIZATION_RATE=0.0001
TRAINING_STEPS=2000
MOVING_AVERAGE_DECAY=0.99

#定义整个神经网络的结构,也就是向前传播的过程,avg_class为平滑可训练量的类,不传入则不使用平滑
def inference(input_tensor,avg_class,w1,b1,w2,b2,w3,b3):
  if avg_class==None:
    #第一层隐含层,输入与权重矩阵乘后加上常数传入激活函数作为输出
    layer1=tf.nn.relu(tf.matmul(input_tensor,w1)+b1)
    #第二层隐含层,前一层的输出与权重矩阵乘后加上常数作为输出
    layer2=tf.nn.relu(tf.matmul(layer1,w2)+b2)
    #返回 第二层隐含层与权重矩阵乘加上常数作为输出
    return tf.matmul(layer2,w3)+b3
  else:
    #avg_class.average()平滑训练变量,也就是每一层与上一层的权重
    layer1=tf.nn.relu(tf.matmul(input_tensor,avg_class.average(w1))+avg_class.average(b1))
    layer2=tf.nn.relu(tf.matmul(layer1,avg_class.average(w2))+avg_class.average(b2))
    return tf.matmul(layer2,avg_class.average(w3))+avg_class.average(b3)

def train(data):
  #混洗数据
  np.random.shuffle(data)
  #取钱850个样本为训练样本,后面的全是测试样本,约250个
  data_train_x=data[:850,:315]
  data_train_y=label_change(data[:850,-1])
  data_test_x=data[850:,:315]
  data_test_y=label_change(data[850:,-1])

  #定义输出数据的地方,None表示无规定一次输入多少训练样本,y_是样本标签存放的地方
  x=tf.placeholder(tf.float32,shape=[None,INPUT_NODE],name='x-input')
  y_=tf.placeholder(tf.float32,shape=[None,OUTPUT_NODE],name='y-input')

  #依次定义每一层与上一层的权重,这里用随机数初始化,注意shape的对应关系
  w1=tf.Variable(tf.truncated_normal(shape=[INPUT_NODE,LAYER1_NODE],stddev=0.1))
  b1=tf.Variable(tf.constant(0.1,shape=[LAYER1_NODE]))

  w2=tf.Variable(tf.truncated_normal(shape=[LAYER1_NODE,LAYER2_NODE],stddev=0.1))
  b2=tf.Variable(tf.constant(0.1,shape=[LAYER2_NODE]))

  w3=tf.Variable(tf.truncated_normal(shape=[LAYER2_NODE,OUTPUT_NODE],stddev=0.1))
  b3=tf.Variable(tf.constant(0.1,shape=[OUTPUT_NODE]))

  #输出向前传播的结果
  y=inference(x,None,w1,b1,w2,b2,w3,b3)

  #每训练完一次就会增加的变量
  global_step=tf.Variable(0,trainable=False)

  #定义平滑变量的类,输入为平滑衰减率和global_stop使得每训练完一次就会使用平滑过程
  variable_averages=tf.train.ExponentialMovingAverage(MOVING_AVERAGE_DECAY,global_step)
  #将平滑应用到所有可训练的变量,即trainable=True的变量
  variable_averages_op=variable_averages.apply(tf.trainable_variables())

  #输出平滑后的预测值
  average_y=inference(x,variable_averages,w1,b1,w2,b2,w3,b3)

  #定义交叉熵和损失函数,但为什么传入的是label的arg_max(),就是对应分类的下标呢,我们迟点再说
  cross_entropy=tf.nn.sparse_softmax_cross_entropy_with_logits(logits=y,labels=tf.arg_max(y_,1))
  #计算交叉熵的平均值,也就是本轮训练对所有训练样本的平均值
  cross_entrip_mean=tf.reduce_mean(cross_entropy)

  #定义正则化权重,并将其加上交叉熵作为损失函数
  regularizer=tf.contrib.layers.l2_regularizer(REGULARIZATION_RATE)
  regularization=regularizer(w1)+regularizer(w2)+regularizer(w3)
  loss=cross_entrip_mean+regularization

  #定义动态学习率,随着训练的步骤增加不断递减
  learning_rate=tf.train.exponential_decay(LEARNING_RATE_BASE,global_step,900,LEARNING_RATE_DECAY)
  #定义向后传播的算法,梯度下降发,注意后面的minimize要传入global_step
  train_step=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss,global_step=global_step)
  #管理需要更新的变量,传入的参数是包含需要训练的变量的过程
  train_op=tf.group(train_step,variable_averages_op)

  #正确率预测
  correct_prediction=tf.equal(tf.arg_max(average_y,1),tf.arg_max(y_,1))
  accuracy=tf.reduce_mean(tf.cast(correct_prediction,tf.float32))

  with tf.Session() as sess:
    #初始所有变量
    tf.global_variables_initializer().run()
    #训练集输入字典
    validate_feed={x:data_train_x,y_:data_train_y}
    #测试集输入字典
    test_feed={x:data_test_x,y_:data_test_y}

    for i in range(TRAINING_STEPS):
      if i%1000==0:
        validate_acc=sess.run(accuracy,feed_dict=validate_feed)
        print("After %d training step(s),validation accuracy using average model is %g"%(i,validate_acc))
      #每一轮通过同一训练集训练,由于样本太少,没办法了
      sess.run(train_op,feed_dict=validate_feed)
    #用测试集查看模型的准确率
    test_acc=sess.run(accuracy,feed_dict=test_feed)
    print("After %d training step(s),test accuracy using average model is %g"%(TRAINING_STEPS,test_acc))
train(data)

下一场大家来看一下为何计算交叉熵时要传播样本的下标:

先是大家领会,输出结点有三11个,通过与眼下的权重相乘后,则各种结点都会有七个输出,各种输出大家姑且认为是对应每一个类的票房价值,该值越大,我们就越认为该样本为相应的类。logits参数是神经互联网的直接出口,也正是未经softmax函数处理的出口,labels传入的是单个值,也便是分类对应的下标,那是出于我们接纳的推断交叉熵的函数
tf.nn.sparse_softmax_cross_entropy_with_logits()有关。这一个函数对于在唯有3个科学分类的模型总括起到加快功能,而以此labels的输入正是“那三个不易的分类”,对应到输出的结点,正是其下标了。大家还有三个未曾加快的接力熵函数:tf.nn.softmax_cross_entropy_with_logis(logis=,labels=)这一年咱们就应有传入自个儿的labels标签了。

提起底,大家来总括一下进步模型准确率的法子:

一.选取激活函数。也便是去线性化,那步大致是必须的。
二.充实隐含层。就本例而言,单隐含层300个结点,准确率在8九%左右;单隐含层400个结点,准确率在九3%左右;而双隐含层300结点和100结点,准确率在玖四%左右。但扩充隐含层意味着增加磨练时间。
3.行使动态学习率。那不但能够加速练习的快慢,还足以追加神经网络收敛到较低的十分的小值处的票房价值,从而扩充准确率。
四.利用平滑模型。首要能够扩展模型的健壮性,使其泛化能力更加强。
5.加入正则化恐怕应用dropout幸免过拟合。

附上磨炼集

如上就是本文的全体内容,希望对我们的读书抱有协理,也指望大家多多协理帮客之家。

这几天开首学tensorflow,先来做一下读书记录 一.神经网络化解难点步骤:
1.提取…

美高梅开户网址 1

美高梅开户网址,Tensorflow官方推出了可视化学工业具Tensorboard,能够帮忙大家兑现上述成效,它能够将模型练习进度中的种种数码集中起来存在自定义的不2秘诀与日志文件中,然后在钦定的web端可视化地展现这个信息。

图中葡萄紫曲线是不奇怪模型,苹果绿曲线正是overfitting模型。固然紫色曲线很纯粹的分别了独具的教练多少,可是并从未描述数据的完全特点,对新测试数据的适应性较差。

1. Tensorboard介绍

1般用于消除过拟合的点子有扩充权重的惩治机制,比如L二正规化,但在本处大家利用tensorflow提供的dropout方法,在教练的时候,
大家随便忽略掉1部分神经元和神经联结 , 使这几个神经互联网变得”不完全”.
用2个不完全的神经网络练习二遍.
到第2遍再轻易忽略另一对, 变成另三个不完整的神经网络. 有了那些随机 drop
掉的条条框框, 大家得以想象其实每一次训练的时候,
我们都让每二回预测结果都不会凭借于在那之中某有个别特定的神经元. 像l一,
l二标准1样, 过度依靠的 W , 也便是教练参数的数值会十分大, l一,
l二会处以那几个大的 参数. Dropout 的做法是从根本上让神经网络没机会过度重视.

1.壹 Tensorboard的多少情势

这次大家采取在此以前sklearn中手写数字作为例子来开始展览。

Tensorboard能够记录与展示以下数据格局:
(1)标量Scalars
(2)图片Images
(3)音频Audio
(4)计算图Graph
(伍)数据分布Distribution
(6)直方图Histograms
(柒)嵌入向量Embeddings

加载数据

from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer

digits = load_digits()
X = digits.data
y = digits.target

# 把数值转换成one hot格式,例如:数字4就会被转换成:[0 0 0 0 1 0 0 0 0 0]
y = LabelBinarizer().fit_transform(y)
# 拆分数据集,以总量的30%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

一.二 Tensorboard的可视化进程

添加层

添加层函数如下:

import tensorflow as tf
def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs

定义placehoder和制造实际的网络布局

# 定义placeholder
# 输入的手写数字大小为8*8单位的数据
xs = tf.placeholder(tf.float32, [None, 8*8])
# 输出值为one hot结构的数据
ys = tf.placeholder(tf.float32, [None, 10])

# 添加层
# 第一层输入为8*8单位的手写输入数字图像,输出设定为100个神经元的层(为了能够看出是overfitting的问题),激活函数一般用tanh比较好
l1 = add_layer(xs, 8*8, 100, activation_function=tf.nn.tanh)
# 输出层因为最终是一个one hot的结构,因此输出的大小为10,激活函数用softmax
prediction = add_layer(l1, 100, 10, activation_function=tf.nn.softmax)

(1)首先肯定是先创建3个graph,你想从那么些graph中赢得某个数据的新闻

概念损失函数

# 定义损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), axis=1))
# 在tensorboard中记录损失函数值
tf.summary.scalar('loss', cross_entropy)
# 用梯度下降优化器进行训练
train_step = tf.train.GradientDescentOptimizer(0.6).minimize(cross_entropy)

(二)明确要在graph中的哪些节点放置summary operations以记录消息
利用tf.summary.scalar记录标量
运用tf.summary.histogram记录数据的直方图
动用tf.summary.distribution记录数据的分布图
使用tf.summary.image记录图像数据
….

记录损失函数并运维

sess = tf.Session()
merged = tf.summary.merge_all()
# 分别记录训练集的loss和测试集的loss值,目的是为了能够对比训练集和测试集中得拟合情况
train_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/train", sess.graph)
test_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/test", sess.graph)

init = tf.global_variables_initializer()
sess.run(init)

for i in range(500):
    sess.run(train_step, feed_dict={xs:X_train, ys:y_train})
    if i % 50 == 0:
        # 分别用训练集和测试集数据获得损失函数值
        train_result = sess.run(merged, feed_dict={xs:X_train, ys: y_train})
        train_writer.add_summary(train_result, i)

        test_result = sess.run(merged, feed_dict={xs:X_test, ys: y_test})
        test_writer.add_summary(test_result, i)

(三)operations并不会去真正进行总括,除非您告知她们须要去run,恐怕它被其余的内需run的operation所依靠。而作者辈上一步创制的那么些summary
operations其实并不被别的节点注重,因此,大家须求特地去运转具有的summary节点。但是呢,壹份程序下来或然有超多那样的summary
节点,要手动多少个1个去运营自然是会同繁琐的,因而大家可以使用tf.summary.merge_all去将富有summary节点合并成1个节点,只要运转那一个节点,就能发生负有大家事先安装的summary
data。

完全代码

from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

digits = load_digits()
X = digits.data
y = digits.target

# 把数值转换成one hot格式,例如:数字4就会被转换成:[0 0 0 0 1 0 0 0 0 0]
y = LabelBinarizer().fit_transform(y)
# 拆分数据集,以总量的30%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

import tensorflow as tf
def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs

# 定义placeholder
# 输入的手写数字大小为8*8单位的数据
xs = tf.placeholder(tf.float32, [None, 8*8])
# 输出值为one hot结构的数据
ys = tf.placeholder(tf.float32, [None, 10])

# 添加层
# 第一层输入为8*8单位的手写输入数字图像,输出设定为100个神经元的层(为了能够看出是overfitting的问题),激活函数一般用tanh比较好
l1 = add_layer(xs, 8*8, 100, activation_function=tf.nn.tanh)
# 输出层因为最终是一个one hot的结构,因此输出的大小为10,激活函数用softmax
prediction = add_layer(l1, 100, 10, activation_function=tf.nn.softmax)

# 定义损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), axis=1))
# 在tensorboard中记录损失函数值
tf.summary.scalar('loss', cross_entropy)
# 用梯度下降优化器进行训练
train_step = tf.train.GradientDescentOptimizer(0.6).minimize(cross_entropy)

sess = tf.Session()
merged = tf.summary.merge_all()
# 分别记录训练集的loss和测试集的loss值,目的是为了能够对比训练集和测试集中得拟合情况
train_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/train", sess.graph)
test_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/test", sess.graph)

init = tf.global_variables_initializer()
sess.run(init)

for i in range(500):
    sess.run(train_step, feed_dict={xs:X_train, ys:y_train})
    if i % 50 == 0:
        # 分别用训练集和测试集数据获得损失函数值
        train_result = sess.run(merged, feed_dict={xs:X_train, ys: y_train})
        train_writer.add_summary(train_result, i)

        test_result = sess.run(merged, feed_dict={xs:X_test, ys: y_test})
        test_writer.add_summary(test_result, i)

(四)使用tf.summary.FileWriter将运营后输出的数目都封存到地头磁盘中

出口结果

当我们运营了上边的代码后,会在D:/todel/data/tensorflow/目录下生成tensorboard收集的日记文件,大家得以在11分目录下输入:
美高梅开户网址 2

最终在tensorboard中显得的图形为:
美高梅开户网址 3

咱俩发现,练习集(葡萄紫的那条曲线)损失值要比测试集(莲灰的那条曲线)小,那样就存在过拟合的景况。

(五)运行总体程序,并在命令行输入运营tensorboard的一声令下,之后打开web端可查阅可视化的结果

消除过拟合

为了免除过拟合,我们应用dropout方式来展开。
率先设置一个封存可能率的placeholder,这样在运维时得以由此参数来开展设置

# 设置保留概率,即我们要保留的结果所占比例,它作为一个placeholder,在run时传入, 当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。
keep_prob = tf.placeholder(tf.float32)

然后在add_layer函数中调用dropout功效:

    # 调用dropout功能
    Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

聊到底在练习时设置保留的概率,但在获取损失值时用一体的数量来展开获取:

for i in range(500):
    sess.run(train_step, feed_dict={xs:X_train, ys:y_train, keep_prob: 0.7})
    if i % 50 == 0:
        # 分别用训练集和测试集数据获得损失函数值
        train_result = sess.run(merged, feed_dict={xs:X_train, ys: y_train, keep_prob:1})
        train_writer.add_summary(train_result, i)

        test_result = sess.run(merged, feed_dict={xs:X_test, ys: y_test, keep_prob:1})
        test_writer.add_summary(test_result, i)

这么全方位代码为:

from sklearn.datasets import load_digits
from sklearn.preprocessing import LabelBinarizer
from sklearn.model_selection import train_test_split

digits = load_digits()
X = digits.data
y = digits.target

# 把数值转换成one hot格式,例如:数字4就会被转换成:[0 0 0 0 1 0 0 0 0 0]
y = LabelBinarizer().fit_transform(y)
# 拆分数据集,以总量的30%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)

import tensorflow as tf
def add_layer(inputs, in_size, out_size, activation_function=None):
    """
    添加层
    :param inputs: 输入数据
    :param in_size: 输入数据的列数
    :param out_size: 输出数据的列数
    :param activation_function: 激励函数
    :return:
    """

    # 定义权重,初始时使用随机变量,可以简单理解为在进行梯度下降时的随机初始点,这个随机初始点要比0值好,因为如果是0值的话,反复计算就一直是固定在0中,导致可能下降不到其它位置去。
    Weights = tf.Variable(tf.random_normal([in_size, out_size]))
    # 偏置shape为1行out_size列
    biases = tf.Variable(tf.zeros([1, out_size]) + 0.1)
    # 建立神经网络线性公式:inputs * Weights + biases,我们大脑中的神经元的传递基本上也是类似这样的线性公式,这里的权重就是每个神经元传递某信号的强弱系数,偏置值是指这个神经元的原先所拥有的电位高低值
    Wx_plus_b = tf.matmul(inputs, Weights) + biases
    # 调用dropout功能
    Wx_plus_b = tf.nn.dropout(Wx_plus_b, keep_prob)

    if activation_function is None:
        # 如果没有设置激活函数,则直接就把当前信号原封不动地传递出去
        outputs = Wx_plus_b
    else:
        # 如果设置了激活函数,则会由此激活函数来对信号进行传递或抑制
        outputs = activation_function(Wx_plus_b)
    return outputs

# 定义placeholder
# 输入的手写数字大小为8*8单位的数据
xs = tf.placeholder(tf.float32, [None, 8*8])
# 输出值为one hot结构的数据
ys = tf.placeholder(tf.float32, [None, 10])
# 设置保留概率,即我们要保留的结果所占比例,它作为一个placeholder,在run时传入, 当keep_prob=1的时候,相当于100%保留,也就是dropout没有起作用。
keep_prob = tf.placeholder(tf.float32)

# 添加层
# 第一层输入为8*8单位的手写输入数字图像,输出设定为100个神经元的层(为了能够看出是overfitting的问题),激活函数一般用tanh比较好
l1 = add_layer(xs, 8*8, 100, activation_function=tf.nn.tanh)
# 输出层因为最终是一个one hot的结构,因此输出的大小为10,激活函数用softmax
prediction = add_layer(l1, 100, 10, activation_function=tf.nn.softmax)

# 定义损失函数
cross_entropy = tf.reduce_mean(-tf.reduce_sum(ys * tf.log(prediction), axis=1))
# 在tensorboard中记录损失函数值
tf.summary.scalar('loss', cross_entropy)
# 用梯度下降优化器进行训练
train_step = tf.train.GradientDescentOptimizer(0.6).minimize(cross_entropy)

sess = tf.Session()
merged = tf.summary.merge_all()
# 分别记录训练集的loss和测试集的loss值,目的是为了能够对比训练集和测试集中得拟合情况
train_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/train", sess.graph)
test_writer = tf.summary.FileWriter("D:/todel/data/tensorflow/test", sess.graph)

init = tf.global_variables_initializer()
sess.run(init)

for i in range(500):
    sess.run(train_step, feed_dict={xs:X_train, ys:y_train, keep_prob: 0.7})
    if i % 50 == 0:
        # 分别用训练集和测试集数据获得损失函数值
        train_result = sess.run(merged, feed_dict={xs:X_train, ys: y_train, keep_prob:1})
        train_writer.add_summary(train_result, i)

        test_result = sess.run(merged, feed_dict={xs:X_test, ys: y_test, keep_prob:1})
        test_writer.add_summary(test_result, i)

运营后输出tensorboard图形为(记得把在此之前的公文或目录举行删减并运营tensorboard进行彰显图形):
美高梅开户网址 4

如此磨练集和测试集的损失值就相比较周围了。

贰.Tensorboard用到案例

情理之中吗,大家依旧使用最基础的分辨手写字体的案例~

不过本案例也是先不去追求多美好的模型,只是建立二个简易的神经网络,让我们了然什么选择Tensorboard。

2.1 导入包,定义超参数,载入数据

(一)首先照旧导入需求的包:

from __future__ import absolute_import
from __future__ import division
from __future__ import print_function

import argparse
import sys

import tensorflow as tf

from tensorflow.examples.tutorials.mnist import input_data

(2)定义固定的超参数,方便待使用时一贯传入。假诺您问,这几个超参数为何要如此设定,怎么着抉择最优的超参数?这几个题材此处先不切磋,超参数的选拔在机器学习建立模型中最常用的主意正是“交叉验证法”。而现行反革命假诺大家早已取得了最优的超参数,设置学利率为0.00一,dropout的保留节点比例为0.玖,最大循环次数为一千.

其它,还要设置三个途径,第贰个是数额下载下来存放的地方,贰个是summary输出保存的地点。

max_step = 1000 # 最大迭代次数
learning_rate = 0.001  # 学习率
dropout = 0.9  # dropout时随机保留神经元的比例

data_dir = ''  # 样本数据存储的路径
log_dir = ''  # 输出日志保存的路径

(三)接着加载数据,下载数据是一贯调用了tensorflow提供的函数read_data_sets,输入八个参数,首个是下载到数据存款和储蓄的路径,第二个one_hot表示是不是要将品种标签实行独热编码。它首先回去找制定目录下有未有其1数据文件,没有的话才去下载,有的话就径直读取。所以首先次施行这么些命令,速度会相比慢。

mnist = input_data.read_data_sets(data_dir,one_hot=True)

二.2 成立特征与标签的占位符,保存输入的图样数据到summary

(一)创设tensorflow的暗许会话:

sess = tf.InteractiveSession()

(二)成立输入数据的占位符,分别创设特征数据x,标签数据y_

在tf.placeholder()函数中流传了三个参数,第2个是定义数据类型为float3二;第二个是多少的尺寸,特征数据是高低78四的向量,标签数据是大小为拾的向量,None表示不定死大小,到时候能够流传任何数据的样书;第1个参数是那么些占位符的名称。

with tf.name_scope('input'):
  x = tf.placeholder(tf.float32, [None, 784], name='x-input')
  y_ = tf.placeholder(tf.float32, [None, 10], name='y-input')

(3)使用tf.summary.image保存图像消息

天性数据实际上就是图像的像素数量拉升成叁个一*7捌4的向量,以后只要想在tensorboard上还原出输入的性状数据对应的图形,就需求将拉升的向量转变成2八
* 28 *
1的原始像素了,于是能够用tf.reshape()直接重新调整特征数据的维度:

将输入的数量转换来[28 * 28 *
1]的shape,存款和储蓄成另三个tensor,命名称为image_shaped_input。

为了能使图片在tensorbord上显示出来,使用tf.summary.image将图纸数据汇总给tensorbord。

tf.summary.image()中传来的第三个参数是命名,第3个是图表数据,第13个是最多呈现的张数,此处为拾张

with tf.name_scope('input_reshape'):
  image_shaped_input = tf.reshape(x, [-1, 28, 28, 1])
  tf.summary.image('input', image_shaped_input, 10)

2.3 创造初阶化参数的点子,与参数音信汇总到summary的主意

(一)在营造神经网络模型中,每1层中都急需去早先化参数w,b,为了使代码简介雅观,最佳将初步化参数的经过封装成方法function。

创办初始化权重w的办法,生成大小相等传入的shape参数,标准差为0.一,正态分布的自由数,并且将它转换到tensorflow中的variable重回。

def weight_variable(shape):
  """Create a weight variable with appropriate initialization."""
  initial = tf.truncated_normal(shape, stddev=0.1)
  return tf.Variable(initial)

开创发轫换偏执项b的艺术,生成大小为流传参数shape的常数0.1,并将其更换到tensorflow的variable并重回

def bias_variable(shape):
  """Create a bias variable with appropriate initialization."""
  initial = tf.constant(0.1, shape=shape)
  return tf.Variable(initial)

(二)我们领悟,在教练的历程在参数是时时刻刻地在改变和优化的,我们1再想明白每趟迭代后参数都做了如何变化,可以将参数的新闻显示在tenorbord上,由此大家专门写贰个方法来收录每一遍的参数新闻。

def variable_summaries(var):
  """Attach a lot of summaries to a Tensor (for TensorBoard visualization)."""
  with tf.name_scope('summaries'):
   # 计算参数的均值,并使用tf.summary.scaler记录
   mean = tf.reduce_mean(var)
   tf.summary.scalar('mean', mean)

   # 计算参数的标准差
   with tf.name_scope('stddev'):
    stddev = tf.sqrt(tf.reduce_mean(tf.square(var - mean)))
   # 使用tf.summary.scaler记录记录下标准差,最大值,最小值
   tf.summary.scalar('stddev', stddev)
   tf.summary.scalar('max', tf.reduce_max(var))
   tf.summary.scalar('min', tf.reduce_min(var))
   # 用直方图记录参数的分布
   tf.summary.histogram('histogram', var)

2.肆 创设神经互连网层

(一)创制第1层隐藏层
始建一个营造隐藏层的主意,输入的参数有:
input_tensor:特征数据
input_dim:输入数据的维度大小
output_dim:输出数据的维度大小(=隐层神经元个数)
layer_name:命名空间
act=tf.nn.relu:激活函数(暗中认可是relu)

def nn_layer(input_tensor, input_dim, output_dim, layer_name, act=tf.nn.relu):
  """Reusable code for making a simple neural net layer.
  It does a matrix multiply, bias add, and then uses relu to nonlinearize.
  It also sets up name scoping so that the resultant graph is easy to read,
  and adds a number of summary ops.
  """
  # 设置命名空间
  with tf.name_scope(layer_name):
   # 调用之前的方法初始化权重w,并且调用参数信息的记录方法,记录w的信息
   with tf.name_scope('weights'):
    weights = weight_variable([input_dim, output_dim])
    variable_summaries(weights)
   # 调用之前的方法初始化权重b,并且调用参数信息的记录方法,记录b的信息
   with tf.name_scope('biases'):
    biases = bias_variable([output_dim])
    variable_summaries(biases)
   # 执行wx+b的线性计算,并且用直方图记录下来
   with tf.name_scope('linear_compute'):
    preactivate = tf.matmul(input_tensor, weights) + biases
    tf.summary.histogram('linear', preactivate)
   # 将线性输出经过激励函数,并将输出也用直方图记录下来
   activations = act(preactivate, name='activation')
   tf.summary.histogram('activations', activations)

   # 返回激励层的最终输出
   return activations

调用隐层创造函数创立1个隐藏层:输入的维度是特色的维度7八四,神经元个数是500,也正是出口的维度。

hidden1 = nn_layer(x, 784, 500, 'layer1')

(2)成立二个dropout层,,随机关闭掉hidden1的有些神经元,并记录keep_prob

with tf.name_scope('dropout'):
  keep_prob = tf.placeholder(tf.float32)
  tf.summary.scalar('dropout_keep_probability', keep_prob)
  dropped = tf.nn.dropout(hidden1, keep_prob)

(三)创设一个输出层,输入的维度是上一层的出口:500,输出的维度是分类的门类系列:10,激活函数设置为全等映射identity.(一时先别使用softmax,会放在之后的损失函数中一起总计)

y = nn_layer(dropped, 500, 10, 'layer2', act=tf.identity)

二.5 创造损失函数

使用tf.nn.softmax_cross_entropy_with_logits来总括softmax并盘算交叉熵损失,并且求均值作为最终的损失值。

with tf.name_scope('loss'):
  # 计算交叉熵损失(每个样本都会有一个损失)
  diff = tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y)
  with tf.name_scope('total'):
   # 计算所有样本交叉熵损失的均值
   cross_entropy = tf.reduce_mean(diff)

tf.summary.scalar('loss', cross_entropy)

二.陆 练习,并总括准确率

(一)使用AdamOptimizer优化器练习模型,最小化交叉熵损失

with tf.name_scope('train'):
  train_step = tf.train.AdamOptimizer(learning_rate).minimize(
    cross_entropy)

(二)总计准确率,并用tf.summary.scalar记录准确率

with tf.name_scope('accuracy'):
  with tf.name_scope('correct_prediction'):
   # 分别将预测和真实的标签中取出最大值的索引,弱相同则返回1(true),不同则返回0(false)
   correct_prediction = tf.equal(tf.argmax(y, 1), tf.argmax(y_, 1))
  with tf.name_scope('accuracy'):
   # 求均值即为准确率
   accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
tf.summary.scalar('accuracy', accuracy)

贰.七 合并summary operation, 启动初阶化变量

将持有的summaries合并,并且将它们写到在此之前定义的log_dir路径

# summaries合并
merged = tf.summary.merge_all()
# 写到指定的磁盘路径中
train_writer = tf.summary.FileWriter(log_dir + '/train', sess.graph)
test_writer = tf.summary.FileWriter(log_dir + '/test')

# 运行初始化所有变量
tf.global_variables_initializer().run()

二.八 准备磨炼与测试的四个数据,循环执行总体graph举行操练与评估

(壹)以往大家要博取之后要喂人的数据.
1经是train==true,就从mnist.train中拿走多个batch样本,并且安装dropout值;
若是是还是不是train==false,则收获minist.test的测试数据,并且安装keep_prob为一,即保留全体神经元开启。

def feed_dict(train):
  """Make a TensorFlow feed_dict: maps data onto Tensor placeholders."""
  if train:
   xs, ys = mnist.train.next_batch(100)
   k = dropout
  else:
   xs, ys = mnist.test.images, mnist.test.labels
   k = 1.0
  return {x: xs, y_: ys, keep_prob: k}

(二)初阶陶冶模型。
每隔10步,就展开叁回merge,
并打字与印刷一次测试数据集的准确率,然后将测试数据集的种种summary音信写进日志中。
每隔100步,记录原新闻
任何每一步时都记录下演练集的summary音信并写到日志中。

for i in range(max_steps):
  if i % 10 == 0: # 记录测试集的summary与accuracy
   summary, acc = sess.run([merged, accuracy], feed_dict=feed_dict(False))
   test_writer.add_summary(summary, i)
   print('Accuracy at step %s: %s' % (i, acc))
  else: # 记录训练集的summary
   if i % 100 == 99: # Record execution stats
    run_options = tf.RunOptions(trace_level=tf.RunOptions.FULL_TRACE)
    run_metadata = tf.RunMetadata()
    summary, _ = sess.run([merged, train_step],
               feed_dict=feed_dict(True),
               options=run_options,
               run_metadata=run_metadata)
    train_writer.add_run_metadata(run_metadata, 'step%03d' % i)
    train_writer.add_summary(summary, i)
    print('Adding run metadata for', i)
   else: # Record a summary
    summary, _ = sess.run([merged, train_step], feed_dict=feed_dict(True))
    train_writer.add_summary(summary, i)
 train_writer.close()
 test_writer.close()

二.9 执行顺序,tensorboard生成可视化

(1)运转总体程序,在先后中定义的summary
node就会即将记录的新闻全部保存在钦点的logdir路径中了,磨练的笔录会存壹份文件,测试的记录会存一份文件。

(2)进入linux命令行,运营以下代码,等号前边加上summary日志保存的路径(在先后第2步中就先行自定义了)

tensorboard --logdir=

执行命令之后会冒出一条消息,上面有网站,将网站在浏览器中开辟就足以看来大家定义的可视化消息了。:

Starting TensorBoard 41 on port 6006
(You can navigate to http://127.0.1.1:6006)

将在浏览器中开拓,成功的话如下:

美高梅开户网址 5

于是大家得以从那些web端看到有着程序中定义的可视化新闻了。

2.10 Tensorboard Web端解释

探望最上边深蓝壹栏的菜谱,分别有多个栏目,都相继对应着我们先后中定义务消防队息的花色。

(1)SCALARS

来得的是标量的音信,作者先后中用tf.summary.scalars()定义的音讯都会在那个窗口。

忆起本文程序中定义的标量有:准确率accuracy,dropout的保留率,隐藏层中的参数消息,已经陆续熵损失。那个都在SCLA宝马X3S窗口下显得出来了。

点开accuracy,红线表示test集的结果,蓝线表示train集的结果,能够看来随着循环次数的增多,两者的准确度也在通趋势扩张,值得注意的是,在0到91回的轮回中准确率飞快增加产量,九四回今后保持微弱地升起势头,直达1000次时会到达0.967左右

美高梅开户网址 6

点开dropout,红线表示的测试集上的保留率始终是1,蓝线始终是0.九

美高梅开户网址 7

点开layer一,查看第三个隐藏层的参数音信。

美高梅开户网址 8 

以上,第二排是固执项b的新闻,随着迭代的加剧,最大值更大,最小值更加小,与此同时,也陪同着方差越来越大,这样的情形是大家甘愿见见的,神经元之间的参数差距更大。因为能够的事态下各种神经元都应有去关注差别的表征,所以她们的参数也应有所分歧。

第三排是权值w的音信,同理,最大值,最小值,标准差也都有与b相同的来头,神经元之间的反差越来越备受关注。w的均值初阶化的时候是0,随着迭代其绝对值也愈来愈大。

点开layer2

美高梅开户网址 9

点开loss,可知损失的跌势。

美高梅开户网址 10

(2)IMAGES

在先后中大家设置了壹处保存了图像音讯,便是在变更了输入特征的shape,然后记录到了image中,于是在tensorflow中就会还原出原本的图形了:

美高梅开户网址 11 

总体窗口总共突显了拾张图片(依据代码中的参数10)

(3)AUDIO

这边呈现的是声音的新闻,但本案例中未有关系到声音的。

(4)GRAPHS

那里展现的是一体训练进度的盘算图graph,从中大家得以洗涤地看来全部程序的逻辑与经过。

美高梅开户网址 12 

单击某些节点,能够查看属性,输入,输出等新闻

美高梅开户网址 13 

单击节点上的“+”字样,能够看到该节点的中间音讯。

美高梅开户网址 14 

别的还足以选拔图像颜色的相互模型,基于结构的格局,相同的节点会有平等的颜色,基于预算硬件的,同3个硬件上的会有雷同颜色。

美高梅开户网址 15

(5)DISTRIBUTIONS

那边查看的是神经元输出的分布,有激活函数从前的遍布,激活函数之后的分布等。

美高梅开户网址 16

(6)HISTOGRAMS

也得以看以上数量的直方图

美高梅开户网址 17

(7)EMBEDDINGS

展现的是放到向量的可视化效果,本案例中未有运用那几个功效。之后其余案例中再详述。

正文首要选择手写数字识别的小案例来讲解了哪些起初使用Tensorflow的可视化工具Tensorboard。

如上就是本文的全部内容,希望对大家的就学抱有帮忙,也愿意大家多多协理脚本之家。

你恐怕感兴趣的小说:

  • Tensorflow
    自带可视化Tensorboard使用格局(附项目代码)

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图