neural network入门

导读

sigmoid
softmax
neural network training

sigmoid (logistic regression)

image.png

image.png

image.png
import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

sampleNo = 100
mu = np.array([[2, 3]])
Sigma = np.array([[1, 0.5], [1.5, 3]])
R = cholesky(Sigma)
s = np.dot(np.random.randn(sampleNo, 2), R) + mu

mu2 = np.array([[7, 6]])
t = np.dot(np.random.randn(sampleNo, 2), R) + mu2

plt.plot(s[:,0],s[:,1],'+')
plt.plot(t[:,0],t[:,1],'*')
plt.show()
image.png
#构造数据
x = np.concatenate((s, t)).T
y1 = np.zeros(100).reshape(1,100)
y2 = np.ones(100).reshape(1,100)
y = np.concatenate((y1, y2), axis=1)
#初始化参数
w = np.random.randn(2) / 2
b = np.random.randn(1)

def logistic(z):
    return 1 / (1 + np.exp(-z))

def loss(a, y):
    return -(y * np.log(a) + (1-y) * np.log(1-a))

#gradient descent训练参数
iter = 1
m = 200
alpha = 0.1
while iter < 5000:
    z = np.dot(w.T, x) + b
    a = logistic(z)
    #l = np.sum(loss(a, y)) / m
    #print(iter, l)
    dz = a - y
    dw = np.sum(np.dot(x, dz.T), axis=1) / m
    db = np.sum(dz) / m
    w = w - alpha * dw
    b = b - alpha * db
    iter += 1

#显示结果
fig = plt.figure()
ax = fig.gca(projection='3d')
ax.scatter(x[0], x[1], y)
x1_tmp = x2_tmp = np.linspace(-5, 10, 100)
x1_tmp, x2_tmp = np.meshgrid(x1_tmp, x2_tmp)
x_tmp = np.concatenate((x1_tmp.reshape(1, 10000), x2_tmp.reshape(1, 10000)))
z_tmp = np.dot(w.T, x_tmp) + b
a_tmp = logistic(z_tmp)
y_prected = a_tmp.reshape(100, 100)
ax.plot_surface(x1_tmp, x2_tmp, y_prected)
ax.view_init(elev=15,azim=-5)
ax.set_xlabel('x')
ax.set_ylabel('y')
plt.show()
image.png

softmax

image.png

image.png
import numpy as np
from numpy.linalg import cholesky
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

sampleNo = 100
mu = np.array([[2, 3]])
Sigma = np.array([[1, 0.5], [1.5, 3]])
R = cholesky(Sigma)
r = np.dot(np.random.randn(sampleNo, 2), R) + mu

mu2 = np.array([[6, 6]])
s = np.dot(np.random.randn(sampleNo, 2), R) + mu2

mu3 = np.array([[1, 6]])
t = np.dot(np.random.randn(sampleNo, 2), R) + mu3

mu4 = np.array([[9, 4]])
v = np.dot(np.random.randn(sampleNo, 2), R) + mu4

plt.plot(r[:,0],r[:,1],'+')
plt.plot(s[:,0],s[:,1],'*')
plt.plot(t[:,0],t[:,1],'.')
plt.plot(v[:,0],v[:,1],'o')
plt.show()
image.png
#构造数据
x = np.concatenate((r,s,t,v))
x = x.T
y_tmp1 = np.array([1,0,0,0]).reshape(4,1)
y_tmp2 = np.array([0,1,0,0]).reshape(4,1)
y_tmp3 = np.array([0,0,1,0]).reshape(4,1)
y_tmp4 = np.array([0,0,0,1]).reshape(4,1)
ones = np.ones(100).reshape(1, 100)
y1 = np.dot(y_tmp1, ones)
y2 = np.dot(y_tmp2, ones)
y3 = np.dot(y_tmp3, ones)
y4 = np.dot(y_tmp4, ones)
y = np.concatenate((y1, y2, y3, y4), axis=1)
#初始化参数
w = np.random.randn(8) / 8
w = w.reshape(2,4)
b = np.random.randn(4) / 4
b = b.reshape(1,4)

def softmax(z):
    z_exp = np.exp(z)
    z_sum = np.sum(z_exp, axis=0)
    return z_exp / z_sum

