首先,本人也是刚接触机器学习和深度学习,所以可能代码不会太难。这些学习都是在学习了一些机器学习和深度学习的基础上的延伸,并且也学习了一部分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]表示经过激励函数得到的结果。
下面就是代码实现的过程:
m = 30 # 数据数
n0 = 1 # 输入层数
n1 = 5 # 隐藏层数
n2 = 1 # 输出层数
lr2 = 0.01 # 第一层的学习率
lr1 = 0.01 # 第二层的学习率
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)
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)
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
最后得到的结果: