学习笔记--深度学习入门--基于Pyrhon的理论与实现--[日]斋藤康毅 -- 持续更新中

关于这本 “神作” 的简介

在这里插入图片描述
这本书上市不到 2 年,就已经印刷 10 万册了。日本人口数量不大,但是却有这么多人读过这本书,况且它不是一本写真集,是实实在在的技术书,让人觉得很不可思议。一方面说明深度学习确实是大热,另一方面也说明这本书的内容确实有能打动大家的地方。看过评论对这本书的大致印象是,好懂、压倒性好懂、好懂得可怕!说实话,机器学习我也只是刚刚起步,不过看到 “文科生也能看得懂“ 这句评论 ,直接勾起了我的兴趣 , 因为在下的智商偏低却又很喜欢学习 。好吧 , 我也来尝试一下这本被日本网友称为“神本”(即神作)的深度学习入门书 。

学习历程

第一章 Python入门

因为之前已经接触过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()

在这里插入图片描述

第二章 感知机

1、感知机的基本概念

本书以美国学者提出的感知机为基础,通过逻辑电路来阐述感知机概念。
下面是 与门 与非门 或门 异或门 这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))

仅通过改变参数就可以在 与门、与非门、或门之间切换 , 通过逻辑电路的组合实现异或门,从单层感知机演变到多层感知机 。

第三章 神经网络

按照作者的思路 , 朴素感知机即单层网络使用阶跃函数作为激活函数 , 而神经网络则是采用其他的函数作为激活函数。

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()

在这里插入图片描述

2、神经网络 – 使用非阶跃函数作为激活函数

#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()

在这里插入图片描述

3、 阶跃函数和sigmoid函数的比较

#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()

在这里插入图片描述

4、 RELU 函数

#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()

在这里插入图片描述

5、 矩阵乘法

#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))  # 会报错  ---  自己想为什么

6、 多维数组运算

#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 是必须的]

#1.6 3层神经网络的实现
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章