From b0303a72e4d59faf3ff7b43c14cc738a06fb52d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 19:57:13 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E6=96=B0=E5=BB=BA=2017307110367?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/17307110367/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/17307110367/.keep diff --git a/assignment-2/submission/17307110367/.keep b/assignment-2/submission/17307110367/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From 45ad7cb8df16a9b3cf6817929e5db0b34b40c19a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 19:58:02 +0800 Subject: [PATCH 2/7] =?UTF-8?q?=E6=96=B0=E5=BB=BA=20img?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assignment-2/submission/17307110367/img/.keep | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/17307110367/img/.keep diff --git a/assignment-2/submission/17307110367/img/.keep b/assignment-2/submission/17307110367/img/.keep new file mode 100644 index 0000000..e69de29 -- Gitee From ecdd2fb2ce9ff0a77ed03501f92b9f1ad57f14b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 19:59:29 +0800 Subject: [PATCH 3/7] !1 [submission] assignment-2 of 17307110367 --- .../submission/17307110367/img/loss_value1.png | Bin 0 -> 25210 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 assignment-2/submission/17307110367/img/loss_value1.png diff --git a/assignment-2/submission/17307110367/img/loss_value1.png b/assignment-2/submission/17307110367/img/loss_value1.png new file mode 100644 index 0000000000000000000000000000000000000000..dbb3c56e9d1036c37ea3aa3258a7ae0acd9eb79b GIT binary patch literal 25210 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 SkqR|3kD(s&Y~g9g+y4eh*pHzA literal 0 HcmV?d00001 -- Gitee From dd3f886ed06629a0891e4c9dab86b3c0d75c9c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 23:36:48 +0800 Subject: [PATCH 4/7] !1 [submission] assignment-2 of 17307110367 --- .../submission/17307110367/homework2.md | 186 ++++++++++++++++++ 1 file changed, 186 insertions(+) create mode 100644 assignment-2/submission/17307110367/homework2.md diff --git a/assignment-2/submission/17307110367/homework2.md b/assignment-2/submission/17307110367/homework2.md new file mode 100644 index 0000000..cbd41bb --- /dev/null +++ b/assignment-2/submission/17307110367/homework2.md @@ -0,0 +1,186 @@ +# 课程报告 + +## 模型的训练与测试 + +直接运行numpy_minist.py,设定batch_size =128, learning_rate = 0.1, epoch_number = 3得到如下的结果: + +| 轮次 | Accuracy | +| ---- | -------- | +| [0] | 0.9474 | +| [1] | 0.9654 | +| [2] | 0.9704 | + +得到的损失函数的变化如下图所示: + +![avatar](https://gitee.com/zhang-yanlin17/prml-21-spring/blob/master/assignment-2/submission/17307110367/img/loss_value1.png) + +**减小batch_size的值为 64**,保持其他的参数不变进行实验,得到结果如下: + +| 轮次 | Accuracy | +| ---- | -------- | +| [0] | 0.9548 | +| [1] | 0.9682 | +| [2] | 0.9679 | + +可见当batch_size 减小时,模型准确率在每一轮中进步的幅度会变小。 + + + +## mini_batch 的替换 + +``` +def mini_batch(dataset, batch_size=128,seed=0): + np.random.seed(seed) + x_train = dataset.train_data + y_train = dataset.train_labels + m = y_train.shape[0] + def mini_batch(dataset, batch_size=128,seed=0): + np.random.seed(seed) + x_train = dataset.train_data + y_train = dataset.train_labels + m = y_train.shape[0] + # m为所有样本的数量 + mini_batchs =[] + permutation = list(np.random.permutation(m)) + # 打乱样本顺序 + shuffle_X = x_train[permutation, :, :] + shuffle_Y = y_train[permutation] + num_mini_batch = int(m//batch_size) + # num_mini_batch为mini_batch的块数 + for i in range(num_mini_batch): + mini_batch_x = shuffle_X[i*batch_size:(i+1)*batch_size, :, :] + mini_batch_y = shuffle_Y[i*batch_size:(i+1)*batch_size] + mini_batch = (mini_batch_x, mini_batch_y) + mini_batchs.append(mini_batch) + if m % batch_size != 0: + # 如果样本数不能被整除,取余下的部分 + mini_batch_X = shuffle_X[num_mini_batch * batch_size:m, :, :] + mini_batch_Y = shuffle_Y[num_mini_batch * batch_size:m] + mini_batch = (mini_batch_X, mini_batch_Y) + mini_batchs.append(mini_batch) + return mini_batchs + mini_batchs =[] + permutation = list(np.random.permutation(m)) + shuffle_X = x_train[permutation, :, :] + shuffle_Y = y_train[permutation] + num_mini_batch = int(m//batch_size) + for i in range(num_mini_batch): + mini_batch_x = shuffle_X[i*batch_size:(i+1)*batch_size, :, :] + mini_batch_y = shuffle_Y[i*batch_size:(i+1)*batch_size] + mini_batch = (mini_batch_x, mini_batch_y) + mini_batchs.append(mini_batch) + if m % batch_size != 0: + # 如果样本数不能被整除,取余下的部分 + mini_batch_X = shuffle_X[num_mini_batch * batch_size:m, :, :] + mini_batch_Y = shuffle_Y[num_mini_batch * batch_size:m] + mini_batch = (mini_batch_X, mini_batch_Y) + mini_batchs.append(mini_batch) + return mini_batchs +``` + +整体思路是打乱样本的顺序,然后依次取出batch_size个样本的数据,作为一个mini_batch组。最后mini_batch函数返回所有的mini_batch组的集合 + +用numpy实现mini_batch之后,运行numpy_minist.py, 设定batch_size =128, learning_rate = 0.1, epoch_number = 3, 得到的实验结果如下: + +| 轮次 | Accuracy | +| ---- | -------- | +| [0] | 0.8780 | +| [1] | 0.8994 | +| [2] | 0.9099 | + + + +## 反向传播公式的推导 + +**Matmul** + +Matmul的计算式为 +$$ +Y = X*W +$$ +根据矩阵的求导法则,可以推出 +$$ +\frac{\partial Y}{\partial X} = W^{T} +$$ + +$$ +\frac{\partial Y}{\partial W} = X^{T} +$$ + + 对应代码段如下: + +``` +grad_W = np.matmul(self.memory['x'].T, grad_y) +grad_x = np.matmul(grad_y, self.memory['W'].T) +``` + + + +**Relu** + +Relu的计算公式为 +$$ +Y=\begin{cases} +X&X\ge0\\\\ +0&\text{otherwise} +\end{cases} +$$ +所以有 +$$ +\frac{\partial Y}{\partial X}=\begin{cases} +1&X>0\\\\ +0&\text{otherwise} +\end{cases} +$$ +对应代码块如下: + +``` +grad_x = np.where(self.memory['x'] > 0, grad_y, np.zeros_like(self.memory['x'])) +``` + +意思是说若x大于0, grad_x的结果就是传入的grad_y。否则结果为0 + + + +**Log** + +log的计算公式为 +$$ +Y=\ln(X+\epsilon) +$$ +因此有 +$$ +\frac{\partial Y}{\partial X} = \frac1{X+\epsilon} +$$ +对应的代码块如下: + +``` +grad_x = np.multiply(1./(self.memory['x'] + self.epsilon), grad_y) +``` + + + +**Softmax** + +Softmax的计算公式为 +$$ +Y=\frac{\exp\{X\}}{\sum_{k=1}^c\exp\{X\}} +$$ +根据邱老师书第411~412页对该公式的导数的推导(在这里直接引用结果),有 + + +$$ +\frac{\partial Y}{\partial X} = diag(softmax(x))-softmax(x)softmax(x)^{T} +$$ +对应的代码块如下 + +``` +out = self.memory['out'] +grad_x = [] +for idx in range(out.shape[0]): + dout = np.diag(out[idx]) - np.outer(out[idx], out[idx]) + grad = np.matmul(dout, grad_y[idx]) + grad_x.append(grad) +grad_x = np.array(grad_x) +``` + -- Gitee From 2b54ae73fd17235e0e0a945986c9747dab266174 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 23:40:39 +0800 Subject: [PATCH 5/7] update assignment-2/submission/17307110367/homework2.md. --- assignment-2/submission/17307110367/homework2.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/assignment-2/submission/17307110367/homework2.md b/assignment-2/submission/17307110367/homework2.md index cbd41bb..9b99779 100644 --- a/assignment-2/submission/17307110367/homework2.md +++ b/assignment-2/submission/17307110367/homework2.md @@ -12,7 +12,7 @@ 得到的损失函数的变化如下图所示: -![avatar](https://gitee.com/zhang-yanlin17/prml-21-spring/blob/master/assignment-2/submission/17307110367/img/loss_value1.png) +loss **减小batch_size的值为 64**,保持其他的参数不变进行实验,得到结果如下: -- Gitee From 2730466eb45790e1746dac5879173e8b3e9158eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 23:41:30 +0800 Subject: [PATCH 6/7] !1 [submission] assignment-2 of 17307110367 --- .../submission/17307110367/numpy_fnn.py | 173 ++++++++++++++++++ .../submission/17307110367/numpy_mnist.py | 62 +++++++ 2 files changed, 235 insertions(+) create mode 100644 assignment-2/submission/17307110367/numpy_fnn.py create mode 100644 assignment-2/submission/17307110367/numpy_mnist.py diff --git a/assignment-2/submission/17307110367/numpy_fnn.py b/assignment-2/submission/17307110367/numpy_fnn.py new file mode 100644 index 0000000..ea2d68f --- /dev/null +++ b/assignment-2/submission/17307110367/numpy_fnn.py @@ -0,0 +1,173 @@ +import numpy as np + + +class NumpyOp: + + def __init__(self): + self.memory = {} + self.epsilon = 1e-12 + + +class Matmul(NumpyOp): + + def forward(self, x, W): + """ + x: shape(N, d) + w: shape(d, d') + """ + self.memory['x'] = x + self.memory['W'] = W + h = np.matmul(x, W) + return h + + def backward(self, grad_y): + """ + grad_y: shape(N, d') + """ + grad_W = np.matmul(self.memory['x'].T, grad_y) + grad_x = np.matmul(grad_y, self.memory['W'].T) + + return grad_x, grad_W + + +class Relu(NumpyOp): + + def forward(self, x): + self.memory['x'] = x + return np.where(x > 0, x, np.zeros_like(x)) + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + grad_x = np.where(self.memory['x'] > 0, grad_y, np.zeros_like(self.memory['x'])) + + return grad_x + + +class Log(NumpyOp): + + def forward(self, x): + """ + x: shape(N, c) + """ + + out = np.log(x + self.epsilon) + self.memory['x'] = x + + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + grad_x = np.multiply(1./(self.memory['x'] + self.epsilon), grad_y) + + return grad_x + + +class Softmax(NumpyOp): + """ + softmax over last dimension + """ + + def forward(self, x): + """ + x: shape(N, c) + """ + out = [] + for index in range(x.shape[0]): + temp = x[index] + temp = temp - max(temp) + temp = np.exp(temp) + out.append(temp/sum(temp)) + out = np.array(out) + self.memory['out'] = out + return out + + def backward(self, grad_y): + """ + grad_y: same shape as x + """ + + out = self.memory['out'] + grad_x = [] + for idx in range(out.shape[0]): + dout = np.diag(out[idx]) - np.outer(out[idx], out[idx]) + grad = np.matmul(dout, grad_y[idx]) + grad_x.append(grad) + grad_x = np.array(grad_x) + + return grad_x + + +class NumpyLoss: + + def __init__(self): + self.target = None + + def get_loss(self, pred, target): + self.target = target + return (-pred * target).sum(axis=1).mean() + + def backward(self): + return -self.target / self.target.shape[0] + + +class NumpyModel: + def __init__(self): + self.W1 = np.random.normal(size=(28 * 28, 256)) + self.W2 = np.random.normal(size=(256, 64)) + self.W3 = np.random.normal(size=(64, 10)) + + # 以下算子会在 forward 和 backward 中使用 + self.matmul_1 = Matmul() + self.relu_1 = Relu() + self.matmul_2 = Matmul() + self.relu_2 = Relu() + self.matmul_3 = Matmul() + self.softmax = Softmax() + self.log = Log() + + # 以下变量需要在 backward 中更新。 softmax_grad, log_grad 等为算子反向传播的梯度( loss 关于算子输入的偏导) + self.x1_grad, self.W1_grad = None, None + self.relu_1_grad = None + self.x2_grad, self.W2_grad = None, None + self.relu_2_grad = None + self.x3_grad, self.W3_grad = None, None + self.softmax_grad = None + self.log_grad = None + + def forward(self, x): + x = x.reshape(-1, 28 * 28) + + x = x.reshape(-1, 28 * 28) + x = self.relu_1.forward(self.matmul_1.forward(x, self.W1)) + x = self.relu_2.forward(self.matmul_2.forward(x, self.W2)) + x = self.matmul_3.forward(x, self.W3) + x = self.softmax.forward(x) + x = self.log.forward(x) + return x + + def backward(self, y): + self.log_grad = self.log.backward(y) + grad_y = self.log_grad + self.softmax_grad = self.softmax.backward(grad_y) + grad_y = self.softmax_grad + self.x3_grad, self.W3_grad = self.matmul_3.backward(grad_y) + grad_y = self.x3_grad + self.relu_2_grad =self.relu_2.backward(grad_y) + grad_y = self.relu_2_grad + self.x2_grad, self.W2_grad =self.matmul_2.backward(grad_y) + grad_y = self.x2_grad + self.relu_1_grad = self.relu_1.backward(grad_y) + grad_y = self.relu_1_grad + self.x1_grad, self.W1_grad = self.matmul_1.backward(grad_y) + pass + + def optimize(self, learning_rate): + self.W1 -= learning_rate * self.W1_grad + self.W2 -= learning_rate * self.W2_grad + self.W3 -= learning_rate * self.W3_grad diff --git a/assignment-2/submission/17307110367/numpy_mnist.py b/assignment-2/submission/17307110367/numpy_mnist.py new file mode 100644 index 0000000..daea871 --- /dev/null +++ b/assignment-2/submission/17307110367/numpy_mnist.py @@ -0,0 +1,62 @@ +import numpy as np +from numpy_fnn import NumpyModel, NumpyLoss +from utils import download_mnist, batch, get_torch_initialization, plot_curve, one_hot + +def mini_batch(dataset, batch_size=128,seed=0): + np.random.seed(seed) + x_train = dataset.train_data + y_train = dataset.train_labels + m = y_train.shape[0] + # m为所有样本的数量 + mini_batchs =[] + permutation = list(np.random.permutation(m)) + # 打乱样本顺序 + shuffle_X = x_train[permutation, :, :] + shuffle_Y = y_train[permutation] + num_mini_batch = int(m//batch_size) + # num_mini_batch为mini_batch的块数 + for i in range(num_mini_batch): + mini_batch_x = shuffle_X[i*batch_size:(i+1)*batch_size, :, :] + mini_batch_y = shuffle_Y[i*batch_size:(i+1)*batch_size] + mini_batch = (mini_batch_x, mini_batch_y) + mini_batchs.append(mini_batch) + if m % batch_size != 0: + # 如果样本数不能被整除,取余下的部分 + mini_batch_X = shuffle_X[num_mini_batch * batch_size:m, :, :] + mini_batch_Y = shuffle_Y[num_mini_batch * batch_size:m] + mini_batch = (mini_batch_X, mini_batch_Y) + mini_batchs.append(mini_batch) + return mini_batchs + +def numpy_run(): + train_dataset, test_dataset = download_mnist() + model = NumpyModel() + numpy_loss = NumpyLoss() + model.W1, model.W2, model.W3 = get_torch_initialization() + + train_loss = [] + + epoch_number = 3 + learning_rate = 0.1 + + for epoch in range(epoch_number): + for x, y in mini_batch(train_dataset): + y = one_hot(y) + y_pred = model.forward(x.numpy()/255) + #y_pred = model.forward(x.numpy()) + loss = numpy_loss.get_loss(y_pred, y) + + model.backward(numpy_loss.backward()) + model.optimize(learning_rate) + + train_loss.append(loss.item()) + + x, y = batch(test_dataset)[0] + accuracy = np.mean((model.forward(x).argmax(axis=1) == y)) + print('[{}] Accuracy: {:.4f}'.format(epoch, accuracy)) + + plot_curve(train_loss) + + +if __name__ == "__main__": + numpy_run() -- Gitee From 336716df5e62e9f86cebb575bf83c697f77af6f2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BC=A0=E8=89=B3=E7=90=B3?= <17307110367@fudan.edu.cn> Date: Wed, 28 Apr 2021 23:42:37 +0800 Subject: [PATCH 7/7] rename to assignment-2/submission/17307110367/README.md. --- assignment-2/submission/17307110367/{homework2.md => README.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename assignment-2/submission/17307110367/{homework2.md => README.md} (100%) diff --git a/assignment-2/submission/17307110367/homework2.md b/assignment-2/submission/17307110367/README.md similarity index 100% rename from assignment-2/submission/17307110367/homework2.md rename to assignment-2/submission/17307110367/README.md -- Gitee