基于TensorFlow和Keras的神经网络与多层感知器
立即解锁
发布时间: 2025-08-30 00:50:10 阅读量: 11 订阅数: 17 AIGC 

### 基于TensorFlow和Keras的神经网络与多层感知器
#### 1. 感知机
感知机是神经网络最基本的构建块,也被称为人工神经元。其概念源于1962年Frank Rosenblatt的研究。从最简单的角度看,感知机模仿生物神经元,接收一个或多个输入并将它们组合以产生输出。
最初的简单感知机接收三个输入并将它们相加得到输出y,但这种感知机过于简单,缺乏实际用途。因此,引入了权重、偏置和激活函数的概念对其进行了增强。权重被添加到每个输入上以得到加权和,如果加权和小于阈值(即偏置),输出为0;否则输出为1。
为了使神经元产生非线性决策边界,需要将求和的输出通过一个非线性函数,即激活函数。常见的激活函数有:
- ReLU(Rectified Linear Unit):将值平滑到范围(0, x)。
- Sigmoid:将值平滑到范围(0, 1)。
- tanh(Hyperbolic Tangent):将值平滑到范围(-1, 1)。
感知机添加激活函数后的方程为:(此处原文未给出完整方程,推测是 $y = f(\sum_{i=1}^{n}w_ix_i + b)$,其中 $f$ 是激活函数)
#### 2. 多层感知器(MLP)
当我们按照明确定义的结构将人工神经元连接在一起时,就得到了神经网络。最简单的神经网络可以只有一个神经元。
如果将神经元连接成前一层的输出作为下一层的输入,直到最后一层的输出成为最终输出,这种神经网络被称为前馈神经网络(FFNN)。由于FFNN由多层连接的神经元组成,因此也被称为多层感知器(MLP)或深度神经网络(DNN)。
例如,一个MLP可能有三个特征作为输入,两个各有五个神经元的隐藏层和一个输出y。神经元与下一层的神经元完全连接,这样的层也称为密集层或仿射层,这种模型也被称为顺序模型。
#### 3. 用于图像分类的MLP
我们将使用不同的库(如TensorFlow、Keras和TFLearn)构建用于图像分类的MLP网络,并以MNIST数据集为例。MNIST数据集包含0到9的手写数字的28x28像素图像及其标签,训练集有60K个样本,测试集有10K个样本。该数据集是最广泛使用的数据集之一,在TensorFlow的示例和教程中经常出现。你可以从[这里](http://yann.lecun.com/exdb/mnist/)获取MNIST数据集及其相关文档。
##### 3.1 基于TensorFlow的MNIST分类MLP
步骤如下:
1. **加载MNIST数据集**:
```python
from tensorflow.examples.tutorials.mnist import input_data
import os
# 假设datasetslib.datasets_root已定义
mnist_home = os.path.join(datasetslib.datasets_root, 'mnist')
mnist = input_data.read_data_sets(mnist_home, one_hot=True)
X_train = mnist.train.images
X_test = mnist.test.images
Y_train = mnist.train.labels
Y_test = mnist.test.labels
num_outputs = 10 # 0 - 9 digits
num_inputs = 784 # total pixels
```
2. **创建辅助函数**:
- **mlp()函数**:用于构建网络层。
```python
import tensorflow as tf
def mlp(x, num_inputs, num_outputs, num_layers, num_neurons):
w = []
b = []
for i in range(num_layers):
# weights
w.append(tf.Variable(tf.random_normal(
[num_inputs if i == 0 else num_neurons[i - 1],
num_neurons[i]]),
name="w_{0:04d}".format(i)
))
# biases
b.append(tf.Variable(tf.random_normal(
[num_neurons[i]]),
name="b_{0:04d}".format(i)
))
w.append(tf.Variable(tf.random_normal(
[num_neurons[num_layers - 1] if num_layers > 0 else num_inputs,
num_outputs]), name="w_out"))
b.append(tf.Variable(tf.random_normal([num_outputs]),
name="b_out"))
# x is input layer
layer = x
# add hidden layers
for i in range(num_layers):
layer = tf.nn.relu(tf.matmul(layer, w[i]) + b[i])
# add output layer
layer = tf.matmul(layer, w[num_layers]) + b[num_layers]
return layer
```
- **mnist_batch_func()函数**:用于获取下一批图像。
```python
def mnist_batch_func(batch_size=100):
X_batch, Y_batch = mnist.train.next_batch(batch_size)
return [X_batch, Y_batch]
```
- **tensorflow_classification()函数**:用于训练和评估模型。
```python
def tensorflow_classification(n_epochs, n_batches,
batch_size, batch_func,
model, optimizer, loss,
accuracy_function,
X_test, Y_test):
```
0
0
复制全文
相关推荐










