学习记录(1):机器学习使用numpy矩阵进行梯度下降进行曲线拟合

首先,本人也是刚接触机器学习和深度学习,所以可能代码不会太难。这些学习都是在学习了一些机器学习和深度学习的基础上的延伸,并且也学习了一部分pytorch的基础上,以下为相关链接:

吴恩达机器学习   吴恩达深度学习     莫烦pytorch学习

下面代码均上传到github上,链接如下:deep_learning_cnn_target_detection

接下来就是机器学习的梯度下降与矩阵的实现现实,使用Goodnotes记录下的推导过程:

在图片的右端,输入层是3个节点,隐藏层是4个节点,输出层是1个节点,W表示的是系数矩阵,b表示参数矩阵,z表示之间参数矩阵,a表示z进过激励函数得到的值,x表示输入的数据3*m,w[1]表示输入到隐藏层的系数矩阵4*3, b[1]参数矩阵4*m(行值相等), z[1]得到的数据矩阵4*m, a[1]通过激励函数后得到的矩阵4*m, w[2]表示隐藏层到输出层的矩阵4*m, b[2]参数矩阵1*m, z[2]表示得到的输出矩阵1*m, a[2]表示经过激励函数得到的结果。 

下面就是代码实现的过程:

1.设置超参数

m = 30  # 数据数
n0 = 1  # 输入层数
n1 = 5  # 隐藏层数
n2 = 1  # 输出层数
lr2 = 0.01  # 第一层的学习率
lr1 = 0.01  # 第二层的学习率

 2.设置假数据(训练数据):

x_t = np.linspace(-5, 5, m).reshape(m, 1)  # (7, 1)
y_t = np.exp(x_t) + 0.01*np.random.random(m).reshape(m, 1)  # (7, 1)

3.建立参数矩阵:

w1_t = np.random.randn(n1, n0) * 0.01  # (4, 1)
b1_t = np.random.randn(n1, 1)  # (4, 1)
w2_t = np.random.randn(n2, n1) * 0.01  # (1, 4)
b2_t = np.random.randn(1, 1)  # (1, 1)
x_test = np.linspace(-4, 4, 100)

4.训练和测试网络:

def get_y_hat(x, w1, b1, w2, b2):
    z1 = np.dot(w1, x.T) + b1  # (4, 7)
    a1 = 1 / (1 + np.exp(-z1))  # (4, 7)
    z2 = np.dot(w2, a1) + b2  # (1, 7)
    a2 = 1 / (1 + np.exp(-z2))  # (1, 7)
    return a2*100, a1


def train(x, y, w1, b1, w2, b2):
    for i in range(300):
        a2, a1 = get_y_hat(x, w1, b1, w2, b2)
        j = np.sum((a2 - y.T) ** 2)/m  # (1, 1)
        print(j)
        dz2 = a2 - y.T  # (1, 7)
        dw2 = np.dot(dz2, a1.T) / m  # (1, 4)
        db2 = np.sum(dz2) / m  # (1, 1)
        da1 = np.dot(w2.T, dz2)
        dz1 = da1 * a1 * (1 - a1)
        dw1 = np.dot(dz1, x) / m
        db1 = np.sum(dz1) / m
        w2 = w2 - lr2 * dw2
        b2 = b2 - lr2 * db2
        w1 = w1 - lr1 * dw1
        b1 = b1 - lr1 * db1
        plt.cla()
        temp, y_test = get_y_hat(x_test.reshape(100, 1), w1, b1, w2, b2)
        plt.plot(x_t, y_t)
        plt.plot(x_test, temp.reshape(100, 1), color='red')
        plt.pause(0.1)

完整代码详见github,中的deep_learning.py

最后得到的结果:

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值