这本书上市不到 2 年,就已经印刷 10 万册了。日本人口数量不大,但是却有这么多人读过这本书,况且它不是一本写真集,是实实在在的技术书,让人觉得很不可思议。一方面说明深度学习确实是大热,另一方面也说明这本书的内容确实有能打动大家的地方。看过评论对这本书的大致印象是,好懂、压倒性好懂、好懂得可怕!说实话,机器学习我也只是刚刚起步,不过看到 “文科生也能看得懂“ 这句评论 ,直接勾起了我的兴趣 , 因为在下的智商偏低却又很喜欢学习 。好吧 , 我也来尝试一下这本被日本网友称为“神本”(即神作)的深度学习入门书 。
因为之前已经接触过Python,细节的语句介绍就算了,毕竟Python的学习资料海了去了,所以就总结一下需要注意什么问题就好。
1、 环境配置
我安装开发环境是 Python3.6 + Pycharm ,安装过程不再赘述 , 软件安装完成后还要单独安装 numpy和matplotlib这2个模块,使用的命令是
pip install numpy
pip install matplotlib
安装之后可以通过 pip install list 看看安装的内容 , 也可以进 pycharm查看安装的模块,如下图 :
2、 可能遇到的一些问题
比如软件安装过程中可能会出现 python和pip找不到的问题 , 请见我的另一个帖子 :
https://blog.csdn.net/seven1levin/article/details/89556813
本书的代码是准确可运行的,虽然可以下载 www.ituring.com.cn/book/1921 , 但我还是手敲了一遍 ,以加深印象 , 人笨,没办法 。前期内容真的很简单,至于后面的深入学习还要拭目以待。
matplotlib 测试代码如下
import numpy as np
import matplotlib.pyplot as plt
x = np.arange(0,6,0.1)
y1 = np.sin(x)
y2 = np.cos(x)
plt.plot(x,y1,label="sin")
plt.plot(x,y2,label="cos",linestyle="--")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Sin & Cos")
plt.legend
plt.show()
本书以美国学者提出的感知机为基础,通过逻辑电路来阐述感知机概念。
下面是 与门 与非门 或门 异或门 这4种逻辑电路的代码实现 :
import numpy as np
# 测试 感知机的实现
# 1 、与门的计算
def myand(x1,x2):
w1,w2,thete = .5,.5,.7
tmp = x1*w1 + x2*w2
if tmp <= thete:
return 0
else:
return 1
print("与门 ",myand(0,1))
# 2 、 导入权重和偏置的计算
def myand1(x1,x2):
x = np.array([x1,x2])
w = np.array([0.5,0.5])
b= -0.7
tmp = np.sum(w*x)+b
if tmp <= 0:
return 0
else:
return 1
print("与门改 ",myand1(0,0))
print("与门改 ",myand1(1,0))
print("与门改 ",myand1(0,1))
print("与门改 ",myand1(1,1))
# 3、 进一步定义的 与非门
def mynand(x1,x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
print("与非门 ",mynand(0, 0))
print("与非门 ",mynand(1, 0))
print("与非门 ",mynand(0, 1))
print("与非门 ",mynand(1, 1))
# 4、 进一步定义的 或门
def myor(x1,x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.2
tmp = np.sum(w * x) + b
if tmp <= 0:
return 0
else:
return 1
print("或门 ",myor(0, 0))
print("或门 ",myor(1, 0))
print("或门 ",myor(0, 1))
print("或门 ",myor(1, 1))
# 5、通过多层感知机实现异或门
def myxor(x1,x2):
s1 = mynand(x1,x2)
s2 = myor(x1, x2)
y = myand1(s1,s2)
return y
print("异或门 ",myxor(0,0))
print("异或门 ",myxor(1,0))
print("异或门 ",myxor(0,1))
print("异或门 ",myxor(1,1))
仅通过改变参数就可以在 与门、与非门、或门之间切换 , 通过逻辑电路的组合实现异或门,从单层感知机演变到多层感知机 。
按照作者的思路 , 朴素感知机即单层网络使用阶跃函数作为激活函数 , 而神经网络则是采用其他的函数作为激活函数。
import numpy as np
#第三章 神经网络
#1、激活函数
#1.1、阶跃函数
def step_function1(x):
if x>0:
return 1
else:
return 0
print(step_function1(2))
#1.2、 可以计算数组的阶跃函数
def step_function2(x):
y=x>0
return y.astype(np.int)
print(step_function2(np.array([-6,5,8])))
#1.3、阶跃函数的图形
import matplotlib.pylab as plt
def step_function3(x):
return np.array(x>0,dtype=np.int)
x=np.arange(-5,5,0.1)
y=step_function3(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
#1.4 sigmoid函数
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.arange(-5,5,0.1)
y=sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1,1.1)
plt.show()
#1.3 函数的比较
import matplotlib.pylab as plt
def step_function3(x):
return np.array(x>0,dtype=np.int)
x=np.arange(-5,5,0.1)
y1=step_function3(x)
y2=sigmoid(x)
plt.plot(x,y1,label="step_function",linestyle="--")
plt.plot(x,y2,label="sigmoid")
plt.xlabel("x")
plt.ylabel("y")
plt.title("step_function & Sigmoid")
plt.legend
plt.ylim(-0.1,1.1)
plt.show()
#1.3 RELU函数
def relu(x):
return np.maximum(0,x)
x=np.arange(-5,5,0.1)
y=relu(x)
plt.plot(x,y)
#plt.ylim(-0.1,1.1)
plt.show()
#1.5 矩阵乘法 高效神经网络运算前置知识点
import numpy as np
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.dot(a,b))
c = np.array([[1,2,3],[4,5,6]])
d = np.array([[1,2],[3,4],[5,6]])
print(np.dot(c,d))
print(np.dot(d,c))
print(np.dot(a,d)) # 会报错 --- 自己想为什么
#1.4 多维数组的运算 高效神经网络运算前置知识点
import numpy as np
a = np.array([1,2,3,4])
print(a,end=' '); print(np.ndim(a),end=' '); print(a.shape,end=' ');print(a.shape[0],end=' ')
print()
b = np.array([[1,2],[3,4],[5,6]])
print(b,end=' '); print(np.ndim(b),end=' '); print(b.shape,end=' ');print(b.shape[0],end=' ')
#1.5 矩阵乘法 高效神经网络运算前置知识点
a = np.array([[1,2],[3,4]])
b = np.array([[5,6],[7,8]])
print(np.dot(a,b))
print()
c = np.array([[1,2,3],[4,5,6]])
d = np.array([[1,2],[3,4],[5,6]])
e = np.array([10,20])
print(np.dot(c,d))
print()
print(np.dot(d,c))
#print(np.dot(a,d)) # 会报错
print(np.ndim(d),end=" ");print(np.shape(d),end=" ")
print(np.ndim(e),end=" ");print(np.shape(e),end=" ")
print(np.dot(d,e))
f = np.array([[1,2]])
g = np.array([[1,3,5],[2,4,6]])
print(np.dot(f,g))
'''
h = np.array([[1,2],[2,2],[3,2]])
i = np.array([[1],[2]])
print(np.dot(h,i))
# 总结 : A.B * C.D === A.D [维度传递 其中 B=C 是必须的]