用 TensorFlow 做一个小动画


发布于

|

分类

感觉 Caffe 已经很久没有大动作了,一年一个贺岁 RC 确实没有太大意思,而且依赖太多太多,而且要不停地转化 “conf 思维” 和 “code” 思维。最关键的,没有 GPU 的我,实在无法忍受单线程来跑训练。

既然是一张白纸,那就从 TensorFlow 入手吧。

在迷迷糊糊看完了官方 Tutorial 之后更加迷茫了:怎么练习?找了好久,发现了这个小练习:__Conway‘€™s Game of Life __

Conway’€™s Game of Life

棋盘上的每一个格子都是一个细胞。细胞有两种状态:活着(1)和死了(0)。初始状态下,这些细胞的状态是随机的。之后的每一步,这些细胞都会按照如下规则来决定它们的状态:

  1. 一个活细胞周围有 0-1 个活细胞,那么它会死去
  2. 一个活细胞周围有 2-3 个活细胞,那么它继续存活
  3. 一个活细胞周围有 4 个活细胞,那么它会死去。
  4. 一个死细胞周围有 3 个活细胞,那么它会复活。

下面,我们来用 TensorFlow 实现一下这个过程。

实现

首先,我们定义棋盘的大小,并说明如何初始化棋盘:

shape = (50, 50)
initial_board = tf.random_uniform(shape, minval=0, maxval=2, dtype=tf.int32)
board = tf.placeholder(tf.int32, shape=shape, name='board')

这里我们使用 board 来做棋盘。

然后,我们来实现细胞们的更新:

def update_board(X):
    N = convolve2d(X, np.ones((3, 3)), mode='same', boundary='wrap') - X
    return (N == 3) | (X & (N == 2))
board_update = tf.py_func(update_board, [board], [tf.int32])

里面的公式 (N == 3) | (X & (N == 2)) 的证明可以看 这里。我们使用一个卷积来更新所有细胞状态。tf.py_func 其实可以看做一个 lambda 函数。

最后,我们启动这个图,让细胞们 “动起来”:

with tf.Session() as session:
    X = session.run(initial_board)
    plt.imshow(X, cmap='Greys', interpolation='nearest')
    while True:
        plt.show()
        X = session.run(board_update, feed_dict={board: X})[0]
        plt.imshow(X, cmap='Greys', interpolation='nearest')

原文 里面通过使用 matplotlib.animation.FuncAnimation,可以使所有结果都通过同一个 fig 进行展现,我看了好久没有看懂这个函数的 使用说明,就使用了最暴力的办法。

效果

效果

或者 点击这里查看视频


评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注