【学习笔记】TensorFlow1.0

TensorFlow程序被组织成一个构建阶段和一个执行阶段。

  • 在构建阶段,数据和操作的执行步骤被描述成一个图。图是将计算表示为指令之间的依赖关系的一种表示法。
  • 在执行阶段,使用会话执行构造好的图中的操作。会话是跨一个或多个本地或远程设备运行数据流图的机制。
  • 数据表示为Tensor,图中的数学操作表示为节点op

基础语法

  • 默认图:默认会创建一张图,可通过tf.get_default_graph()访问,创建的Tensor、op和session都含有graph属性,默认都在一张图中。
a = tf.constant(2)
b = tf.constant(3)
c = a + b

with tf.Session() as sess:
    cv = sess.run(c)
  • 创建图:
graph = tf.Graph()
with graph.as_default():
    a = tf.constant(2)
    b = tf.constant(3)
    c = a + b

    with tf.Session(graph=graph) as sess:
        cv = sess.run(c)
  • 操作op:OPeration对象通过操作函数创建,打印时会显示对象名。每一张图使用一个命名空间。
    【学习笔记】TensorFlow1.0_第1张图片
  • 会话:tf.Session用于完整的程序中,tf.InteractiveSession用于交互式上下文中的TensorFlow。
    sess.run()用于运行operation,其中fetches参数表示数据流图中能接收的任意数据流图元素,类型为单个图元素、图元素列表或字典。如果fetches是单个图元素则返回单个值,如果fetches是列表则返回值列表,如果fetches是字典则返回具有相同键的字典。
    feed_dict给数据流图提供运行时数据,类型是将图元素映射到值的字典。需要与tf.placeholder搭配使用。
  • 张量:Tensor具有两个属性,数据类型type和形状shape
  • 变量:维护图执行过程中的状态信息。tf.Variable()创建变量,变量使用需要进行初始化
a = tf.Variable(3, name='a')
b = tf.Variable(2, name='b')
s = tf.add(a, b)
init = tf.global_variables_initializer()
with tf.Session() as sess:
    sess.run(init)
    s_value = sess.run(s)
  • 修改变量命名空间tf.variable_scope()

API

  • tf.app:为脚本提供一个main函数入口,可以定义脚本运行的flags
  • tf.image:图像处理操作,颜色变换、变形和图像的编码、解码
  • tf.gfile:文件操作函数
  • tf.summary:生成TensorBoard的统计日志
  • tf.python.io:读写TFRecords文件
  • tf.train:提供一些训练器,与tf.nn组合,实现网络的优化计算
  • tf.nn:提供构建神经网络的底层函数,包含了卷积层、池化层等
  • tf.keras:用于快速构建模型
  • tf.layers:以更高级的概念层来定义模型
  • tf.contrib:tf.contrib.layers提供封装完好的高级函数,与tf.layers功能相似
  • tf.estimator:相当于 Model + Training + Evaluate 的合体

模型保存与加载

saver = tf.train.Saver(var_list=None, max_to_keep=5)
saver.save(sess, path='./checkpoints/model.ckpt')
saver.restore(sess, path='./checkpoints/model.ckpt')

手写数字识别Softmax Regression

import os
import tensorflow.compat.v1 as tf
import tensorflow.contrib.layers as tflayer
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
tf.logging.set_verbosity(tf.logging.ERROR)

tf.app.flags.DEFINE_integer('total_epoch', 2000, 'Total Epoch of Training')
tf.app.flags.DEFINE_integer('batch_size', 128, 'Batch Size of Data')
tf.app.flags.DEFINE_integer('show_internal', 100, 'Show Result Internal')
FLAGS = tf.app.flags.FLAGS

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
mnist = read_data_sets('MNIST_data/', one_hot=True)

with tf.variable_scope('data'):
    x = tf.placeholder(tf.float32, shape=[None, 784])
    labels = tf.placeholder(tf.float32, shape=[None, 10])
with tf.variable_scope('model'):
    logit = tflayer.fully_connected(inputs=x, num_outputs=10, activation_fn=None)
with tf.variable_scope('loss_func'):
    loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logit, labels=labels, dim=-1))
with tf.variable_scope('optimizer'):
    optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)

loss_log = tf.summary.scalar('Loss', loss)

