神经网络(Neural Network)第一步——深度学习(Deep Learning)
将神经网络作为识别器,这就是现在流行的深度学习。
下面的代码是包含输入层、中间层(Unit 数:64)、输出层(1)的网络。这是实现异或逻辑的网络.
import numpy as np
np.random.seed(0)
class NN:
def __init__(self, ind=2, w=64, outd=1, lr=0.1):
self.w1 = np.random.normal(0, 1, [ind, w])
self.b1 = np.random.normal(0, 1, [w])
self.wout = np.random.normal(0, 1, [w, outd])
self.bout = np.random.normal(0, 1, [outd])
self.lr = lr
def forward(self, x):
self.z1 = x
self.z2 = sigmoid(np.dot(self.z1, self.w1) + self.b1)
self.out = sigmoid(np.dot(self.z2, self.wout) + self.bout)
return self.out
def train(self, x, t):
# backpropagation output layer
#En = t * np.log(self.out) + (1-t) * np.log(1-self.out)
En = (self.out - t) * self.out * (1 - self.out)
grad_En = En #np.array([En for _ in range(t.shape[0])])
grad_wout = np.dot(self.z2.T, En)
grad_bout = np.dot(np.ones([En.shape[0]]), En)
self.wout -= self.lr * grad_wout#np.expand_dims(grad_wout, axis=-1)
self.bout -= self.lr * grad_bout
# backpropagation inter layer
grad_u1 = np.dot(En, self.wout.T) * self.z2 * (1 - self.z2)
grad_w1 = np.dot(self.z1.T, grad_u1)
grad_b1 = np.dot(np.ones([grad_u1.shape[0]]), grad_u1)
self.w1 -= self.lr * grad_w1
self.b1 -= self.lr * grad_b1
def sigmoid(x):
return 1. / (1. + np.exp(-x))
train_x = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
train_t = np.array([[0], [1], [1], [0]], dtype=np.float32)
nn = NN(ind=train_x.shape[1])
# train
for i in range(1000):
nn.forward(train_x)
nn.train(train_x, train_t)
# test
for j in range(4):
x = train_x[j]
t = train_t[j]
print("in:", x, "pred:", nn.forward(x))
,我们可以再增加一层中间层进行学习和测试。
答案:
in: [0. 0.] pred: [0.03724313]
in: [0. 1.] pred: [0.95885516]
in: [1. 0.] pred: [0.9641076]
in: [1. 1.] pred: [0.03937037]
python实现:
import numpy as np
np.random.seed(0)
# neural network
class NN:
def __init__(self, ind=2, w=64, w2=64, outd=1, lr=0.1):
# layer 1 weight
self.w1 = np.random.normal(0, 1, [ind, w])
# layer 1 bias
self.b1 = np.random.normal(0, 1, [w])
# layer 2 weight
self.w2 = np.random.normal(0, 1, [w, w2])
# layer 2 bias
self.b2 = np.random.normal(0, 1, [w2])
# output layer weight
self.wout = np.random.normal(0, 1, [w2, outd])
# output layer bias
self.bout = np.random.normal(0, 1, [outd])
# learning rate
self.lr = lr
def forward(self, x):
# input tensor
self.z1 = x
# layer 1 output tensor
self.z2 = sigmoid(np.dot(self.z1, self.w1) + self.b1)
# layer 2 output tensor
self.z3 = sigmoid(np.dot(self.z2, self.w2) + self.b2)
# output layer tensor
self.out = sigmoid(np.dot(self.z3, self.wout) + self.bout)
return self.out
def train(self, x, t):
# backpropagation output layer
#En = t * np.log(self.out) + (1-t) * np.log(1-self.out)
En = (self.out - t) * self.out * (1 - self.out)
# get gradients for weight and bias
grad_wout = np.dot(self.z3.T, En)
grad_bout = np.dot(np.ones([En.shape[0]]), En)
# update weight and bias
self.wout -= self.lr * grad_wout
self.bout -= self.lr * grad_bout
# backpropagation inter layer
# get gradients for weight and bias
grad_u2 = np.dot(En, self.wout.T) * self.z3 * (1 - self.z3)
grad_w2 = np.dot(self.z2.T, grad_u2)
grad_b2 = np.dot(np.ones([grad_u2.shape[0]]), grad_u2)
# update weight and bias
self.w2 -= self.lr * grad_w2
self.b2 -= self.lr * grad_b2
# get gradients for weight and bias
grad_u1 = np.dot(grad_u2, self.w2.T) * self.z2 * (1 - self.z2)
grad_w1 = np.dot(self.z1.T, grad_u1)
grad_b1 = np.dot(np.ones([grad_u1.shape[0]]), grad_u1)
# update weight and bias
self.w1 -= self.lr * grad_w1
self.b1 -= self.lr * grad_b1
# sigmoid
def sigmoid(x):
return 1. / (1. + np.exp(-x))
# train
def train_nn(nn, train_x, train_t, iteration_N=5000):
for i in range(5000):
# feed-forward data
nn.forward(train_x)
#print("ite>>", i, 'y >>', nn.forward(train_x))
# update parameters
nn.train(train_x, train_t)
return nn
# test
def test_nn(nn, test_x, test_t):
for j in range(len(test_x)):
x = train_x[j]
t = train_t[j]
print("in:", x, "pred:", nn.forward(x))
# train data
train_x = np.array([[0,0], [0,1], [1,0], [1,1]], dtype=np.float32)
# train label data
train_t = np.array([[0], [1], [1], [0]], dtype=np.float32)
# prepare neural network
nn = NN()
# train
nn = train_nn(nn, train_x, train_t, iteration_N=5000)
# test
test_nn(nn, train_x, train_t)