zoukankan      html  css  js  c++  java
  • TensorFlow笔记三:从Minist数据集出发 三种经典训练方法

    Minist数据集:MNIST_data 包含四个数据文件

    一、方法一:经典方法 tf.matmul(X,w)+b

    import tensorflow as tf
    import numpy as np
    import input_data
    import time
    
    #define paramaters
    learning_rate=0.01
    batch_size=128
    n_epochs=900
    
    # 1.read from data file
    #using TF learn built in function to load MNIST data to the folder data
    mnist=input_data.read_data_sets('MNIST_data/',one_hot=True)
    
    # 2.creat placeholders for features and label
    # each img in mnist data is 28*28 ,therefor need a 1*784 tensor
    # 10 classes corresponding to 0-9
    X=tf.placeholder(tf.float32,[batch_size,784],name='X_placeholder')
    Y=tf.placeholder(tf.float32,[batch_size,10 ],name='Y_placeholder')
    
    # 3.creat weight and bias ,w init to random variables with mean of 0 ;
    # b init to 0 ,shape of b depends on Y ,shape of w depends on the dimension of X and Y_placeholder
    w=tf.Variable(tf.random_normal(shape=[784,10],stddev=0.01),name='weights')
    b=tf.Variable(tf.zeros([1,10]),name="bias")
    
    # 4.build model to predict 
    # the model that returns the logits ,the logits will later passed through softmax layer
    logits=tf.matmul(X,w)+b
    
    # 5.define lose function
    # use cross entropy of softmax of logits as the loss function
    entropy=tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=Y,name='loss')
    loss=tf.reduce_mean(entropy)
    
    # 6.define training open
    # using gradient descent with learning rate of 0.01 to minimize loss
    optimizer=tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
    
    with tf.Session() as sess:
        writer=tf.summary.FileWriter('./my_graph/logistic_reg',sess.graph)
        
        start_time= time.time()
        sess.run(tf.global_variables_initializer())
        n_batches=int(mnist.train.num_examples/batch_size)
        for i in range(n_epochs) :  #train n_epochs times
            total_loss=0
        
            for _ in range(n_batches):
                X_batch,Y_batch=mnist.train.next_batch(batch_size)
                _,loss_batch=sess.run([optimizer,loss],feed_dict={X:X_batch,Y:Y_batch})
                total_loss +=loss_batch
            if i%100==0:
                print('Average loss epoch {0} : {1}'.format(i,total_loss/n_batches))
            
        print('Total time: {0} seconds'.format(time.time()-start_time))
        print('Optimization Finished!')
        
    # 7.test the model
        n_batches=int(mnist.test.num_examples/batch_size)
        total_correct_preds=0
        for i in range(n_batches):
            X_batch,Y_batch=mnist.test.next_batch(batch_size)
            _,loss_batch,logits_batch=sess.run([optimizer,loss,logits],feed_dict={X:X_batch,Y:Y_batch})
            preds=tf.nn.softmax(logits_batch)
            correct_preds=tf.equal(tf.argmax(preds,1),tf.argmax(Y_batch,1))
            accuracy=tf.reduce_sum(tf.cast(correct_preds,tf.float32))
            total_correct_preds+=sess.run(accuracy)
            
        print('Accuracy {0}'.format(total_correct_preds/mnist.test.num_examples))
    
        writer.close()

    准确率大约是92%,TFboard:

    二、方法二:deep learning 卷积神经网络

    # load MNIST data
    import input_data
    mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
    
    # start tensorflow interactiveSession
    import tensorflow as tf
    sess = tf.InteractiveSession()
    
    # weight initialization
    def weight_variable(shape):
        initial = tf.truncated_normal(shape, stddev=0.1)
        return tf.Variable(initial)
    
    def bias_variable(shape):
        initial = tf.constant(0.1, shape = shape)
        return tf.Variable(initial)
    
    # convolution
    def conv2d(x, W):
        return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME')
    # pooling
    def max_pool_2x2(x):
        return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
    
    # Create the model
    # placeholder
    x = tf.placeholder("float", [None, 784])
    y_ = tf.placeholder("float", [None, 10])
    # variables
    W = tf.Variable(tf.zeros([784,10]))
    b = tf.Variable(tf.zeros([10]))
    
    y = tf.nn.softmax(tf.matmul(x,W) + b)
    print (y)
    # first convolutinal layer
    w_conv1 = weight_variable([5, 5, 1, 32])
    b_conv1 = bias_variable([32])
    print (x)
    x_image = tf.reshape(x, [-1, 28, 28, 1])
    print (x_image)
    h_conv1 = tf.nn.relu(conv2d(x_image, w_conv1) + b_conv1)
    h_pool1 = max_pool_2x2(h_conv1)
    print (h_conv1)
    print (h_pool1)
    # second convolutional layer
    w_conv2 = weight_variable([5, 5, 32, 64])
    b_conv2 = bias_variable([64])
    
    h_conv2 = tf.nn.relu(conv2d(h_pool1, w_conv2) + b_conv2)
    h_pool2 = max_pool_2x2(h_conv2)
    print (h_conv2)
    print (h_pool2)
    # densely connected layer
    w_fc1 = weight_variable([7*7*64, 1024])
    b_fc1 = bias_variable([1024])
    
    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64])
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, w_fc1) + b_fc1)
    print (h_fc1)
    # dropout
    keep_prob = tf.placeholder("float")
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob)
    print (h_fc1_drop)
    # readout layer
    w_fc2 = weight_variable([1024, 10])
    b_fc2 = bias_variable([10])
    
    y_conv = tf.nn.softmax(tf.matmul(h_fc1_drop, w_fc2) + b_fc2)
    
    # train and evaluate the model
    cross_entropy = -tf.reduce_sum(y_*tf.log(y_conv))
    train_step = tf.train.GradientDescentOptimizer(1e-3).minimize(cross_entropy)
    #train_step = tf.train.AdagradOptimizer(1e-4).minimize(cross_entropy)
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1))
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, "float"))
    sess.run(tf.global_variables_initializer())
    writer=tf.summary.FileWriter('./my_graph/mnist_deep',sess.graph)
    
    # Train
    tf.initialize_all_variables().run()
    for i in range(1000):
        batch_xs, batch_ys = mnist.train.next_batch(100)
        #print (batch_xs.shape,batch_ys)
        if i % 100 == 0:
            train_accuracy = accuracy.eval(feed_dict={x: batch_xs, y_: batch_ys, keep_prob:0.5})
            print (("step %d, train accuracy %g" % (i, train_accuracy)))
        train_step.run({x: batch_xs, y_: batch_ys, keep_prob:0.5})
        #print(accuracy.eval({x: mnist.test.images, y_: mnist.test.labels}))
    
    # Test trained model
    print( ("python_base accuracy %g" % accuracy.eval(feed_dict={x:mnist.test.images[0:500], y_:mnist.test.labels[0:500], keep_prob:0.5})))
    
    writer.close()

    准确率达到98%,Board:

    三、第三种 使用minist数据集做图像去噪

    from keras.datasets import mnist
    from keras.layers import Input, Dense
    from keras.models import Model
    from keras.layers import Input, Dense, Conv2D, MaxPooling2D, UpSampling2D
    import numpy as np
    from keras.callbacks import TensorBoard
    import matplotlib.pyplot as plt
    
    
    (x_train, _), (x_test, _) = mnist.load_data()
    
    x_train = x_train.astype('float32') / 255.
    x_test = x_test.astype('float32') / 255.
    x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
    x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))  # adapt this if using `channels_first` image data format
    
    noise_factor = 0.5
    x_train_noisy = x_train + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_train.shape) 
    x_test_noisy = x_test + noise_factor * np.random.normal(loc=0.0, scale=1.0, size=x_test.shape) 
    
    x_train_noisy = np.clip(x_train_noisy, 0., 1.)
    x_test_noisy = np.clip(x_test_noisy, 0., 1.)
    x_train_noisy = x_train_noisy.astype(np.float)
    x_test_noisy = x_test_noisy.astype(np.float)
    
    
    input_img = Input(shape=(28, 28, 1))  # adapt this if using `channels_first` image data format
    
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(input_img)
    x = MaxPooling2D((2, 2), padding='same')(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    encoded = MaxPooling2D((2, 2), padding='same')(x)
    
    # at this point the representation is (7, 7, 32)
    
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(encoded)
    x = UpSampling2D((2, 2))(x)
    x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
    x = UpSampling2D((2, 2))(x)
    decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
    
    autoencoder = Model(input_img, decoded)
    autoencoder.compile(optimizer='adadelta', loss='binary_crossentropy')
    
    autoencoder.fit(x_train_noisy, x_train,
                    epochs=100,
                    batch_size=128,
                    shuffle=True,
                    validation_data=(x_test_noisy, x_test),
                    callbacks=[TensorBoard(log_dir='/tmp/tb', histogram_freq=0, write_graph=True)])
                    
                    
    n = 10
    plt.figure(figsize=(20, 4))
    for i in range(n):
    #noisy data
        ax = plt.subplot(3, n, i+1)
        plt.imshow(x_test_noisy[i].reshape(28, 28))
        plt.gray()
        ax.get_xaxis().set_visible(False)
        ax.get_yaxis().set_visible(False)
    #predict
        ax = plt.subplot(3, n, i+1+n)
        decoded_img = autoencoder.predict(x_test_noisy)
        plt.imshow(decoded_img[i].reshape(28, 28))
        plt.gray()
        ax.get_yaxis().set_visible(False)
        ax.get_xaxis().set_visible(False)
    #original
        ax = plt.subplot(3, n, i+1+2*n)
        plt.imshow(x_test[i].reshape(28, 28))
        plt.gray()
        ax.get_yaxis().set_visible(False)
        ax.get_xaxis().set_visible(False)
    plt.show()

    使用了keras,见官网 https://blog.keras.io/building-autoencoders-in-keras.html

    第一行是加了噪声的图,第二行是去噪以后的图,第三行是原图,回复效果较好

    125s跑一个epoch,100组三个半小时搞定

    tensorboard --logdir=/tmp/tb

  • 相关阅读:
    Smart Client Architecture and Design Guide
    Duwamish密码分析篇, Part 3
    庆贺发文100篇
    .Net Distributed Application Design Guide
    New Introduction to ASP.NET 2.0 Web Parts Framework
    SPS toplevel Site Collection Administrators and Owners
    来自Ingo Rammer先生的Email关于《Advanced .Net Remoting》
    The newsletter published by Ingo Rammer
    深度探索.Net Remoting基础架构
    信道、接收器、接收链和信道接受提供程序
  • 原文地址:https://www.cnblogs.com/dzzy/p/9886107.html
Copyright © 2011-2022 走看看