物联网深度学习:多层感知器与卷积神经网络
立即解锁
发布时间: 2025-08-30 01:11:41 阅读量: 6 订阅数: 7 AIGC 

### 物联网深度学习:多层感知器与卷积神经网络
#### 1. 多层感知器基础
在之前对单个神经元的学习中,我们尝试用其预测能源输出。但与线性回归结果相比,单个神经元虽表现不错,但效果仍不及线性回归。在验证数据集上,单个神经元架构的均方误差(MSE)为 0.078,而线性回归仅为 0.01。这是因为单个神经元只能解决线性可分问题,即只有存在一条直线能分隔类别或决策时,它才能提供解决方案。
由单层神经元组成的网络被称为简单感知器。1958 年,Rosenblatt 提出了感知器模型,该模型在科学界引起了广泛关注,并推动了相关领域的大量研究。最初,它被应用于硬件图像识别任务。然而,Marvin Minsky 和 Seymour Papert 所著的《Perceptrons》一书证明,简单感知器只能解决线性可分问题。
为了应对更复杂的问题,我们可以使用多层单个神经元,即多层感知器(MLP)。MLP 就像我们在现实生活中解决复杂问题一样,将大问题分解为小的线性可分问题。由于信息从输入层通过隐藏层单向流向输出层,这种网络也被称为前馈网络。例如,在解决异或(XOR)问题时,MLP 可以将非线性可分问题分解为多个线性可分问题。
#### 2. 反向传播算法
在早期,虽然 McCulloch 和 Pitts 提出了多层神经元的想法,但 Rosenblatt 提出的简单感知器学习算法无法用于训练多层感知器。主要困难在于,我们虽然知道输出神经元的期望输出,能计算误差、损失函数并使用梯度下降更新权重,但无法得知隐藏神经元的期望输出。
直到 1982 年,Hinton 提出了反向传播算法,这一情况才得以改变。该算法利用链式求导法则,解决了将输出层的误差传递回隐藏神经元的问题,从而为神经网络注入了新的活力。如今,反向传播算法几乎是所有深度学习模型的核心。
反向传播算法的步骤如下:
1. 将输入应用到网络中。
2. 前向传播输入并计算网络的输出。
3. 计算输出的损失,然后使用相应表达式计算输出层神经元的权重更新。
4. 利用输出层的加权误差,计算隐藏层的权重更新。
5. 更新所有权重。
6. 对其他训练示例重复上述步骤。
#### 3. 多层感知器在能源输出预测中的应用
我们可以使用单层隐藏层的 MLP 来预测联合循环发电厂的每小时净电能输出,这是一个回归问题。以下是实现 MLP 类的完整代码:
```python
import tensorflow as tf
from sklearn.utils import shuffle
class MLP:
def __init__(self,n_input=2,n_hidden=4, n_output=1,
act_func=[tf.nn.elu, tf.sigmoid], learning_rate= 0.001):
self.n_input = n_input # Number of inputs to the neuron
self.act_fn = act_func
seed = 123
self.X = tf.placeholder(tf.float32, name='X', shape=[None,n_input])
self.y = tf.placeholder(tf.float32, name='Y')
# Build the graph for a single neuron
# Hidden layer
self.W1 = tf.Variable(tf.random_normal([n_input,n_hidden],
stddev=2, seed = seed), name = "weights")
self.b1 = tf.Variable(tf.random_normal([1, n_hidden], seed = seed),
name="bias")
tf.summary.histogram("Weights_Layer_1",self.W1)
tf.summary.histogram("Bias_Layer_1", self.b1)
# Output Layer
self.W2 = tf.Variable(tf.random_normal([n_hidden,n_output],
stddev=2, seed = 0), name = "weights")
self.b2 = tf.Variable(tf.random_normal([1, n_output], seed = seed),
name="bias")
tf.summary.histogram("Weights_Layer_2",self.W2)
tf.summary.histogram("Bias_Layer_2", self.b2)
activity = tf.matmul(self.X, self.W1) + self.b1
h1 = self.act_fn[0](activity)
activity = tf.matmul(h1, self.W2) + self.b2
self.y_hat = self.act_fn[1](activity)
error = self.y - self.y_hat
self.loss = tf.reduce_mean(tf.square(error)) + 0.6*tf.nn.l2_loss(self.W1)
self.opt = tf.train.GradientDescentOptimizer(learning_rate=learning_rate).minimize(self.loss)
tf.summary.scalar("loss",self.loss)
init = tf.global_variables_initializer()
self.sess = tf.Session()
self.sess.run(init)
self.merge = tf.summary.merge_all()
self.writer = tf.summary.FileWriter("logs/", graph=tf.get_default_graph())
def train(self, X, Y, X_val, Y_val, epochs=100):
epoch = 0
X, Y = shuffle(X,Y)
loss = []
loss_val = []
while epoch < epochs:
# Run the optimizer for the training set
merge, _, l = self.sess.run([self.merge,self.opt,self.loss],
feed_dict={self.X: X, self.y: Y})
l_val = self.sess.run(self.loss, feed_dict={self.X: X_val, self.y: Y_val})
loss.append(l)
loss_val.append(l_val)
self.writer.add_summary(merge, epoch)
```
0
0
复制全文
相关推荐









