• 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

  • 相关阅读:
    Python实现定时监测屏幕
    近期仿真遇到的问题汇总
    Python爬虫
    好用的浏览器插件
    视频剪辑软件
    MATLAB
    常用电脑辅助快捷键
    绘制PCB软件
    ANSYS19.0安装教程and遇到的各种问题以及目前知道的解决方式
    pyton脚本快速运行
  • 原文地址:https://www.cnblogs.com/dzzy/p/9886107.html
Copyright © 2020-2023  润新知