一.选择题
二,编程题
2.1 题目:
解答:https://blog.csdn.net/baidu_28312631/article/details/47418773
理解:比较核心的思路,是从底部倒推到最开始
比较巧妙,后面再进行了空间复杂度优化(即从二维数组降为一维)
#include <iostream>
#include <algorithm>
using namespace std;
#define MAX 101
int D[MAX][MAX];
int n;
int maxSum[MAX][MAX];
int main(){
int i,j;
cin >> n;
for(i=1;i<=n;i++)
for(j=1;j<=i;j++)
cin >> D[i][j];
for( int i = 1;i <= n; ++ i )
maxSum[n][i] = D[n][i];
for( int i = n-1; i>= 1; --i )
for( int j = 1; j <= i; ++j )
maxSum[i][j] = max(maxSum[i+1][j],maxSum[i+1][j+1]) + D[i][j];
cout << maxSum[1][1] << endl;
}
2.2 实现一个卷积层的forward函数,输入map的shape为[w, h, ci],卷积核shape为[k,k,ci,co], padding大小为p的zero-padding,stride为1
注意:
代码如下:
import numpy as np
def cnn_forward(layer_in, conv_filter, pad, stride=1):
"""implement forward computation of a CNN layer"""
w, h, ci = layer_in.shape
k, k, _, co = conv_filter.shape
padded_layer = np.pad(layer_in, ((pad,), (pad,), (0,)), 'constant', constant_values=(0,))
w_out = 1 + (w+2*pad-k)//stride
h_out = 1 + (h+2*pad-k)//stride
out = np.zeros((w_out, h_out, co))
# 对每个输出空间位置(i,j)和每个深度列k
for i in range(w_out):
for j in range(h_out):
layer_in_mask = padded_layer[i*stride:i*stride+k, j*stride:j*stride+k, :]
for k in range(co):
out[i, j, k] = np.sum(layer_in_mask*conv_filter[:,:,:,k])
return out
基于tensorflow
三.问答题
3.1 请写出Relu激活函数的具体表现形式,并分析激活函数相对于其他激活函数的优劣势。
线性整流函数(Rectified Linear Unit, ReLU),又称修正线性单元,是一种人工神经网络中常用的激活函数(activation function),通常指代以斜坡函数及其变种为代表的非线性函数。
优势(相比sigmoid和tanh函数)
1. 使用 ReLU 得到的SGD的收敛速度会比 sigmoid/tanh 快很多
2. 相比于 sigmoid/tanh,ReLU 只需要一个阈值就可以得到激活值,而不用去算一大堆复杂的运算。
劣势:
1. ReLU不会对数据的幅度做约束
2.存在“死点,越过0点,ReLU函数一旦关闭,参数w就得不到更新,这就是所谓的‘dying ReLU”
3.2 从以下两类最优化方法中选一类,简述其原理。
1) 梯度下降SD、随机下降SGD、批量梯度下降BGD
2) 牛顿法和拟牛顿法
1) 梯度下降SD
3.3 简述主成分分析法的主要作用,并写出其实现过程(步骤)
四、附加题