Deep Neural Network (Tensorflow)

Deep Neural Network (Tensorflow)

仅用于自己学习使用

依赖的库

import numpy as np
import h5py
from matplotlib import pyplot as plt
import tensorflow as tf
from tensorflow.python.framework import ops
import tf_utils
import time
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np

创建placeholders

def create_placeholders(n_x,n_y):
   
    X = tf.placeholder(tf.float32, [n_x, None], name="X")
    Y = tf.placeholder(tf.float32, [n_y, None], name="Y")
    
    return X, Y

初始化参数

def initialize_parameters_deep(layers_dims):
    tf.set_random_seed(1) #指定随机种子
    # np.random.seed(3)
    parameters = {}
    L = len(layers_dims)
    
    for l in range(1,L):

        parameters["W" + str(l)] = tf.get_variable("W" + str(l),[layers_dims[l], layers_dims[l - 1]],initializer=tf.contrib.layers.xavier_initializer(seed=1))
        parameters["b" + str(l)] = tf.get_variable("b" + str(l),[layers_dims[l], 1],initializer=tf.zeros_initializer())

    return parameters

前向传播

def linear_activation_forward(A_prev,W,b,activation):
    Z = tf.matmul(W,A_prev)+b    # np.dot(W,A_prev) + b
    if activation == "sigmoid":
        A= tf.nn.sigmoid(Z)
    elif activation == "relu":
        A = tf.nn.relu(Z)
    
    # assert(A.shape == (W.shape[0],A_prev.shape[1]))
    cache = (A_prev, W, b,Z) # (A_prev, W, b,Z)
    
    return A,cache

 
def L_model_forward(X,parameters):

    caches = []    #[(X, W1, b1,Z1),(A1, W2, b2,Z2).....]
    A = X
    L = len(parameters) // 2
    for l in range(1,L):
        A_prev = A 
        A, cache = linear_activation_forward(A_prev, parameters['W' + str(l)], parameters['b' + str(l)], "relu")
        caches.append(cache) 
    
    ZL = tf.matmul(parameters['W' + str(L)],A)+parameters['b' + str(L)]  
    AL, cache = linear_activation_forward(A, parameters['W' + str(L)], parameters['b' + str(L)], "sigmoid")
    caches.append(cache)
    
    return ZL

成本函数

def compute_cost(ZL,Y):

    logits = tf.transpose(ZL) #转置
    labels = tf.transpose(Y)  #转置
    
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))
    
    return cost

多层神经网络

def L_layer_model(X_train, Y_train,X_test,Y_test, layers_dims, learning_rate=0.0001, num_iterations=1500, minibatch_size=32,print_cost=True,is_Plot=True):

    ops.reset_default_graph()                #能够重新运行模型而不覆盖tf变量
    tf.set_random_seed(1)
    seed = 3
    (n_x , m)  = X_train.shape               #获取输入节点数量和样本数
    n_y = Y_train.shape[0]                   #获取输出节点数量
    costs = []                               #成本集
    
    #给X和Y创建placeholder
    X,Y = create_placeholders(n_x,n_y)   
    #初始化参数
    parameters =initialize_parameters_deep(layers_dims)
    ZL = L_model_forward(X,parameters)
    cost = compute_cost(ZL,Y)
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
    init = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        sess.run(init)
        
        for epoch in range(num_iterations):
            epoch_cost =0
            num_minibatches = int (m / minibatch_size )
            seed = seed +1 
            minibatches = tf_utils.random_mini_batches(X_train,Y_train,minibatch_size,seed)

            for minibatch in minibatches:
                (minibatch_X,minibatch_Y) = minibatch
                
                _ , minibatch_cost = sess.run([optimizer,cost],feed_dict={X:minibatch_X,Y:minibatch_Y})
                
                epoch_cost = epoch_cost + minibatch_cost / num_minibatches
            
            if epoch % 5 == 0:
                costs.append(epoch_cost)
                #是否打印:
                if print_cost and epoch % 100 == 0:
                        print("epoch = " + str(epoch) + "    epoch_cost = " + str(epoch_cost))
        
        #是否绘制图谱
        if is_Plot:
            plt.plot(np.squeeze(costs))
            plt.ylabel('cost')
            plt.xlabel('iterations (per tens)')
            plt.title("Learning rate =" + str(learning_rate))
            plt.show()
    
        #保存学习后的参数
        parameters = sess.run(parameters)
        print("参数已经保存到session。")
        
        #计算当前的预测结果
        correct_prediction = tf.equal(tf.argmax(ZL),tf.argmax(Y))
        
        #计算准确率
        accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
        
        print("训练集的准确率:", accuracy.eval({X: X_train, Y: Y_train}))
        print("测试集的准确率:", accuracy.eval({X: X_test, Y: Y_test}))
        
        return parameters

完整代码

import numpy as np
import h5py
from matplotlib import pyplot as plt
import tensorflow as tf
from tensorflow.python.framework import ops
import tf_utils
import time
import matplotlib.pyplot as plt # plt 用于显示图片
import matplotlib.image as mpimg # mpimg 用于读取图片
import numpy as np
np.random.seed(1)
def create_placeholders(n_x,n_y):
   
    X = tf.placeholder(tf.float32, [n_x, None], name="X")
    Y = tf.placeholder(tf.float32, [n_y, None], name="Y")
    
    return X, Y
