3.Tensorflow 基本的執行流程

3. Tensorflow執行流程

  1. 數據(DataSet)
  2. 定義神經網絡結構前向傳播結果(Network structure and forward)
  3. 定義損失函數優化算法
  4. 會話(Session), 使用優化算法進行優化

3.1 數據

使用簡單的數據集,隨機生成x1, x2, 然後將x1 + x2作爲預測值,
簡單寫下Data類, 包括在train階段需要的get_train_next_batch

from numpy.random import RandomState

class Data():
    '''
        50% training data
    '''
    def __init__(self, num_data):
        self.num_data = num_data
        self.generate_train_data(num_data)

    def generate_train_data(self, num_data):
        rds = RandomState(1)
        x = rds.rand(num_data, 2)
        y = [x1 + x2 for x1, x2 in x]
        self.num_train_data = int(num_data / 2)
        self.num_test_data = num_data - self.num_train_data

        self.train_data_x = x[0: self.num_train_data, :]
        self.train_data_y = y[0: self.num_train_data]

        self.test_data_x = x[self.num_train_data: num_data, :]
        self.test_data_y = y[self.num_train_data: num_data]

    def get_train_next_batch(self, batch_size, step):
        start_index = batch_size * step % self.num_train_data
        end_index = min(start_index + batch_size, self.num_train_data)
        return self.train_data_x[start_index: end_index, :], self.train_data_y[start_index: end_index]

    def get_all_test_data(self):
        return self.test_data_x, self.test_data_y
    
    def get_all_train_data(self):
        return self.train_data_x, self.train_data_y
    
    def get_num_train_data(self):
        return self.num_train_data
    
    def get_num_test_data(self):
        return self.num_test_data

3.2 定義神經網絡結構和前向傳播結果

因爲數據集很簡單,使用單層的全連接神經網絡, 網絡結構爲
input: 2
hidden_size: 5
y: 1

def sigmoid(x):
    return 1 / (1 + tf.math.exp(-x))

g1 = tf.Graph()  #定義一個Graph
with g1.as_default():
    with tf.variable_scope('weight', reuse = tf.AUTO_REUSE):
        w1 = tf.get_variable(name='w1', shape=[FEATURE_SIZE, HIDDEN_SIZE], initializer=tf.initializers.orthogonal())
        w2 = tf.get_variable(name='w2', shape=[HIDDEN_SIZE, 1], initializer=tf.initializers.orthogonal())
        b1 = tf.get_variable(name='b1', shape=[HIDDEN_SIZE,], initializer=tf.ones())

    input = tf.placeholder(dtype=tf.float32, shape=[None, 2], name='inputs')  # 接收inputs
    y_true = tf.placeholder(dtype=tf.float32, shape=[None,], name='y_true')

    hidden_output = sigmoid(tf.matmul(input, w1) + b1)
    y_predict = tf.matmul(hidden_output, w2)
	# 定義loss
    loss = tf.math.reduce_mean(tf.math.square(y_predict - y_true))
    # 定義optimizer
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
    train_step = optimizer.minimize(loss)
    init =tf.global_variables_initializer()

4. 生成會話進行優化

with tf.Session(graph=g1) as sess:  # 指定graph
    sess.run(init)
    data = Data(NUM_TRAIN_DATA)

    for step in range(NUM_TRAIN):
        train_x, train_y = data.get_train_next_batch(BATCH_SIZE)
        _, training_loss = sess.run([train_step, loss], feed_dict={input: train_x, y_true: train_y})

        if step % 1000 == 0:
            test_x, test_y =  data.get_all_test_data()
            test_loss = sess.run(loss, feed_dict= {input: test_x, y_true: test_y})
            print('Step: {}, Test loss is {} '.format(step, test_loss))

        print('Step: {}, Training data loss is {}'.format(step, training_loss))

完整的代碼爲:

import tensorflow as tf
from numpy.random import RandomState

FEATURE_SIZE = 2
HIDDEN_SIZE = 5
NUM_TRAIN_DATA = 10000
NUM_TRAIN = 1000
BATCH_SIZE = 100

# create training data
class Data():
    '''
        50% training data
    '''
    def __init__(self, num_data):
        self.num_data = num_data
        self.generate_train_data(num_data)

    def generate_train_data(self, num_data):
        rds = RandomState(1)
        x = rds.rand(num_data, FEATURE_SIZE)
        y = [x1 + x2 for x1, x2 in x]
        self.num_train_data = int(num_data / 2)
        self.num_test_data = num_data - self.num_train_data

        self.train_data_x = x[0: self.num_train_data, :]
        self.train_data_y = y[0: self.num_train_data]

        self.test_data_x = x[self.num_train_data: num_data, :]
        self.test_data_y = y[self.num_train_data: num_data]

    def get_train_next_batch(self, batch_size, step):
        start_index = batch_size * step % self.num_train_data
        end_index = min(start_index + batch_size, self.num_train_data)
        return self.train_data_x[start_index: end_index, :], self.train_data_y[start_index: end_index]

    def get_all_test_data(self):
        return self.test_data_x, self.test_data_y

    def get_all_train_data(self):
        return self.train_data_x, self.train_data_y

    def get_num_train_data(self):
        return self.num_train_data

    def get_num_test_data(self):
        return self.num_test_data


# 2. define network structure and forward result

def sigmoid(x):
    return 1 / (1 + tf.math.exp(-x))

g1 = tf.Graph()  #定義一個Graph
with g1.as_default():
    with tf.variable_scope('weight', reuse = tf.AUTO_REUSE):
        w1 = tf.get_variable(name='w1', shape=[FEATURE_SIZE, HIDDEN_SIZE], initializer=tf.initializers.orthogonal())
        w2 = tf.get_variable(name='w2', shape=[HIDDEN_SIZE, 1], initializer=tf.initializers.orthogonal())
        b1 = tf.get_variable(name='b1', shape=[HIDDEN_SIZE,], initializer=tf.initializers.ones())

    input = tf.placeholder(dtype=tf.float32, shape=[None, 2], name='inputs')  # 接收inputs
    y_true = tf.placeholder(dtype=tf.float32, shape=[None,], name='y_true')

    hidden_output = sigmoid(tf.matmul(input, w1) + b1)
    y_predict = tf.matmul(hidden_output, w2)

    loss = tf.math.reduce_mean(tf.math.square(y_predict - y_true))
    # 定義optimizer
    optimizer = tf.train.AdamOptimizer(learning_rate=0.001)
    train_step = optimizer.minimize(loss)
    init =tf.global_variables_initializer()
# 4. Session
with tf.Session(graph=g1) as sess:
    sess.run(init)
    data = Data(NUM_TRAIN_DATA)

    for step in range(NUM_TRAIN):
        train_x, train_y = data.get_train_next_batch(BATCH_SIZE)
        _, training_loss = sess.run([train_step, loss], feed_dict={input: train_x, y_true: train_y})

        if step % 1000 == 0:
            test_x, test_y =  data.get_all_test_data()
            test_loss = sess.run(loss, feed_dict= {input: test_x, y_true: test_y})
            print('Step: {}, Test loss is {} '.format(step, test_loss))

        print('Step: {}, Training data loss is {}'.format(step, training_loss))

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章