本文由**罗周杨stupidme.me.lzy@gmail.com**原创,转载请注明作者和出处。未经授权,不得用于商业用途。
不使用任何深度学习框架,实现一个简单的神经网络用来分类。
手把手带你搭建神经网络,包括损失函数的选择,已经手写反向传播代码。
生成一些数据
生成一些数据,这些数据不太容易线性分类。
import numpy as np
import matplotlib.pyplot as plt
N = 100 # 每一个类别的生成的点的数量
D = 2 # 每个点的维度,这里使用平面,所以是2维数据
K = 3 # 类别数量,我们一共生成3个类别的点
# 所有的样本数据,一共300个点,每个点用2个维度表示
# 所有训练数据就是一个300*2的二维矩阵
X = np.zeros((N*K, D))
# 标签数据,一共是300个点,每个点对应一个类别,
# 所以标签是一个300*1的矩阵
y = np.zeros(N*K, dtype='uint8')
# 生成训练数据
for j in range(K):
ix = range(N*j, N*(j+1))
r = np.linspace(0.0, 1, N)
t = np.linspace(j*4, (j+1)*4, N) + np.random.randn(N)*0.2
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
y[ix] = j
plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
plt.show()
训练一个Softmax线性分类器
使用softmax和cross-entropy loss,训练一个线性分类器。
实际上就是直接用softmax做多分类,使用交叉熵损失作为损失函数,训练一个线性分类模型。
import numpy as np
import matplotlib.pyplot as plt
N = 100
D = 2
K = 3
X = np.zeros((N*K, D))
y = np.zeros(N*K, dtype='uint8')
for j in range(K):
ix = range(N*j, N*(j+1))
r = np.linspace(0.0, 1, N)
t = np.linspace(j*4, (j+1)*4, N) + np.random.randn(N)*0.2
X[ix] = np.c_[r*np.sin(t), r*np.cos(t)]
y[ix] = j
# plt.scatter(X[:, 0], X[:, 1], c=y, s=40, cmap=plt.cm.Spectral)
# plt.show()
# 初始化权重和偏置
W = 0.01 * np.random.randn(D, K)
b = np.zeros((1, K))
step_size = 1e-0
reg = 1e-3 # regularization strength
# 获取训练样本数量
num_examples = X.shape[0]
for i in range(200):
# 计算分类得分
scores = np.dot(X, W) + b