第三章 深度学习基础

跟着《动手学深度学习》学习

3.2 线性回归的从零开始实现

书中使用的是mxnet,我参照着并用numpy自己实现。具体题目可看书中3.2章节。

import numpy as np
import matplotlib.pylab as plt

num_inputs = 2
num_examples = 1000
true_w = [2, -3.4]
true_b = 4.2

# 定义数据
features = np.random.normal(scale=1, size=(num_examples, num_inputs))
labels = true_w[0] * features[:, 0] + true_w[1] * features[:, 1] + true_b
labels += np.random.normal(scale=0.01, size=labels.shape)


# 每次返回batch_size 批量大小

def data_iter(batch_size, features, labels):
    num_examples = len(features)
    indices = list(range(num_examples))
    np.random.shuffle(indices)
    # 取批量的大小出来,不用担心越界的问题
    for i in range(0, num_examples, batch_size):
        j = np.array(indices[i:min(i + batch_size, num_examples)])
        yield features.take(j, axis=0), labels.take(j)


batch_size = 10

# 权重和偏置 的初始化
w = np.random.normal(scale=0.01, size=(num_inputs, 1))
b = np.zeros(shape=(1,))

para = np.row_stack((w, b))


# 线性回归的结果计算
def lin_reg(x, w, b):

    return np.dot(x, w) + b


# 损失函数
def squared_loss(y_hat, y):

    return 0.5 * (y_hat - y.reshape(y_hat.shape)) ** 2


# 优化算法, 批量梯度下降
def sgd(w, b, lr, batch_size, x, y):
    # 计算梯度
    predict_y = np.dot(x, w) + b

    loss = predict_y - y.reshape(predict_y.shape)

    x_Transe = x.T  # 2 * 10

    # w_grad : 2 * 1
    w_grad = x_Transe.dot(loss) / batch_size
    b_grad = np.array([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1]]).dot(loss) / batch_size

    w = w - lr * w_grad
    b = b - lr * b_grad[0, 0]

    return w, b


# 训练
lr = 0.03
num_epochs = 3
net = lin_reg
loss = squared_loss

for epoch in range(num_epochs):

    for data, label in data_iter(batch_size, features, labels):


        w, b = sgd(w, b, lr, batch_size, x=data, y=label)

    train_l = loss(net(features, w, b), labels)
    print('epoch %d, loss %f' % (epoch + 1, train_l.mean()))

print(true_w, true_b)

print()

print(w, b)


3.4 softmax回归

推荐博文
还是用numpy来写softmax + 交叉熵 的时尚数据分类问题:

难点: 求 softmax 与 交叉熵 组合的梯度。书中没有明确的讲,一个sgd函数就带了过去。

开始!

定义模型:
  • 输入层:输入784 (28 * 28) 神经元
  • 输出层:10个神经元,激活函数为softmax。
  • 损失函数: L o s s = − ∑ i n t i ∗ l o g y i Loss = - \sum_i^n{t_i * logy_i} Loss=intilogyi
定义变量与过程公式

注意1变量上一个箭头表示向量,带下表的表示一个数,而不是向量
注意2这里仅考虑向量,而不考虑是行还是列向量,实际写代码的时候需要注意向量的维度,免得向量相乘时报错。

  1. x ⃗ \vec{x} x : 表示输入数据。 x ⃗ = [ x 1 , x 2 . . . . . , x n ] \vec{x} = [x_1,x_2.....,x_n] x =[x1,x2.....,xn]

  2. w ⃗ \vec{w} w : 表示输入层 ---- 输出层之间的权重。 w ⃗ = [ w 1 , w 2 , . . . . , w n ] \vec{w} = [w_1,w_2,....,w_n] w =[w1,w2,....,wn]

  3. b ⃗ \vec{b} b : 表示输入层 ---- 输出层之间的偏置。 b ⃗ = [ b 1 , b 2 , . . . . , b n ] \vec{b} = [b_1,b_2,....,b_n] b =[b1,b2,....,bn]

  4. 经过全连接层,计算结果为:

a ⃗ = w ⃗ x ⃗ + b ⃗ a ⃗ = [ a 1 , a 2 , . . . . , a n ] a i = w i x i + b i \vec{a} = \vec{w}\vec{x}+\vec{b} \\ \vec{a} = [a_1, a_2,....,a_n] \\ a_i= w_ix_i + b_i a =w x +b a =[a1,a2,....,an]ai=wixi+bi

  1. a ⃗ \vec{a} a 经过 s o f t m a x softmax softmax激活函数后:
    y ⃗ = e a ⃗ ∑ 1 n e a k y i = e a i ∑ 1 n e a k \vec{y} = \frac{e^{\vec{a}}}{\sum_1^ne^{a_k}} \\ y_i = \frac{e^{a_i}}{\sum_1^ne^{a_k}} y =1neakea yi=1neakeai

  2. 损失函数:
    L o s s = − ∑ 1 n t ⃗ l o g y ⃗ L

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值