模型训练和评估定义的通用代码框架

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%以上

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容