#gradient descent
m = 400
alpha = 0.1
iter = 1
while iter < 5000:
    z = np.dot(w.T, x) + b.T
    a = softmax(z)
    l = -np.sum(y * np.log(a)) / m
    print(l)
    dz = a - y
    dw = np.dot(x, dz.T) / m
    db = np.sum(dz.T, axis=0) / m
    w = w - alpha * dw
    b = b - alpha * db
    iter += 1

def predict(x):
    z = np.dot(w.T, x) + b.T
    a = softmax(z)
    return np.argmax(a, axis=0)

#显示结果
x1 = x2 = np.linspace(-2, 15, 100)
x1, x2 = np.meshgrid(x1, x2)
x1 = x1.reshape(1, 10000)
x2 = x2.reshape(1, 10000)
x_tmp = np.concatenate((x1, x2))
y_tmp = predict(x_tmp)
x_0 = x_tmp[:, y_tmp==0]
plt.scatter(x_0[0], x_0[1], alpha=0.1)
x_1 = x_tmp[:, y_tmp==1]
plt.scatter(x_1[0], x_1[1], alpha=0.1)
x_2 = x_tmp[:, y_tmp==2]
plt.scatter(x_2[0], x_2[1], alpha=0.1)
x_3 = x_tmp[:, y_tmp==3]
plt.scatter(x_3[0], x_3[1], alpha=0.1)

plt.plot(r[:,0],r[:,1],'+', alpha=1)
plt.plot(s[:,0],s[:,1],'*', alpha=1)
plt.plot(t[:,0],t[:,1],'.', alpha=1)
plt.plot(v[:,0],v[:,1],'o', alpha=1)
plt.show()
image.png

neural network

假设一个三层网络,输入3个节点,第一层4个节点,第二层2个节点,第三层(输出)1个节点,假设所有层的activator都是sigmoid


image.png

image.png
#构造数据
x = np.random.randn(18).reshape(3, 6)
y1 = np.ones(3).reshape(1,3)
y2 = np.zeros(3).reshape(1,3)
y = np.concatenate((y1, y2), axis=1)
#初始化参数
w1 = np.random.randn(12) / 12
w1 = w1.reshape(3,4)
b1 = np.random.randn(4).reshape(1, 4)
w2 = np.random.randn(8) / 8
w2 = w2.reshape(4,2)
b2 = np.random.randn(2).reshape(1, 2)
w3 = np.random.randn(2) / 2
w3 = w3.reshape(2,1)
b3 = np.random.randn(1).reshape(1, 1)

#gradient descent
iter = 1
m = 6
alpha = 0.1
while iter < 100:
    z1 = np.dot(w1.T, x) + b1.T
    a1 = logistic(z1)
    
    z2 = np.dot(w2.T, a1) + b2.T
    a2 = logistic(z2)
    
    z3 = np.dot(w3.T, a2) + b3.T
    a3 = logistic(z3)
        
    dz3 = a3 - y
    dw3 = np.dot(a2, dz3.T) / m
    db3 = np.sum(dz3.T, axis=0) / m
    
    dz2 = np.dot(w3, dz3) * z2 * (1 - z2)
    dw2 = np.dot(a1, dz2.T) / m
    db2 = np.sum(dz2.T, axis=0) / m
    
    dz1 = np.dot(w2, dz2) * z1 * (1 - z1)
    dw1 = np.dot(x, dz1.T) / m
    db1 = np.sum(dz1.T, axis=0) / m
    
    w3 = w3 - alpha * dw3
    b3 = b3 - alpha * db3
    w2 = w2 - alpha * dw2
    b2 = b2 - alpha * db2
    w1 = w1 - alpha * dw1
    b1 = b1 - alpha * db1
    
    iter += 1

常用的activatior及其导数:

𝑠𝑖𝑔𝑚𝑜𝑖𝑑: 𝑦=\frac 1{1+e^{-x}} , 𝑦′=𝑦(1−𝑦),值域为[0, 1],常用于二类分类

𝑡𝑎𝑛ℎ: 𝑦=\frac {e^x-e^{-x}}{e^x+e^{-x}} , 𝑦′=1−𝑦^2,sigmoid的优化版,值域为[-1, 1],常用于隐藏层,使均值为0

𝑟𝑒𝑙𝑢: y = max(0, x), y'= \begin{cases} 1& x>=0 \\ 0& else \end{cases},保留输入值,为隐藏层的默认activator

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容