学习笔记--numpy包及用numpy实现神经网络前向和反向传播

学习笔记–numpy包

  1. expand_dims()函数
np.expand_dims(array,axis)#维度扩充

一维数组

a=np.array([1,2,3])
b=np.expand_dims(a,axis=0)
>>>b
[[1,2,3]]
c=np.expand_dims(a,axis=1)
>>>c
[[1],[2],[3]]

二维数组

a=np.array([[1,2,3],[4,5,6]])#a.shape=(2,3)
'''在最高维加括号,即最外层加括号'''
b=np.expand_dims(a,axis=0)#b.shape=(1,2,3)
>>>b
[[[1,2,3],[4,5,6]]]
c=np.expand_dims(a,axis=1)#c.shape=(2,1,3)
>>>c
[[[1,2,3]],[[4,5,6]]]
d=np.expand_dims(a,axis=2)#d.shape=(2,3,1)
>>>d
[[[1],[2],[3]],[[4],[5],[6]]]
  1. squeeze()函数
squeeze(a,axis=None)#从数组的形状shape中删除单维度条目,即把shape中为1的维度去掉
a=np.array([[[0,1,2,3,4,5,6,7,8,9]]])#a.shape=(1,1,10)
b=np.squeeze(a)#b.shape=(10,)
>>>b
array([0,1,2,3,4,5,6,7,8,9])
  1. numpy.ravel_multi_index()函数
    用一个唯一的一维数来定位(保存)原数组的二维(或多维(i,j,k,…))的数对的信息。
index = np.ravel_multi_index((3, 4), (7, 6))#3*6+4=22
>>>index
22
arr = np.array([[3, 6, 6], [4, 5, 1]])#[3,6,6]为横坐标,[4,5,1]为纵坐标,即(3,4),(6,5),(6,1)三个坐标对
index = np.ravel_multi_index(arr, (7, 6))
print(index)

输出

[22 41 37]
  1. np.prod()函数
    用来计算所有元素的乘积,对于有多个维度的数组可以指定轴,如axis=1指定计算每一行的乘积。
a = np.prod([1, 2])
b = np.prod([[1, 2], [3, 4]])
c = np.prod([[1, 2], [3, 4]], axis=1)
print(a)
print(b)
print(c)

输出

2
24
[ 2 12]
  1. np.unravel_index()
    获取一个/组int类型的索引值在一个多维数组中的位置。
 arr = np.array((3, 4))
 index = np.ravel_multi_index(arr, (7, 6))
 unravel_index = np.unravel_index(index, (7, 6))
 print(index)
 print(unravel_index)

输出

22
(3, 4)
  1. np.arange()函数
    返回一个有终点和起点的固定步长的排列
 	a = np.arange(9)
    b = np.arange(3,9)
    c = np.arange(0,1,0.1)
    print(a)
    print(b)
    print(c)

输出

[0 1 2 3 4 5 6 7 8]
[3 4 5 6 7 8]
[0.  0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9]

7, numpy.clip(a, a_min, a_max, out=None)[source]
将a限制在[a_min, a_max]之间

 a = np.clip(np.random.normal(0, 3), -2, 2)
 print(a)
 b = np.array([-4,-3,-2,-1,0,1,2,3])
 b = np.clip(b,-2,2)
 print(b)

输出:

-2.0
[-2 -2 -2 -1  0  1  2  2]

numpy实现神经网络前向和反向传播

import numpy as np

# N是批量大小; D_in是输入维度;
# 49/5000 H是隐藏的维度; D_out是输出维度。
N, D_in, H, D_out = 64, 1000, 100, 10

# 创建随机输入和输出数据
x = np.random.randn(N, D_in)
y = np.random.randn(N, D_out)

# 随机初始化权重
w1 = np.random.randn(D_in, H)
w2 = np.random.randn(H, D_out)

learning_rate = 1e-6
for t in range(500):
    # 前向传递:计算预测值y
    h = x.dot(w1)
    h_relu = np.maximum(h, 0)
    y_pred = h_relu.dot(w2)

    # 计算和打印损失loss
    loss = np.square(y_pred - y).sum()
    print(t, loss)

    # 反向传播,计算w1和w2对loss的梯度
    grad_y_pred = 2.0 * (y_pred - y)
    grad_w2 = h_relu.T.dot(grad_y_pred)
    grad_h_relu = grad_y_pred.dot(w2.T)
    grad_h = grad_h_relu.copy()
    grad_h[h < 0] = 0
    grad_w1 = x.T.dot(grad_h)

    # 更新权重
    w1 -= learning_rate * grad_w1
    w2 -= learning_rate * grad_w2
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值