环境:
tensorflow 1.14
python 3.5
jupyter notebook
import tensorflow as tf
import numpy as np
import tensorflow as tf
import numpy as np
使用numpy初始化数组M,注意M不会被tf识别为张量
M = np.array([[[-2],[2],[0],[3]],
[[1],[2],[-1],[2]],
[[0],[-1],[1],[0]]], dtype="float32") .reshape(1,3,4,1)
# 通过get_variable()函数创建过滤器的权重和偏置
# [2,2,1,1] 代表 [卷积核尺寸,卷积核尺寸, 当前层深度,过滤器深度]
filter_weight=tf.get_variable("weights",[2,2,1,1], initializer = tf.constant_initializer([[2, 0], [-1,1]]))
# [1]代表过滤器的深度,也是神经网络下一层的深度
biases = tf.get_variable("biase", [1], initializer=tf.constant_initializer(1))
x = tf.placeholder('float32', [1,None, None, 1])
# 通过get_variable()函数创建过滤器的权重和偏置
# [2,2,1,1] 代表 [卷积核尺寸,卷积核尺寸, 当前层深度,过滤器深度]
filter_weight=tf.get_variable("weights",[2,2,1,1], initializer = tf.constant_initializer([[2, 0], [-1,1]]))
# [1]代表过滤器的深度,也是神经网络下一层的深度
biases = tf.get_variable("biase", [1], initializer=tf.constant_initializer(1))
x = tf.placeholder('float32', [1,None, None, 1])
# 参数strides为不同维度上的步长 但由于仅在矩阵长宽上有效,所以第一个和最后一个元素固定都是1
conv = tf.nn.conv2d(x, filter_weight, strides=[1,1,1,1], padding="SAME")
add_bias = tf.nn.bias_add(conv, biases)
# max_poool() 函数实现了最大池化层的前向传播过程
pool = tf.nn.max_pool(add_bias, ksize=[1,2,2,1], strides=[1,2,2,1],padding="SAME")
M.shape
with tf.Session() as sess:
tf.global_variables_initializer().run()
M_conv = sess.run(add_bias, feed_dict={x:M})
M_pool = sess.run(pool, feed_dict={x:M})
# print(sess.run(filter_weight))
# print(sess.run(biases))
# print(M)
print(M.shape)
print("M after convolution:\n", M_conv)
print("M after poolding:\n", M_pool)
结果如下:
输入M的shape:
(1, 3, 4, 1)
M after convolution:
[[[[-2.]
[ 2.]
[ 4.]
[ 5.]]
[[ 2.]
[ 7.]
[-2.]
[ 5.]]
[[ 1.]
[-1.]
[ 3.]
[ 1.]]]]
M after poolding:
[[[[7.]
[5.]]
[[1.]
[3.]]]]