参考教程:https://blog.csdn.net/u013733326/article/details/80086090
- np.pad函数
np.pad(array, pad_width, mode, **kwargs)
其中,
- array为要填充的数组;
- pad_width为要一个数组前后,上下,左右要填充的个数;
- mode为填充的方式,通常为constant,表示连续填充相同的值,也可以指定填充值:constant_values=(x, y),前面用x填充,后面用y填充(即前用x这一值填充,后用y这一值填充;上用x这一值填充,下用y这一值填充,左右同理)缺省值填充0。
arr3D = np.array([[[1, 1, 2, 2, 3, 4],
[1, 1, 2, 2, 3, 4],
[1, 1, 2, 2, 3, 4]],
[[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5],
[0, 1, 2, 3, 4, 5]],
[[1, 1, 2, 2, 3, 4],
[1, 1, 2, 2, 3, 4],
[1, 1, 2, 2, 3, 4]]])
#在arr3D数组上前后填充0层,上下各填充一行,左右各填充2行
print('constant: \n' + str(np.pad(arr3D, ((0, 0), (1, 1), (2, 2)), 'constant') ))
#在arr3D数组上前后各填充1层,填充值分别为3,2;上下各填充1行,填充值分别为3,2;左右同理
print('constant: \n' + str(np.pad(arr3D, ((1, 1), (1, 1), (2, 2)), 'constant', constant_values=(3, 2))))
'''
运行结果1
constant:
[[[0 0 0 0 0 0 0 0 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0 0 0]
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 1 2 3 4 5 0 0]
[0 0 0 0 0 0 0 0 0 0]]
[[0 0 0 0 0 0 0 0 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 1 1 2 2 3 4 0 0]
[0 0 0 0 0 0 0 0 0 0]]]
运行结果2:
constant:
[[[3 3 3 3 3 3 3 3 2 2]
[3 3 3 3 3 3 3 3 2 2]
[3 3 3 3 3 3 3 3 2 2]
[3 3 3 3 3 3 3 3 2 2]
[3 3 2 2 2 2 2 2 2 2]]
[[3 3 3 3 3 3 3 3 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 2 2 2 2 2 2 2 2]]
[[3 3 3 3 3 3 3 3 2 2]
[3 3 0 1 2 3 4 5 2 2]
[3 3 0 1 2 3 4 5 2 2]
[3 3 0 1 2 3 4 5 2 2]
[3 3 2 2 2 2 2 2 2 2]]
[[3 3 3 3 3 3 3 3 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 1 1 2 2 3 4 2 2]
[3 3 2 2 2 2 2 2 2 2]]
[[3 3 3 3 3 3 3 3 2 2]
[3 3 2 2 2 2 2 2 2 2]
[3 3 2 2 2 2 2 2 2 2]
[3 3 2 2 2 2 2 2 2 2]
[3 3 2 2 2 2 2 2 2 2]]]
'''
- 卷积的运算
5x5x3(高度为5,宽度为5,通道数为3)的图片与5个3x3x3(高为3,宽为3,通道数为3)的卷积核进行卷积后得到3x3x5的图片。
- 为什么最后会得到5个通道呢?
因为每一个卷积核会形成3x3的图片,其中每一个元素为3个通道卷积之后求和,现在有5个卷积核,所以会形成3x3x5的图片。
3.
tf.cast() 此函数是类型转换函数,将x的数据格式转化成dtype
tf.reduce_mean()主要用作降维,这里用于计算所有元素的均值,当axis=0或1时,分别返回每一列或行的均值。
eval() 其实就是tf.Tensor的Session.run() 的另外一种写法,但两者有差别
- 要注意的是,eval()只能用于tf.Tensor类对象,也就是有输出的Operation
- 对于没有输出的Operation, 可以用.run()或者Session.run();Session.run()没有这个限制。
在训练时,精确率与原博主的结果不一致,然后将W1和W2初始化为:
W1 = parameters[‘W1’]*np.sqrt(2/64) #64为第一次卷积的输入的宽高
W2 = parameters[‘W2’]*np.sqrt(2/8) #8为第二次卷积的输入的宽高
精度提升为:
corrent_prediction accuracy= Tensor("Mean_1:0", shape=(), dtype=float32)
训练集准确度:0.98425925
测试集准确度:0.85833335
但还不知道为什么?有待解决