Tensorflow & Keras 学习笔记

2022-01-13

公司里线上都用tf,然而本torcher之前没用过tf,趁此机会学习一下。

Tensorflow教程

基本概念

  • 使用图 (graph) 来表示计算任务.
  • 在被称之为 会话 (Session) 的上下文 (context) 中执行图.
  • 使用 tensor 表示数据.
  • 通过 变量 (Variable) 维护状态.
  • 使用 feed 和 fetch 可以为任意的操作(arbitrary operation) 赋值或者从其中获取数据.
  • 图中的节点被称之为 op (operation 的缩写). 一个 op 获得 0 个或多个 Tensor.
  • session 将图的 op 分发到诸如 CPU 或 GPU 之类的 设备 上, 同时提供执行 op 的方法. 这些方法执行后, 将产生的 tensor 返回. 在 Python 语言中, 返回的 tensor 是 numpy ndarray 对象.

计算原理

  • 先创建一个静态的计算图
  • 常量用 constant,变量用 Variable(需要预先init)
  • 创建 Session 对象
    1
    2
    3
    4
    5
    6
    7
    8
    x = tf.Variable([0.5, 1.0]], name="counter")
    y = tf.constant([1.0, 1.0])

    init = tf.initialize_all_variables()
    sess = tf.Session() # 或者 with tf.Session() as sess:
    sess.run(init)
    with tf.device("/gpu:0"):
    result = sess.run([args1, args2, ..., argsN])

Session 对象在使用完后需要关闭以释放资源. 除了显式调用 close 外, 也可以使用 “with” 代码块 来自动完成关闭动作.

关于Tensor

  • Variable,代表一个可修改的张量,一般用来表示模型参数。
  • assign()用来改变某个tensor的值,tf的静态图里tensor改变值只能通过赋值的方式。
  • fetch()随着sess.run()自动执行,可以返回指定的tensor的值。
  • feed()可以临时替代图中的任意操作中的 tensor 可以对图中任何操作提交补丁, 直接插入一个 tensor. feed 使用一个 tensor 值临时替换一个操作的输出结果. 你可以提供 feed 数据作为 run() 调用的参数. feed 只在调用它的方法内有效, 方法结束, feed 就会消失. 最常见的用例是将某些特殊的操作指定为 “feed” 操作, 标记的方法是使用 tf.placeholder() 为这些操作创建占位符.
    1
    2
    3
    4
    5
    6
    7
    8
    input1 = tf.placeholder(tf.float32, [None, 784]) # 这里的None表示此张量的第一个维度可以是任何长度的
    input2 = tf.placeholder(tf.float32, [None, 784])
    output = tf.mul(input1, input2)

    with tf.Session() as sess:
    print(sess.run([output],
    feed_dict={input1:[7.], input2:[2.]}
    ))

关于模型

tf训练的过程不需要实现Forward函数,而是只需要定义静态图,然后sess.run()获取就好了。与torch最不同的地方就在于,tf的optimizer可以看作是模型的一部分,当作静态图编写的一部分就可以了,不需要像torch一样再加一个.backend()来做梯度传播,tf会自动的计算梯度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
class ExampleModel(BaseModel):
def __init__(self, config):
super(ExampleModel, self).__init__(config)
self.build_model()
self.init_saver()

def build_model(self):
self.is_training = tf.placeholder(tf.bool)

self.x = tf.placeholder(tf.float32, shape=[None] + self.config.state_size)
self.y = tf.placeholder(tf.float32, shape=[None, 10])

# network architecture
d1 = tf.layers.dense(self.x, 512, activation=tf.nn.relu, name="dense1")
d2 = tf.layers.dense(d1, 10, name="dense2")

with tf.name_scope("loss"):
self.cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=self.y, logits=d2))
update_ops = tf.get_collection(tf.GraphKeys.UPDATE_OPS)
with tf.control_dependencies(update_ops):
self.train_step = tf.train.AdamOptimizer(self.config.learning_rate).minimize(self.cross_entropy,
global_step=self.global_step_tensor)
correct_prediction = tf.equal(tf.argmax(d2, 1), tf.argmax(self.y, 1))
self.accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))


def init_saver(self):
# here you initialize the tensorflow saver that will be used in saving the checkpoints.
self.saver = tf.train.Saver(max_to_keep=self.config.max_to_keep)


class ExampleTrainer(BaseTrain):
def __init__(self, sess, model, data, config,logger):
super(ExampleTrainer, self).__init__(sess, model, data, config,logger)

def train_epoch(self):
loop = tqdm(range(self.config.num_iter_per_epoch))
losses = []
accs = []
for _ in loop:
loss, acc = self.train_step()
losses.append(loss)
accs.append(acc)
loss = np.mean(losses)
acc = np.mean(accs)

cur_it = self.model.global_step_tensor.eval(self.sess)
summaries_dict = {
'loss': loss,
'acc': acc,
}
self.logger.summarize(cur_it, summaries_dict=summaries_dict)
self.model.save(self.sess)

def train_step(self):
batch_x, batch_y = next(self.data.next_batch(self.config.batch_size))
feed_dict = {self.model.x: batch_x, self.model.y: batch_y, self.model.is_training: True}
_, loss, acc = self.sess.run([self.model.train_step, self.model.cross_entropy, self.model.accuracy],
feed_dict=feed_dict)
return loss, acc

参见模版 https://github.com/MrGemy95/Tensorflow-Project-Template

文档手册

https://www.tensorflow.org/versions/r1.15/api_docs/python/tf

Keras教程

综述

Keras的目标就是搭建模型。最主要的模型是Sequential:不同层的叠加。模型创建后可以编译,调用后端进行优化,可以指定损失函数和优化算法。
编译后的模型需要导入数据:可以一批批加入数据,也可以一次性全加入。所有的计算在这步进行。训练后的模型就可以做预测或分类了。大体上的步骤是:

  • 定义模型:创建Sequential模型,加入每一层
  • 编译模型:指定损失函数和优化算法,使用模型的compile()方法
  • 拟合数据:使用模型的fit()方法拟合数据
  • 进行预测:使用模型的evaluate() 或 predict()方法进行预测

开发

开发主要是以下的几个步骤:

  • 导入数据,利用
  • 定义模型
  • 编译模型
  • 训练模型
  • 测试模型

工具文档:https://keras.io/zh/

本文来源:「想飞的小菜鸡」的个人网站 vodkazy.cn

版权声明:本文为「想飞的小菜鸡」的原创文章,采用 BY-NC-SA 许可协议,转载请附上原文出处链接及本声明。

原文链接:https://vodkazy.cn/2022/01/13/Tensorflow & Keras 学习笔记

支付宝打赏 微信打赏

如果文章对你有帮助,欢迎点击上方按钮打赏作者,更多文章请访问想飞的小菜鸡