def initialize_parameters_deep(layers_dims):
    tf.set_random_seed(1) #指定随机种子
    # np.random.seed(3)
    parameters = {}
    L = len(layers_dims)
    
    for l in range(1,L):

        parameters["W" + str(l)] = tf.get_variable("W" + str(l),[layers_dims[l], layers_dims[l - 1]],initializer=tf.contrib.layers.xavier_initializer(seed=1))
        parameters["b" + str(l)] = tf.get_variable("b" + str(l),[layers_dims[l], 1],initializer=tf.zeros_initializer())

    return parameters

def linear_activation_forward(A_prev,W,b,activation):
    Z = tf.matmul(W,A_prev)+b    # np.dot(W,A_prev) + b
    if activation == "sigmoid":
        A= tf.nn.sigmoid(Z)
    elif activation == "relu":
        A = tf.nn.relu(Z)
    
    # assert(A.shape == (W.shape[0],A_prev.shape[1]))
    cache = (A_prev, W, b,Z) # (A_prev, W, b,Z)
    
    return A,cache

 
def L_model_forward(X,parameters):

    caches = []    #[(X, W1, b1,Z1),(A1, W2, b2,Z2).....]
    A = X
    L = len(parameters) // 2
    for l in range(1,L):
        A_prev = A 
        A, cache = linear_activation_forward(A_prev, parameters['W' + str(l)], parameters['b' + str(l)], "relu")
        caches.append(cache) 
    
    ZL = tf.matmul(parameters['W' + str(L)],A)+parameters['b' + str(L)]  
    AL, cache = linear_activation_forward(A, parameters['W' + str(L)], parameters['b' + str(L)], "sigmoid")
    caches.append(cache)
    
    return ZL

def compute_cost(ZL,Y):

    logits = tf.transpose(ZL) #转置
    labels = tf.transpose(Y)  #转置
    
    cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits,labels=labels))
    
    return cost


def L_layer_model(X_train, Y_train,X_test,Y_test, layers_dims, learning_rate=0.0001, num_iterations=1500, minibatch_size=32,print_cost=True,is_Plot=True):

    ops.reset_default_graph()                #能够重新运行模型而不覆盖tf变量
    tf.set_random_seed(1)
    seed = 3
    (n_x , m)  = X_train.shape               #获取输入节点数量和样本数
    n_y = Y_train.shape[0]                   #获取输出节点数量
    costs = []                               #成本集
    
    #给X和Y创建placeholder
    X,Y = create_placeholders(n_x,n_y)   
    #初始化参数
    parameters =initialize_parameters_deep(layers_dims)
    ZL = L_model_forward(X,parameters)
    cost = compute_cost(ZL,Y)
    optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)
    init = tf.global_variables_initializer()
    
    with tf.Session() as sess:
        sess.run(init)
        
        for epoch in range(num_iterations):
            epoch_cost =0
            num_minibatches = int (m / minibatch_size )
            seed = seed +1 
            minibatches = tf_utils.random_mini_batches(X_train,Y_train,minibatch_size,seed)

            for minibatch in minibatches:
                (minibatch_X,minibatch_Y) = minibatch
                
                _ , minibatch_cost = sess.run([optimizer,cost],feed_dict={X:minibatch_X,Y:minibatch_Y})
                
                epoch_cost = epoch_cost + minibatch_cost / num_minibatches
            
            if epoch % 5 == 0:
                costs.append(epoch_cost)
                #是否打印:
                if print_cost and epoch % 100 == 0:
                        print("epoch = " + str(epoch) + "    epoch_cost = " + str(epoch_cost))
        
        #是否绘制图谱
        if is_Plot:
            plt.plot(np.squeeze(costs))
            plt.ylabel('cost')
            plt.xlabel('iterations (per tens)')
            plt.title("Learning rate =" + str(learning_rate))
            plt.show()
    
        #保存学习后的参数
        parameters = sess.run(parameters)
        print("参数已经保存到session。")
        
        #计算当前的预测结果
        correct_prediction = tf.equal(tf.argmax(ZL),tf.argmax(Y))
        
        #计算准确率
        accuracy = tf.reduce_mean(tf.cast(correct_prediction,"float"))
        
        print("训练集的准确率:", accuracy.eval({X: X_train, Y: Y_train}))
        print("测试集的准确率:", accuracy.eval({X: X_test, Y: Y_test}))
        
        return parameters


X_train_orig , Y_train_orig , X_test_orig , Y_test_orig , classes = tf_utils.load_dataset()

X_train_flatten = X_train_orig.reshape(X_train_orig.shape[0],-1).T #每一列就是一个样本
X_test_flatten = X_test_orig.reshape(X_test_orig.shape[0],-1).T

#归一化数据
X_train = X_train_flatten / 255
X_test = X_test_flatten / 255

#转换为独热矩阵
Y_train = np.eye(6)[Y_train_orig.reshape(-1)].T  
Y_test =  np.eye(6)[Y_test_orig.reshape(-1)].T   

start_time = time.clock()
layers_dims = [12288, 25, 12, 6] #  5-layer model
parameters = L_layer_model(X_train, Y_train, X_test,Y_test,layers_dims, learning_rate=0.0001,num_iterations = 1500,minibatch_size=32, print_cost = True,is_Plot=True)

end_time = time.clock()
print("CPU的执行时间 = " + str(end_time - start_time) + " 秒" )



参考:https://blog.csdn.net/u013733326/article/details/79971488

你可能感兴趣的:(tensorflow,人工智能,python)