在深度学习领域,神经网络扮演着至关重要的角色。它们模仿人脑的工作方式,学习复杂且通常是非线性的输入输出关系。一个基本的神经网络由输入层、隐藏层和输出层组成,每一层包含一定数量的节点或神经元。多层的神经网络被称为深度学习系统。
神经网络在结构上非常复杂,计算成本高昂。幸运的是,有Keras,这是一个基于Tensorflow的Python深度学习API,它极大地简化了构建复杂神经网络的工作。Keras提供了两种构建神经网络的方式:顺序API和函数式API。
顺序API通过逐层创建模型,简单易用。但是,它不允许层的共享或分支,也不能有多个输入或输出。以下是使用顺序API构建神经网络的代码示例:
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras.optimizers import Adam
# 创建模型
model = Sequential()
model.add(Dense(4, activation='relu')) # 定义隐藏层
model.add(Dense(4, activation='relu'))
model.add(Dense(1)) # 输出层
# 定义优化器和损失函数
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(x=X_train, y=y_train,
validation_data=(X_test, y_test),
batch_size=128, epochs=400)
函数式API比顺序API更灵活,允许层的共享和分支,并且可以有多个输入和输出。以下是使用函数式API构建神经网络的代码示例:
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
# 创建层
input_layer = Input(shape=(3,))
Layer_1 = Dense(4, activation="relu")(input_layer)
Layer_2 = Dense(4, activation="relu")(Layer_1)
output_layer = Dense(1, activation="linear")(Layer_2)
# 定义模型
model = Model(inputs=input_layer, outputs=output_layer)
# 定义优化器和损失函数
model.compile(optimizer='adam', loss='mse')
# 训练模型
model.fit(X_train, y_train, epochs=400, batch_size=128, validation_data=(X_test, y_test))
函数式API允许构建更复杂的模型,例如预测多个输出。以下是一个实际案例,使用函数式API预测电力厂的能源输出和排气真空:
import numpy as np
import pandas as pd
import tensorflow as tf
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
import matplotlib.pyplot as plt
# 导入数据集
df = pd.read_excel('Folds5x2_pp.xlsx')
# 定义函数获取模型输出
def get_outputs(data):
y1 = data.pop('PE')
y1 = np.array(y1)
y2 = data.pop('V')
y2 = np.array(y2)
return y1, y2
# 划分数据集
train, test = train_test_split(df, test_size=0.2, random_state=1)
# 获取训练和测试数据的输出
y_train = get_outputs(train)
y_test = get_outputs(test)
# 缩放输入数据
min_max = MinMaxScaler()
X_train = min_max.fit_transform(train)
X_test = min_max.transform(test)
# 导入神经网络所需的库
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Dense
# 构建神经网络
input_layer = Input(shape=(3,), name='input_layer')
Layer_1 = Dense(10, activation="relu", name='Layer_1')(input_layer)
Layer_2 = Dense(10, activation="relu", name='Layer_2')(Layer_1)
y1_output = Dense(1, activation="linear", name='y1_output')(Layer_2)
Branched_layer = Dense(10, activation="relu", name='Branched_layer')(Layer_2)
y2_output = Dense(1, activation="linear", name='y2_output')(Branched_layer)
# 定义模型
model = Model(inputs=input_layer, outputs=[y1_output, y2_output])
# 模型摘要
model.summary()
# 定义优化器和损失函数
model.compile(optimizer='adam',
loss={'y1_output': 'mse', 'y2_output': 'mse'})
# 训练模型
model.fit(X_train, y_train,
epochs=1000, batch_size=128, validation_data=(X_test, y_test))