correct_prediction = tf.equal(tf.argmax(logit, 1), tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    writer = tf.summary.FileWriter('./tmp', graph=sess.graph)

    for epoch in range(FLAGS.total_epoch):
        batch_xs, batch_ys = mnist.train.next_batch(FLAGS.batch_size)
        batch_loss, _, batch_acc = sess.run([loss, optimizer, accuracy], feed_dict={x: batch_xs, labels: batch_ys})
        if epoch % FLAGS.show_internal == 0:
            print("Loss={:.3f}, Acc={:.2%}".format(batch_loss, batch_acc))

        summary = sess.run(loss_log, feed_dict={x: batch_xs, labels: batch_ys})
        writer.add_summary(summary, epoch)

    acc = sess.run(accuracy, {x: mnist.test.images, labels: mnist.test.labels})
    print("Acc={:.2%}".format(acc))

手写数字识别卷积神经网络

import os
import tensorflow.compat.v1 as tf
import tensorflow.contrib.layers as tflayer
from tensorflow.contrib.learn.python.learn.datasets.mnist import read_data_sets
tf.logging.set_verbosity(tf.logging.ERROR)

tf.app.flags.DEFINE_integer('total_epoch', 2000, 'Total Epoch of Training')
tf.app.flags.DEFINE_integer('batch_size', 128, 'Batch Size of Data')
tf.app.flags.DEFINE_integer('show_internal', 100, 'Show Result Internal')
FLAGS = tf.app.flags.FLAGS

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
mnist = read_data_sets('MNIST_data/', one_hot=True)


def prepare_data():
    with tf.variable_scope('data'):
        x_image = tf.placeholder(tf.float32, shape=[None, 28 * 28])
        x = tf.reshape(x_image, [-1, 28, 28, 1])
        labels = tf.placeholder(tf.float32, shape=[None, 10])
    return x_image, x, labels


def build_model():
    with tf.variable_scope('conv1'):
        conv1_x = tflayer.conv2d(inputs=x, num_outputs=32, kernel_size=5, stride=1,
                                 padding='SAME', activation_fn=tf.nn.relu)
        pool1_x = tflayer.max_pool2d(inputs=conv1_x, kernel_size=2, stride=2, padding='SAME')
    with tf.variable_scope('conv2'):
        conv2_x = tflayer.conv2d(inputs=pool1_x, num_outputs=64, kernel_size=5, stride=1,
                                 padding='SAME', activation_fn=tf.nn.relu)
        pool2_x = tflayer.max_pool2d(inputs=conv2_x, kernel_size=2, stride=2, padding='SAME')
    with tf.variable_scope('fc'):
        flatten_x = tf.reshape(pool2_x, shape=[-1, 7 * 7 * 64])
        f = tflayer.fully_connected(inputs=flatten_x, num_outputs=1000, activation_fn=tf.nn.relu)
        logit = tflayer.fully_connected(inputs=f, num_outputs=10, activation_fn=None)
    return logit


def build_optimizer(logit, labels):
    with tf.variable_scope('loss_func'):
        loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logit, labels=labels, dim=-1))
    with tf.variable_scope('optimizer'):
        optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.05).minimize(loss)
    return loss, optimizer


x_image, x, labels = prepare_data()
logit = build_model()
loss, optimizer = build_optimizer(logit, labels)

loss_log = tf.summary.scalar('Loss', loss)

correct_prediction = tf.equal(tf.argmax(logit, 1), tf.argmax(labels, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    writer = tf.summary.FileWriter('./tmp', graph=sess.graph)

    for epoch in range(FLAGS.total_epoch):
        batch_xs, batch_ys = mnist.train.next_batch(FLAGS.batch_size)
        batch_loss, _, batch_acc = sess.run([loss, optimizer, accuracy], feed_dict={x_image: batch_xs, labels: batch_ys})
        if epoch % FLAGS.show_internal == 0:
            print("Loss={:.3f}, Acc={:.2%}".format(batch_loss, batch_acc))

        summary = sess.run(loss_log, feed_dict={x_image: batch_xs, labels: batch_ys})
        writer.add_summary(summary, epoch)

    acc = sess.run(accuracy, {x_image: mnist.test.images, labels: mnist.test.labels})
    print("Acc={:.2%}".format(acc))

tf.feature_column.embedding_column

tf.feature_column.embedding_column(
    categorical_column, dimension, combiner='mean', initializer=None,
    ckpt_to_load_from=None, tensor_name_in_ckpt=None, max_norm=None, trainable=True,
    use_safe_embedding_lookup=True
)
  • categorical_column 由categorical_column_with_* 函数创建的CategoricalColumn。此列生成作为嵌入查找输入的稀疏 ID。
  • dimension 指定嵌入维度的整数,必须 > 0。
  • combiner 一个字符串,指定在一行中有多个条目时如何减少。目前支持’mean’、‘sqrtn’和’sum’,默认为’mean’。
  • initializer 用于嵌入变量初始化的变量初始化函数。如果未指定,则默认为 truncated_normal_initializer ,平均值为 0.0 和标准差 1/sqrt(dimension) 。
  • ckpt_to_load_from: 表示要从中恢复列权重的检查点名称/模式的字符串。如果 tensor_name_in_ckpt 不是 None 则为必需。
  • tensor_name_in_ckpt: ckpt_to_load_from 中 Tensor 的名称,从中恢复列权重。如果 ckpt_to_load_from 不是 None 则需要。
  • max_norm 如果不是 None ,则嵌入值被 l2 标准化为该值。
  • trainable 嵌入是否可训练。默认为true。
  • use_safe_embedding_lookup 如果为真,则使用 safe_embedding_lookup_sparse 而不是 embedding_lookup_sparse。 safe_embedding_lookup_sparse 确保没有空行,并且所有权重和 id 都是正数,但代价是额外的计算成本。

你可能感兴趣的:(学习记录,人工智能)