使用TensorFlow求卷积和池化:
import tensorflow as tf
import numpy as np
M = np.array([
[[1],[-1],[0]],
[[-1],[2],[1]],
[[0],[2],[-2]]
])
print ("Matrix shape is: ",M.shape)
filter_weight = tf.get_variable('weights', [2, 2, 1, 1], initializer = tf.constant_initializer([ [1, -1],
[0, 2]]))
biases = tf.get_variable('biases', [1], initializer = tf.constant_initializer(1))
M = np.asarray(M, dtype='float32')
M = M.reshape(1, 3, 3, 1)
print("Reshaped M: \n", M)
x = tf.placeholder('float32', [1, None, None, 1])
# 在3x3的M的右边和下面补零,卷积窗口每次移动两个单位。得到的conv为2x2的矩阵,再转成高维矩阵--[1, 2, 2, 1]
conv = tf.nn.conv2d(x, filter_weight, strides = [1, 2, 2, 1], padding = 'SAME')
# 将卷积求得的值加上偏置就为所求值
bias = tf.nn.bias_add(conv, biases)
# 在3x3的M的右边和下面不补零,卷积窗口从左上角每次移动两个单位,遇到数据不足时,只取当前数据。
# 得到的pool为2x2的矩阵,再转成高维矩阵--[1, 2, 2, 1]
pool = tf.nn.avg_pool(x, ksize=[1, 2, 2, 1], strides=[1, 2, 2, 1], padding='SAME')
with tf.Session() as sess:
tf.global_variables_initializer().run()
convoluted_M = sess.run(bias,feed_dict={x:M})
pooled_M = sess.run(pool,feed_dict={x:M})
print ("convoluted_M: \n", convoluted_M.reshape(2, 2))
print ("pooled_M: \n", pooled_M.reshape(2, 2))
输出结果如下: