1.通用框架
#coding=utf-8
import tensorflow as tf
import numpy as np
def inference(X):
# 计算推断模型在数据X上的输出, 并将结果返回
def loss(X, Y):
# 依据训练数据X及其期望输出Y计算损失
def inputs():
# 读取或生成训练数据X及其期望输出Y
def train(total_loss):
# 依据计算的总损失训练或调整模型参数
def evaluate(sess, X, Y):
# 对训练得到的模型进行评估
saver = tf.train.Saver()
with tf.Session() as sess:
tf.initialize_all_variables().run()
X, Y = inputs()
total_loss = loss(X, Y)
train_op = train(total_loss)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess = sess, coord = coord)
training_steps = 1000
initial_step = 0
# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(os.path.dirname(__file__))
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
initial_step = int(ckpt.model_checkpoint_path.rsplit('-', 1)[1])
for step in range(initial_step, training_steps):
sess.run([train_op])
if step % 1000 == 0:
saver.save(sess, 'my-model', global_step = step)
if step % 10 == 0:
print "loss: ", sess.run([total_loss])
evaluate(sess, X, Y)
coord.request_stop()
coord.join(threads)
saver.save(sess, 'my-model', global_step = training_steps)
sess.close()
2.线性模型预测脂肪含量例子
#coding=utf-8
import tensorflow as tf
import numpy as np
import os
W = tf.Variable(tf.zeros([2, 1]), name = "weights")
b = tf.Variable(0., name = 'bias')
def inference(X):
# 计算推断模型在数据X上的输出, 并将结果返回
return tf.matmul(X, W) + b
def loss(X, Y):
# 依据训练数据X及其期望输出Y计算损失
Y_predicted = inference(X)
return tf.reduce_sum(tf.squared_difference(Y, Y_predicted))
def inputs():
# 读取或生成训练数据X及其期望输出Y
weight_age = [[84, 46], [73, 20], [65, 52], [70, 30], [76, 57], [69, 25], [63, 28], [72, 36], [79, 57], [75, 44], [27, 24], [89, 31], [65, 52], [57, 23], [59, 60], [69, 48], [60, 34], [79, 51], [75, 50], [82, 34], [59, 46], [67, 23], [85, 37], [55, 40], [63, 30]]
blood_fat_content = [354, 190, 405, 263, 451, 302, 288, 385, 402, 365, 209, 346, 254, 395, 434, 220, 374, 308, 220, 311, 181, 274, 303, 244]
return tf.to_float(weight_age),tf.to_float(blood_fat_content)
def train(total_loss):
# 依据计算的总损失训练或调整模型参数
# 利用梯度下降算法
learning_rate = 0.0000001
return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)
def evaluate(sess, X, Y):
# 对训练得到的模型进行评估
print sess.run(inference([[80., 25.]]))
print sess.run(inference([[65., 25.]]))
saver = tf.train.Saver()
with tf.Session() as sess:
tf.initialize_all_variables().run()
X, Y = inputs()
total_loss = loss(X, Y)
train_op = train(total_loss)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess = sess, coord = coord)
training_steps = 1000
initial_step = 0
# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(os.path.dirname(__file__))
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
initial_step = int(ckpt.model_checkpoint_path.rsplit('-', 1)[1])
for step in range(initial_step, training_steps):
sess.run([train_op])
if step % 1000 == 0:
saver.save(sess, 'my-model', global_step = step)
if step % 10 == 0:
print "loss: ", sess.run([total_loss])
evaluate(sess, X, Y)
coord.request_stop()
coord.join(threads)
saver.save(sess, 'my-model', global_step = training_steps)
sess.close()
结果
loss: [8231812.0]
loss: [5282251.0]
loss: [5279605.0]
loss: [5277579.0]
loss: [5276021.0]
loss: [5274815.0]
loss: [5273876.5]
loss: [5273140.0]
loss: [5272556.0]
loss: [5272088.5]
loss: [5271707.0]
loss: [5271392.0]
loss: [5271125.5]
loss: [5270898.0]
loss: [5270697.5]
loss: [5270519.0]
loss: [5270358.0]
loss: [5270207.0]
loss: [5270066.5]
loss: [5269934.0]
loss: [5269806.0]
loss: [5269681.5]
loss: [5269560.0]
loss: [5269442.0]
loss: [5269323.0]
loss: [5269208.0]
loss: [5269093.0]
loss: [5268979.0]
loss: [5268864.5]
loss: [5268752.5]
loss: [5268639.0]
loss: [5268528.5]
loss: [5268415.0]
loss: [5268302.0]
loss: [5268191.0]
loss: [5268077.5]
loss: [5267967.0]
loss: [5267855.0]
loss: [5267742.0]
loss: [5267630.5]
loss: [5267518.5]
loss: [5267408.0]
loss: [5267295.5]
loss: [5267184.0]
loss: [5267072.0]
loss: [5266960.0]
loss: [5266848.5]
loss: [5266736.5]
loss: [5266626.0]
loss: [5266513.0]
loss: [5266401.5]
loss: [5266290.0]
loss: [5266179.5]
loss: [5266068.0]
loss: [5265955.0]
loss: [5265844.0]
loss: [5265734.0]
loss: [5265620.0]
loss: [5265510.0]
loss: [5265399.0]
loss: [5265286.0]
loss: [5265175.0]
loss: [5265063.5]
loss: [5264952.0]
loss: [5264839.0]
loss: [5264728.0]
loss: [5264616.5]
loss: [5264506.0]
loss: [5264393.5]
loss: [5264282.5]
loss: [5264171.0]
loss: [5264059.0]
loss: [5263947.5]
loss: [5263836.0]
loss: [5263725.0]
loss: [5263614.0]
loss: [5263502.0]
loss: [5263391.0]
loss: [5263280.0]
loss: [5263167.0]
loss: [5263056.0]
loss: [5262945.0]
loss: [5262834.5]
loss: [5262723.0]
loss: [5262611.0]
loss: [5262498.0]
loss: [5262387.5]
loss: [5262277.0]
loss: [5262166.0]
loss: [5262053.5]
loss: [5261942.0]
loss: [5261831.0]
loss: [5261720.0]
loss: [5261608.0]
loss: [5261498.0]
loss: [5261386.0]
loss: [5261275.0]
loss: [5261163.0]
loss: [5261051.5]
loss: [5260941.5]
[[ 321.54196167]]
[[ 268.51974487]]
3.对数几率回归预测铁达尼生存正确预测概率
#coding=utf-8
import tensorflow as tf
import numpy as np
import os
W = tf.Variable(tf.zeros([5, 1]), name = "weights")
b = tf.Variable(0., name = 'bias')
def combine_inputs(X):
return tf.matmul(X, W) + b
def inference(X):
# 计算推断模型在数据X上的输出, 并将结果返回
return tf.sigmoid(combine_inputs(X))
def loss(X, Y):
# 依据训练数据X及其期望输出Y计算损失
return tf.reduce_mean(tf.nn.sigmoid_cross_entropy_with_logits(combine_inputs(X),Y))
def read_csv(batch_size, file_name, record_defaults):
filename_queue = tf.train.string_input_producer([os.path.dirname(__file__) + "/" + file_name])
reader = tf.TextLineReader(skip_header_lines = 1)
key, value = reader.read(filename_queue)
# decode_csv会将字符串转换到具有默认值的由张量列构成的元组中
decoded = tf.decode_csv(value, record_defaults = record_defaults)
return tf.train.shuffle_batch(decoded, batch_size = batch_size, capacity = batch_size * 50, min_after_dequeue = batch_size)
def inputs():
# 读取或生成训练数据X及其期望输出Y
passenger_id, survived, pclass, name, sex, age, sibsp, parch, ticket, fare, cabin, embarked = read_csv(100, "train.csv", [[0.0], [0.0], [0], [""], [""], [0.0], [0.0], [0.0], [""], [0.0], [""], [""]])
# 转换属性数据
is_first_class = tf.to_float(tf.equal(pclass, [1]))
is_second_class = tf.to_float(tf.equal(pclass, [2]))
is_third_class = tf.to_float(tf.equal(pclass, [3]))
gender = tf.to_float(tf.equal(sex, ["female"]))
features = tf.transpose(tf.pack([is_first_class, is_second_class, is_third_class, gender, age]))
survived = tf.reshape(survived, [100, 1])
return features, survived
def train(total_loss):
# 依据计算的总损失训练或调整模型参数
# 利用梯度下降算法
learning_rate = 0.01
return tf.train.GradientDescentOptimizer(learning_rate).minimize(total_loss)
def evaluate(sess, X, Y):
# 对训练得到的模型进行评估
predicted = tf.cast(inference(X) > 0.5, tf.float32)
print sess.run(tf.reduce_mean(tf.cast(tf.equal(predicted, Y), tf.float32)))
saver = tf.train.Saver()
with tf.Session() as sess:
tf.initialize_all_variables().run()
X, Y = inputs()
total_loss = loss(X, Y)
train_op = train(total_loss)
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess = sess, coord = coord)
training_steps = 1000
initial_step = 0
# 验证之前是否已经保存了检查点文件
ckpt = tf.train.get_checkpoint_state(os.path.dirname(__file__))
if ckpt and ckpt.model_checkpoint_path:
saver.restore(sess, ckpt.model_checkpoint_path)
initial_step = int(ckpt.model_checkpoint_path.rsplit('-', 1)[1])
for step in range(initial_step, training_steps):
sess.run([train_op])
if step % 1000 == 0:
saver.save(sess, 'my-model', global_step = step)
if step % 10 == 0:
print "loss: ", sess.run([total_loss])
evaluate(sess, X, Y)
coord.request_stop()
coord.join(threads)
saver.save(sess, 'my-model', global_step = training_steps)
sess.close()
结果
0.82
在80%以上