Python写一个简单的神经网络
2017-05-13 11:37
381 查看
简单的神经网络算法,包括基本的后向传播BP算法,前向传播算法,更新权重使用的梯度下降算法,基本的框架算是有了,学习使用。
注意输入每一行数据时候在神经网络中会加入bias偏量,神经网络的层数和每层个数为自定义,搞了很久才知道输入矩阵多了一个维度,权重和后向传播更新的delta都是每列神经元之间的关系,关于s形函数暂时用了两种,分别是
注意输入每一行数据时候在神经网络中会加入bias偏量,神经网络的层数和每层个数为自定义,搞了很久才知道输入矩阵多了一个维度,权重和后向传播更新的delta都是每列神经元之间的关系,关于s形函数暂时用了两种,分别是
logistic()和
tanh()效果差不多,简单的模型作为笔记学习使用。下面附上代码。
import numpy as np def tanh(x): return np.tanh(x) def tanh_deriv(x): return 1.0 - np.tanh(x) * np.tanh(x) def logistic(x): return 1 / (1 + np.exp(-x)) def logistic_derivative(x): return logistic(x) * (1 - logistic(x)) class NeuralNetwork: def __init__(self, layers, activation='tanh'): if activation == 'logistic': self.activation = logistic self.activation_deriv = logistic_derivative elif activation == 'tanh': self.activation = tanh self.activation_deriv = tanh_deriv self.weights = [] for i in range(1, len(layers) - 1): self.weights.append( (2 * np.random.random((layers[i - 1] + 1, layers[i] + 1)) - 1) * 0.25) self.weights.append( (2 * np.random.random((layers[-2] + 1, layers[-1])) - 1) * 0.25) def fit(self, X, y, learning_rate=0.2, epochs=10000): X = np.atleast_2d(X) temp = np.ones([X.shape[0], X.shape[1] + 1]) temp[:, 0:-1] = X # adding the bias unit to the input layer X = temp y = np.array(y) for k in range(epochs): i = np.random.randint(X.shape[0]) a = [X[i]] for l in range(len(self.weights)): # going forward network, for each layer a.append(self.activation(np.dot(a[l], self.weights[l]))) error = y[i] - a[-1] # Computer the error at the top layer # For output layer, Err calculation (delta is updated error) deltas = [error * self.activation_deriv(a[-1])] # Staring backprobagation for l in range(len(a) - 2, 0, -1): deltas.append(deltas[-1].dot(self.weights[l].T) * self.activation_deriv(a[l])) deltas.reverse() for i in range(len(self.weights)): layer = np.atleast_2d(a[i]) delta = np.atleast_2d(deltas[i]) self.weights[i] += learning_rate * layer.T.dot(delta) def predict(self, x): x = np.array(x) temp = np.ones(x.shape[0] + 1) temp[0:-1] = x a = temp for l in range(0, len(self.weights)): a = self.activation(np.dot(a, self.weights[l])) return a nn = NeuralNetwork([2, 2, 3, 1], 'tanh') X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([0, 1, 1, 0]) nn.fit(X, y) for i in [[0, 0], [0, 1], [1, 0], [1, 1]]: print(i, nn.predict(i))
相关文章推荐
- 神经网络算法推导,附python实现一个简单神经网络
- 基于python实现一个简单的神经网络
- 一个简单的神经网络例子
- 一个 11 行 Python 代码实现的神经网络
- 一个 11 行 Python 代码实现的神经网络
- 【深度学习】1.2:简单神经网络的python实现
- python keras (一个超好用的神经网络框架)的使用以及实例
- 使用python定义一个神经网络结构
- 实现一个最简单的神经网络
- python简单实现神经网络
- python初学者——一个简单的网络爬虫
- 使用RStudio学习一个简单神经网络
- 2016.3.29 一个简单的视觉化证明神经网络可以拟合任意函数
- Python网络编程之 select(2)实现一个最简单的webserver
- 十一行Python代码实现一个神经网络(第一部分)
- python实现简单神经网络算法
- 使用python实现简单全连接神经网络
- 如何用9行Python代码编写一个简易神经网络
- tensorflow建立一个简单的神经网络
- 深度学习(二):用CNTK在Python下实现一个简单的FeedForward网络