python神经网络教程_python实现人工神经网络的一个例子

人工神经网络已经有无数的开源框架,比如tensorflow,caffe等,可以直接用。但最近需要做一个小样例,把基本思想讲一讲,因此自己写了一个demo,以供参考。

下面直接上代码,代码中有注释,比较容易理解

ANN.py

# -*- coding:utf-8 -*-

import numpy

import random

class ANN:

# layers为列表,其长度给出层数,包括输入和输出层,每个元素给出每层神经元数量

# 例如[3, 5, 2]代表输入参数为3,中间隐藏层有5个神经元,输出2个结果的神经网络

def __init__(self, layers):

self.num_layers = len(layers)

self.sizes = layers

self._biases = [numpy.random.randn(y, 1) for y in layers[1:]]

self._weights = [numpy.random.randn(y, x) for x, y in zip(layers[:-1], layers[1:])]

def _sigmoid(self, z):

return 1.0/(1.0 + numpy.exp(-z))

# sigmoid函数的导数

def _Dsigmoid(self, z):

return self._sigmoid(z)*(1-self._sigmoid(z))

# 计算输出向量

def calc(self, input):

for b, w in zip(self._biases, self._weights):

input = self._sigmoid(numpy.dot(w, input) + b)

return input

# 训练神经网络

# trainData: 训练集

# epochs: 训练轮数,对trainData训练多少轮

# size: 训练子集的大小

# rate: learning rate,学习速率,步长

# testData: 测试集

def train(self, trainData, epochs, size, rate, testData=None):

if testData:

n_test = len(testData)

n = len(trainData)

for j in range(epochs):

random.shuffle(trainData)

mini_batches = [trainData[k:k+size] for k in range(0, n, size)]

for mini_bat in mini_batches:

self._update(mini_bat, rate)

if testData:

error = self.test(testData)

if (j % (epochs/10) == 0):

print("Epoch {0}: error = {1}".format(j, error))

else:

if (j % (epochs/10) == 0):

print("Epoch {0} complete.".format(j))

def _update(self, mini_batch, rate):

nabla_b = [numpy.zeros(b.shape) for b in self._biases]

nabla_w = [numpy.zeros(w.shape) for w in self._weights]

for x, y in mini_batch:

delta_b, delta_w = self._backpropagation(x, y)

nabla_b = [nb + db for nb, db in zip(nabla_b, delta_b)]

nabla_w = [nw + dw for nw, dw in zip(nabla_w, delta_w)]

self._weights = [w - (rate/len(mini_batch))*nw for w, nw in zip(self._weights, nabla_w)]

self._biases = [b - (rate/len(mini_batch))*nb for b, nb in zip(self._biases, nabla_b)]

# 后向传播算法

def _backpropagation(self, x, y):

nabla_b = [numpy.zeros(b.shape) for b in self._biases]

nabla_w = [numpy.zeros(w.shape) for w in self._weights]

# forward

activation = x

activations = [x]

zs = []

for b, w in zip(self._biases, self._weights):

z = numpy.dot(w, activation) + b

zs.append(z)

activation = self._sigmoid(z)

activations.append(activation)

# backward

delta = self._derivative(activations[-1], y) * self._Dsigmoid(zs[-1])

nabla_b[-1] = delta

nabla_w[-1] = numpy.dot(delta, activations[-2].transpose())

for layer in range(2, self.num_layers):

z = zs[-layer]

sp = self._Dsigmoid(z)

delta = numpy.dot(self._weights[-layer+1].transpose(), delta) * sp

nabla_b[-layer] = delta

nabla_w[-layer] = numpy.dot(delta, activations[-layer-1].transpose())

return (nabla_b, nabla_w)

# 计算测试集误差,注意此时输出一定为1维矢量

def test(self, testData):

test_results = [(self.calc(x), self._translate(y)) for (x, y) in testData]

err = [output - result for (output, result) in test_results]

return sum(numpy.dot(ei.transpose(), ei) for ei in err)

# 如有必要,将结果进行编码,便于和神经网络输出结果相比较

# 比如经典的手写识别,就需要把数字y转化为向量

def _translate(self, y):

return y

# 整个神经网络的导数

def _derivative(self, output, y):

return output - y

可以看到,得益于numpy的矩阵运算,代码非常简单。

下面是测试,使用上面的代码拟合and函数

test.py

# -*- coding:utf-8 -*-

import ANN

layers = [2, 2, 2]

input = numpy.array([[0,0],[0,1],[1,0],[1,1]])

out = numpy.array([[1,0],[1,0],[1,0],[0,1]])

inputs = [numpy.reshape(i, (2,1)) for i in input]

outputs = [numpy.reshape(o, (2,1)) for o in out]

data = [(inputs[i], outputs[i]) for i in range(len(inputs))]

net = ANN.ANN(layers)

net.train(data, 50000, len(inputs), 0.1, data)

for i in range(len(inputs)):

print(inputs[i].T, ": ", net.calc(inputs[i]).T)

可以看到,构造了一个2x2x2的神经网络,输入为2位,输出为2位,中间层也为2个神经元,即可通过训练获得相应的and函数。需要注意的是numpy构造的矢量必须和ANN.py中风格一致(如果第一个指标代表行,第二个指标代表列,则输入输出均必须为列矢量)。计算结果如下:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用 TensorFlow 库来设计一个人工神经网络解微分方程的 Python 程序的简单示例: ```python import tensorflow as tf import numpy as np # 定义微分方程 def f(x, y): return 2 * x + 3 * y # 定义训练数据 x_train = np.linspace(0, 1, 100)[:, np.newaxis] y_train = np.exp(-x_train) * np.sin(2 * np.pi * x_train) # 定义神经网络 x = tf.placeholder(tf.float32, [None, 1]) y = tf.placeholder(tf.float32, [None, 1]) w1 = tf.Variable(tf.random_normal([1, 10])) b1 = tf.Variable(tf.zeros([10])) layer1 = tf.nn.relu(tf.matmul(x, w1) + b1) w2 = tf.Variable(tf.random_normal([10, 1])) b2 = tf.Variable(tf.zeros([1])) output = tf.matmul(layer1, w2) + b2 # 定义损失函数和优化算法 loss = tf.reduce_mean(tf.square(output - f(x, y))) optimizer = tf.train.AdamOptimizer(0.1) train = optimizer.minimize(loss) # 训练神经网络 sess = tf.Session() sess.run(tf.global_variables_initializer()) for i in range(1000): sess.run(train, feed_dict={x: x_train, y: y_train}) if i % 100 == 0: print("step %d, loss %.4f" % (i, sess.run(loss, feed_dict={x: x_train, y: y_train}))) # 使用训练好的神经网络进行预测 x_test = np.linspace(0, 1, 100)[:, np.newaxis] y_test = sess.run(output, feed_dict={x: x_test}) # 可视化结果 import matplotlib.pyplot as plt plt.plot(x_train, y_train, 'bo', label='Training data') plt.plot(x_test, y_test, 'r-', label='Predicted') plt.legend() plt.show() ``` 在这个程序中,我们首先定义了一个微分方程 $y'(x) = 2x + 3y(x)$,然后生成了一些训练数据。接着,我们定义了一个包含一个隐藏层的神经网络,其中隐藏层的激活函数为 ReLU 函数,输出层没有使用激活函数。损失函数使用均方误差,优化算法使用 Adam 算法。最后,我们使用训练好的神经网络对新的数据进行预测,并将预测结果和训练数据可视化出来。 需要注意的是,这个示例程序只是一个简单的例子,实际上解微分方程的问题可能更加复杂,需要更加复杂的神经网络结构和更加高效的优化算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值