3. Tensorflow執行流程
- 數據(DataSet)
- 定義神經網絡結構和前向傳播結果(Network structure and forward)
- 定義損失函數及優化算法
- 會話(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))