1 矩阵、向量
在之前我们都是将每个元素做运算,这样做看着费时费力,现在我们从万物皆向量的角度重新看待这个问题,用向量的运算去表示线性函数。
现在我们使用代码来实现以上过程:
之前的代码:
import numpy as np
import dataset
import plot_utils
m = 100
xs, ys = dataset.get_beans(m)
print(xs)
print(ys)
plot_utils.show_scatter(xs, ys)
w1 = 0.1
w2 = 0.2
b = 0.1
## [[a,b][c,d]]
## x1s[a,c]
## x2s[b,d]
## 逗号,区分的是维度,冒号:区分的是索引,省略号… 用来代替全索引长度
# 在所有的行上,把第0列切割下来形成一个新的数组
x1s = xs[:, 0]
x2s = xs[:, 1]
# 前端传播
def forward_propgation(x1s, x2s):
z = w1 * x1s + w2 * x2s + b
a = 1 / (1 + np.exp(-z))
return a
plot_utils.show_scatter_surface(xs, ys, forward_propgation)
for _ in range(500):
for i in range(m):
x = xs[i] ## 豆豆特征
y = ys[i] ## 豆豆是否有毒
x1 = x[0]
x2 = x[1]
a = forward_propgation(x1, x2)
e = (y - a) ** 2
deda = -2 * (y - a)
dadz = a * (1 - a)
dzdw1 = x1
dzdw2 = x2
dzdb = 1
dedw1 = deda * dadz * dzdw1
dedw2 = deda * dadz * dzdw2
dedb = deda * dadz * dzdb
alpha = 0.01
w1 = w1 - alpha * dedw1
w2 = w2 - alpha * dedw2
b = b - alpha * dedb
plot_utils.show_scatter_surface(xs, ys, forward_propgation)
使用向量矩阵后的代码:
import numpy as np
import dataset
import plot_utils
m = 100
X, Y = dataset.get_beans(m)
print(X)
print(Y)
plot_utils.show_scatter(X, Y)
# w1 = 0.1
# w2 = 0.2
W = np.array([0.1, 0.1])
# b = 0.1
B = np.array([0.1])
# 前端传播
def forward_propgation(X):
# z = w1 * x1s + w2 * x2s + b
# ndarray的dot函数:点乘运算
# ndarray的T属性:转置运算
Z = X.dot(W.T) + B
# a = 1 / (1 + np.exp(-z))
A = 1 / (1 + np.exp(-Z))
return A
plot_utils.show_scatter_surface(X, Y, forward_propgation)
for _ in range(500):
for i in range(m):
Xi = X[i] ## 豆豆特征
Yi = Y[i] ## 豆豆是否有毒
A = forward_propgation(Xi)
E = (Yi - A) ** 2
dEdA = -2 * (Yi - A)
dAdZ = A * (1 - A)
dZdW = Xi
dZdB = 1
dEdW = dEdA * dAdZ * dZdW
dEdB = dEdA * dAdZ * dZdB
alpha = 0.01
W = W - alpha * dEdW
B = B - alpha * dEdB
plot_utils.show_scatter_surface(X, Y, forward_propgation)
2 Keras
诚如你所见,你恰好发现了 Keras
。Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK, 或者 Theano 作为后端运行。Keras 的开发重点是支持快速
的实验。能够以最小的时延把你的想法转换为实验结果,是做好研究的关键。
🔗参考链接:Keras官网
环境准备:
安装Tensorflow和Keras:
pip install keras -i https://pypi.mirrors.ustc.edu.cn/simple/
pip install tensorflow -i https://pypi.mirrors.ustc.edu.cn/simple/
12
如果遇到ddl缺失问题,我们只需要去微软的官网下载一个Visual C++软件包:参考链接
3 代码实现
我们对上述过程代码实现:
豆豆数据集模拟:dataset.py
import numpy as np
def get_beans(counts):
xs = np.random.rand(counts,2)*2
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
if (x[0]-0.5*x[1]-0.1)>0:
ys[i] = 1
return xs,ys
def get_beans1(counts):
xs = np.random.rand(counts)
xs = np.sort(xs)
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
yi = 0.7*x+(0.5-np.random.rand())/50+0.5
if yi > 0.8:
ys[i] = 1
else:
ys[i] = 0
return xs,ys
def get_beans2(counts):
xs = np.random.rand(counts)*2
xs = np.sort(xs)
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
yi = 0.7*x+(0.5-np.random.rand())/50+0.5
if yi > 0.8 and yi < 1.4:
ys[i] = 1
return xs,ys
def get_beans3(counts):
xs = np.random.rand(counts)*2
xs = np.sort(xs)
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
yi = 0.7*x+(0.5-np.random.rand())/50+0.5
if yi > 0.8 and yi < 1.4:
ys[i] = 1
if yi > 1.6 and yi < 1.8:
ys[i] = 1
return xs,ys
def get_beans4(counts):
xs = np.random.rand(counts,2)*2
ys = np.zeros(counts)
for i in range(counts):
x = xs[i]
if (np.power(x[0]-1,2)+np.power(x[1]-0.3,2))<0.5:
ys[i] = 1
return xs,ys
绘图工具:plot_utils.py
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
import numpy as np
from keras.models import Sequential#导入keras
def show_scatter_curve(X,Y,pres):
plt.scatter(X, Y)
plt.plot(X, pres)
plt.show()
def show_scatter(X,Y):
if X.ndim>1:
show_3d_scatter(X,Y)
else:
plt.scatter(X, Y)
plt.show()
def show_3d_scatter(X,Y):
x = X[:,0]
z = X[:,1]
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, z, Y)
plt.show()
def show_surface(x,z,forward_propgation):
x = np.arange(np.min(x),np.max(x),0.1)
z = np.arange(np.min(z),np.max(z),0.1)
x,z = np.meshgrid(x,z)
y = forward_propgation(X)
fig = plt.figure()
ax = Axes3D(fig)
ax.plot_surface(x, z, y, cmap='rainbow')
plt.show()
def show_scatter_surface(X,Y,forward_propgation):
if type(forward_propgation) == Sequential:
show_scatter_surface_with_model(X,Y,forward_propgation)
return
x = X[:,0]
z = X[:,1]
y = Y
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, z, y)
x = np.arange(np.min(x),np.max(x),0.1)
z = np.arange(np.min(z),np.max(z),0.1)
x,z = np.meshgrid(x,z)
X = np.column_stack((x[0],z[0]))
for j in range(z.shape[0]):
if j == 0:
continue
X = np.vstack((X,np.column_stack((x[0],z[j]))))
r = forward_propgation(X)
y = r[0]
if type(r) == np.ndarray:
y = r
y = np.array([y])
y = y.reshape(x.shape[0],z.shape[1])
ax.plot_surface(x, z, y, cmap='rainbow')
plt.show()
def show_scatter_surface_with_model(X,Y,model):
#model.predict(X)
x = X[:,0]
z = X[:,1]
y = Y
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter(x, z, y)
x = np.arange(np.min(x),np.max(x),0.1)
z = np.arange(np.min(z),np.max(z),0.1)
x,z = np.meshgrid(x,z)
X = np.column_stack((x[0],z[0]))
for j in range(z.shape[0]):
if j == 0:
continue
X = np.vstack((X,np.column_stack((x[0],z[j]))))
y = model.predict(X)
# return
# y = model.predcit(X)
y = np.array([y])
y = y.reshape(x.shape[0],z.shape[1])
ax.plot_surface(x, z, y, cmap='rainbow')
plt.show()
def pre(X,Y,model):
model.predict(X)
第一批豆豆:
import dataset
import plot_utils
from keras.models import Sequential
from keras.layers import Dense
m = 100
X, Y = dataset.get_beans1(m)
plot_utils.show_scatter(X, Y)
model = Sequential()
# 当前层神经元的数量为1,激活函数类型:sigmoid,输入数据特征维度:1
model.add(Dense(units=1, activation='sigmoid', input_dim=1))
# loss(损失函数、代价函数):mean_squared_error均方误差;
# optimizer(优化器):sgd(随机梯度下降算法);
# metrics(评估标准):accuracy(准确度);
model.compile(loss='mean_squared_error', optimizer='sgd', metrics=['accuracy'])
# epochs:回合数(全部样本完成一次训练)、batch_size:批数量(一次训练使用多少个样本)
model.fit(X, Y, epochs=5000, batch_size=10)
pres = model.predict(X)
plot_utils.show_scatter_curve(X, Y, pres)
🚩训练结果:
🔨 第二批豆豆:
import dataset
import plot_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
m = 100
X, Y = dataset.get_beans2(m)
plot_utils.show_scatter(X, Y)
model = Sequential()
model.add(Dense(units=2, activation='sigmoid', input_dim=1))
model.add(Dense(units=1, activation='sigmoid'))
# 调整学习率为0.05
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.05), metrics=['accuracy'])
model.fit(X, Y, epochs=5000, batch_size=10)
pres = model.predict(X)
plot_utils.show_scatter_curve(X, Y, pres)
🚩训练结果:
🔨 第三批豆豆:
import dataset
import plot_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
m = 100
X, Y = dataset.get_beans(m)
plot_utils.show_scatter(X, Y)
model = Sequential()
# 当前层神经元的数量为1,激活函数类型:sigmoid,输入数据特征维度:2
model.add(Dense(units=1, activation='sigmoid', input_dim=2))
# loss(损失函数、代价函数):mean_squared_error均方误差;
# optimizer(优化器):sgd(随机梯度下降算法);
# metrics(评估标准):accuracy(准确度);
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.05), metrics=['accuracy'])
# epochs:回合数(全部样本完成一次训练)、batch_size:批数量(一次训练使用多少个样本)
model.fit(X, Y, epochs=5000, batch_size=10)
pres = model.predict(X)
plot_utils.show_scatter_surface(X, Y, model)
🚩豆豆毒性分布:
🚩训练结果:
🔨 第四批豆豆:
import dataset
import plot_utils
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import SGD
m = 100
X, Y = dataset.get_beans(m)
plot_utils.show_scatter(X, Y)
model = Sequential()
# 当前层神经元的数量为2,激活函数类型:sigmoid,输入数据特征维度:2
model.add(Dense(units=2, activation='sigmoid', input_dim=2))
model.add(Dense(units=1, activation='sigmoid'))
# loss(损失函数、代价函数):mean_squared_error均方误差;
# optimizer(优化器):sgd(随机梯度下降算法);
# metrics(评估标准):accuracy(准确度);
model.compile(loss='mean_squared_error', optimizer=SGD(lr=0.05), metrics=['accuracy'])
# epochs:回合数(全部样本完成一次训练)、batch_size:批数量(一次训练使用多少个样本)
model.fit(X, Y, epochs=5000, batch_size=10)
pres = model.predict(X)
plot_utils.show_scatter_surface(X, Y, model)
🚩豆豆毒性分布:
🚩训练结果: