手写CNN时遇到的函数

参考教程:https://blog.csdn.net/u013733326/article/details/80086090

  1. 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]]]
'''
  1. 卷积的运算
    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

但还不知道为什么?有待解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值