學習筆記--深度學習入門--基於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層神經網絡的實現
在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

在這裏插入圖片描述

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