感觉 Caffe 已经很久没有大动作了,一年一个贺岁 RC 确实没有太大意思,而且依赖太多太多,而且要不停地转化 “conf 思维” 和 “code” 思维。最关键的,没有 GPU 的我,实在无法忍受单线程来跑训练。
既然是一张白纸,那就从 TensorFlow 入手吧。
在迷迷糊糊看完了官方 Tutorial 之后更加迷茫了:怎么练习?找了好久,发现了这个小练习:__Conway‘s Game of Life __。
Conway’s Game of Life
棋盘上的每一个格子都是一个细胞。细胞有两种状态:活着(1)和死了(0)。初始状态下,这些细胞的状态是随机的。之后的每一步,这些细胞都会按照如下规则来决定它们的状态:
- 一个活细胞周围有 0-1 个活细胞,那么它会死去
- 一个活细胞周围有 2-3 个活细胞,那么它继续存活
- 一个活细胞周围有 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 进行展现,我看了好久没有看懂这个函数的 使用说明,就使用了最暴力的办法。
效果
或者 点击这里查看视频。
发表回复