Python 神经网络实现:使用 tanh 激活函数
Python 神经网络实现:使用 tanh 激活函数
本代码使用 Python 实现了一个简单的神经网络,并使用了 tanh 激活函数。代码示例包括定义 tanh 函数、sigmoid 函数及其导数,构建神经网络类,训练网络并进行预测。
import numpy as np
# 定义tanh函数
def tanh(x):
return np.tanh(x)
# tanh函数的导数
def tan_deriv(x):
return 1.0 - np.tanh(x) * np.tan(x)
# sigmoid函数
def logistic(x):
return 1 / (1 + np.exp(-x))
# sigmoid函数的导数
def logistic_derivative(x):
return logistic(x) * (1 - logistic(x))
class NeuralNetwork:
def __init__(self, layers, activation='tanh'):
'''
神经网络算法构造函数
:param layers: 神经元层数
:param activation: 使用的函数(默认tanh函数)
:return:none
'''
if activation == 'logistic':
self.activation = logistic
self.activation_deriv = logistic_derivative
elif activation == 'tanh':
self.activation = tanh
self.activation_deriv = tan_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[i] + 1, layers[i + 1])) - 1) * 0.25)
def fit(self, X, y, learning_rate=0.2, epochs=10000):
'''
训练神经网络
:param X: 数据集(通常是二维)
:param y: 分类标记
:param learning_rate: 学习率(默认0.2)
:param epochs: 训练次数(最大循环次数,默认10000)
:return: none
'''
# 确保数据集是二维的
X = np.atleast_2d(X)
temp = np.ones([X.shape[0], X.shape[1] + 1])
temp[:, 0: -1] = X
X = temp
y = np.array(y)
for k in range(epochs):
# 随机抽取X的一行
i = np.random.randint(X.shape[0])
# 用随机抽取的这一组数据对神经网络更新
a = [X[i]]
# 正向更新
for l in range(len(self.weights)):
a.append(self.activation(np.dot(a[l], self.weights[l])))
error = y[i] - a[-1]
deltas = [error * self.activation_deriv(a[-1])]
# 反向更新
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, 1], 'tanh')
temp = [[0, 0], [0, 1], [1, 0], [1, 1]]
X = np.array(temp)
y = np.array([0, 1, 1, 0])
nn.fit(X, y)
for i in temp:
print(i, nn.predict(i))
程序简要流程
- 定义tanh函数和sigmoid函数及其导数;
- 定义神经网络类NeuralNetwork,初始化权重,初始化激活函数;
- 定义fit方法,传入数据集X和分类标记y,设定学习率和最大循环次数,随机抽取一组数据更新神经网络,正向更新和反向更新,更新权重;
- 定义predict方法,传入数据x,将数据转换为数组,进行正向更新,返回预测结果;
- 实例化神经网络类,传入神经元层数和激活函数类型,传入数据集X和分类标记y,进行训练,使用predict方法对新数据进行预测。
相关知识
- tanh函数:双曲正切函数,在神经网络中常用于激活函数,其输出值介于 -1 和 1 之间。
- sigmoid函数:逻辑函数,常用于激活函数,其输出值介于 0 和 1 之间。
- 神经网络:一种模拟人脑神经网络结构的计算模型,可以用来解决各种机器学习问题,例如分类、回归等。
- 反向传播:一种用于训练神经网络的算法,通过计算误差并将其反向传播到网络中,从而更新权重。
- 学习率:一个控制每次更新权重变化大小的参数,学习率过大会导致模型难以收敛,学习率过小会导致模型收敛速度过慢。
- epochs:训练次数,即数据在网络中循环训练的次数。
应用场景
本代码示例展示了如何使用 Python 实现一个简单的神经网络,并使用 tanh 激活函数进行训练。该代码可以作为学习和理解神经网络的基础,并可以进一步扩展到更复杂的应用场景,例如图像分类、自然语言处理等。
原文地址: https://www.cveoy.top/t/topic/jthK 著作权归作者所有。请勿转载和采集!