本篇技术博文摘要 🌟

  • 文章开篇介绍了Keras的核心特点,即其用户友好、模块化和易扩展性。随后详细阐释了其三大核心概念模型(Model)​ 作为构建的容器、层(Layer)​ 作为基础构建块,以及激活函数(Activation Function)​ 在网络中的非线性作用。
  • 核心部分围绕Keras的五大基本工作流程展开:定义、编译、训练、评估与预测模型,并辅以具体代码示例。
  • 文中对常用层(如Dense, Conv2D, LSTM)进行了详解,并专门阐述了模型保存与加载的多种策略,以满足不同场景需求。
  • 此外,文章深入介绍了回调函数(Callbacks)​ 这一强大工具,用于在训练过程中实现监控与干预。通过一个完整的MNIST手写数字识别实践示例,将前述理论串联为可运行的解决方案。
  • 进阶技巧部分,文章引导读者探索自定义层、自定义损失函数以及学习率调度等高级功能,以突破框架限制。
  • 最后,针对实际开发中常见的过拟合、训练速度慢、梯度消失/爆炸等问题,提供了切实可行的解决方案与调优思路,使本指南兼具理论深度与实践价值。

引言 📘

  • 在这个变幻莫测、快速发展的技术时代,与时俱进是每个IT工程师的必修课。
  • 我是盛透侧视攻城狮,一个“什么都会一丢丢”的网络安全工程师,目前正全力转向AI大模型安全开发新战场。作为活跃于各大技术社区的探索者与布道者,期待与大家交流碰撞,一起应对智能时代的安全挑战和机遇潮流。

上节回顾

目录

本篇技术博文摘要 🌟

引言 📘

上节回顾

1.TensorFlow 高级 API - Keras

1.1Keras 的主要特点

2.Keras 核心概念介绍

2.1 模型 (Model)

2.2层 (Layer)

2.3激活函数 (Activation Function)

3.Keras 基本工作流程

3.1定义模型及示例

3.2编译模型及示例

3.3训练模型及示例

3.4评估模型及示例

3.5进行预测及示例

4.Keras 常用层详解

4.1Dense 全连接层及示例

4.2Conv2D 二维卷积层及示例

4.3LSTM 长短期记忆网络层

5.Keras 模型保存与加载

5.1保存整个模型及示例

5.2仅保存架构及示例

5.3仅保存权重及示例

5.4加载模型及示例

6.Keras 回调函数介绍

6.1常用回调函数及示例

7.Keras 实践示例之MNIST 手写数字识别

8.Keras 进阶技巧

8.1自定义层及示例

8.2 自定义损失函数及示例

8.3学习率调度及示例

9.Keras 常见问题与解决方案

9.1过拟合问题

9.2训练速度慢

9.3梯度消失/爆炸

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现


1.TensorFlow 高级 API - Keras

  • Keras 是一个用 Python 编写的高级神经网络 API,它能够以 TensorFlow, CNTK 或 Theano 作为后端运行。Keras 的设计理念是用户友好、模块化和易扩展。

1.1Keras 的主要特点

  1. 简单易用:提供直观一致的接口,适合快速原型设计
  2. 模块化:神经网络层、损失函数、优化器等都是可插拔的模块
  3. 易扩展:可以轻松添加新模块来表达新的研究想法
  4. 支持多后端:可以无缝运行在 TensorFlow, CNTK 或 Theano 上

2.Keras 核心概念介绍

2.1 模型 (Model)

  • Keras 的核心数据结构是模型,模型是组织神经网络层的方式。Keras 提供了两种主要的模型:

    • Sequential 模型:层的线性堆叠
    • Functional API:构建复杂模型的有向无环图

2.2层 (Layer)

  • 层是 Keras 的基本构建块,每个层接收输入数据,进行某种计算后输出结果。Keras 提供了多种预定义层:

    • 核心层:Dense, Activation, Dropout 等
    • 卷积层:Conv2D, MaxPooling2D 等
    • 循环层:LSTM, GRU 等
    • 其他:Embedding, BatchNormalization 等

2.3激活函数 (Activation Function)

  • 激活函数决定神经元的输出,常用的有:

    • ReLU (Rectified Linear Unit)
    • Sigmoid
    • Tanh
    • Softmax (多分类问题)

3.Keras 基本工作流程

3.1定义模型及示例

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense

model = Sequential([
    Dense(64, activation='relu', input_shape=(784,)),
    Dense(64, activation='relu'),
    Dense(10, activation='softmax')
])

3.2编译模型及示例

model.compile(optimizer='adam',
              loss='categorical_crossentropy',
              metrics=['accuracy'])

3.3训练模型及示例

model.fit(x_train, y_train, 
          epochs=5, 
          batch_size=32)

3.4评估模型及示例

loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128)

3.5进行预测及示例

classes = model.predict(x_test, batch_size=128)

4.Keras 常用层详解

4.1Dense 全连接层及示例

Dense(units, 
      activation=None, 
      use_bias=True, 
      kernel_initializer='glorot_uniform', 
      bias_initializer='zeros')
  • units:正整数,输出空间的维度
  • activation:激活函数
  • use_bias:是否使用偏置向量
  • kernel_initializer:权重矩阵的初始化器
  • bias_initializer:偏置向量的初始化器

4.2Conv2D 二维卷积层及示例

Conv2D(filters, 
       kernel_size, 
       strides=(1, 1), 
       padding='valid', 
       activation=None)
  • filters:卷积核的数目
  • kernel_size:卷积核的尺寸
  • strides:卷积步长
  • padding:填充方式 ('valid' 或 'same')

4.3LSTM 长短期记忆网络层

LSTM(units, 
     activation='tanh', 
     recurrent_activation='hard_sigmoid', 
     return_sequences=False)
  • units:正整数,输出空间的维度
  • activation:激活函数
  • recurrent_activation:循环步的激活函数
  • return_sequences:是否返回完整序列

5.Keras 模型保存与加载

5.1保存整个模型及示例

model.save('my_model.h5')  # 保存架构、权重和训练配置

5.2仅保存架构及示例

json_string = model.to_json()  # 保存为JSON
yaml_string = model.to_yaml()  # 保存为YAML

5.3仅保存权重及示例

model.save_weights('my_model_weights.h5')

5.4加载模型及示例

from tensorflow.keras.models import load_model

model = load_model('my_model.h5')  # 加载完整模型

6.Keras 回调函数介绍

  • 回调函数是在训练过程中特定时间点被调用的函数,用于:

    • 模型检查点
    • 提前停止
    • 学习率调整
    • 日志记录等

6.1常用回调函数及示例

from tensorflow.keras.callbacks import ModelCheckpoint, EarlyStopping

callbacks = [
    ModelCheckpoint(filepath='best_model.h5', monitor='val_loss', save_best_only=True),
    EarlyStopping(monitor='val_loss', patience=3)
]

model.fit(x_train, y_train, 
          epochs=10, 
          callbacks=callbacks, 
          validation_data=(x_val, y_val))

7.Keras 实践示例之MNIST 手写数字识别

from tensorflow.keras.datasets import mnist
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Dropout, Flatten
from tensorflow.keras.layers import Conv2D, MaxPooling2D
from tensorflow.keras.utils import to_categorical

# 加载数据
(x_train, y_train), (x_test, y_test) = mnist.load_data()

# 数据预处理
x_train = x_train.reshape(60000, 28, 28, 1).astype('float32') / 255
x_test = x_test.reshape(10000, 28, 28, 1).astype('float32') / 255
y_train = to_categorical(y_train, 10)
y_test = to_categorical(y_test, 10)

# 构建模型
model = Sequential([
    Conv2D(32, kernel_size=(3, 3), activation='relu', input_shape=(28, 28, 1)),
    Conv2D(64, (3, 3), activation='relu'),
    MaxPooling2D(pool_size=(2, 2)),
    Dropout(0.25),
    Flatten(),
    Dense(128, activation='relu'),
    Dropout(0.5),
    Dense(10, activation='softmax')
])

# 编译模型
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# 训练模型
model.fit(x_train, y_train,
          batch_size=128,
          epochs=12,
          verbose=1,
          validation_data=(x_test, y_test))

# 评估模型
score = model.evaluate(x_test, y_test, verbose=0)
print('Test loss:', score[0])
print('Test accuracy:', score[1])

8.Keras 进阶技巧

8.1自定义层及示例

from tensorflow.keras import backend as K
from tensorflow.keras.layers import Layer

class MyLayer(Layer):
    """自定义Keras层示例,实现全连接线性变换"""
    
    def __init__(self, output_dim, **kwargs):
        """
        初始化方法,定义层的参数
        
        参数:
            output_dim: 输出维度,即本层输出的大小
            **kwargs: 其他传递给父类Layer的参数
        """
        self.output_dim = output_dim
        # 调用父类的初始化方法
        super(MyLayer, self).__init__(**kwargs)
    
    def build(self, input_shape):
        """
        构建方法,在第一次调用call前自动执行
        用于创建可训练的权重参数
        
        参数:
            input_shape: 输入张量的形状
        """
        # 创建权重矩阵,形状为(输入维度, 输出维度)
        self.kernel = self.add_weight(
            name='kernel',  # 权重的名称
            shape=(input_shape[1], self.output_dim),  # 权重形状
            initializer='uniform',  # 初始化器,使用均匀分布
            trainable=True  # 设为可训练参数
        )
        # 调用父类的build方法完成构建
        super(MyLayer, self).build(input_shape)
    
    def call(self, x):
        """
        前向传播方法,定义层的计算逻辑
        
        参数:
            x: 输入张量
        返回:
            经过线性变换的输出张量
        """
        # 执行矩阵乘法: x与权重kernel相乘
        return K.dot(x, self.kernel)
    
    def compute_output_shape(self, input_shape):
        """
        计算输出形状的方法
        
        参数:
            input_shape: 输入张量的形状
        返回:
            输出张量的形状
        """
        # 输出形状为(批量大小, 输出维度)
        return (input_shape[0], self.output_dim)
    
    def get_config(self):
        """
        获取层配置的方法,用于保存和加载模型
        返回包含层配置的字典
        """
        config = super(MyLayer, self).get_config()
        config.update({'output_dim': self.output_dim})
        return config

8.2 自定义损失函数及示例

from tensorflow.keras import backend as K

def custom_loss(y_true, y_pred):
    return K.mean(K.square(y_pred - y_true), axis=-1)

model.compile(optimizer='adam', loss=custom_loss)

8.3学习率调度及示例

from tensorflow.keras.callbacks import LearningRateScheduler

def scheduler(epoch, lr):
    if epoch < 10:
        return lr
    else:
        return lr * K.exp(-0.1)

callback = LearningRateScheduler(scheduler)
model.fit(x_train, y_train, epochs=15, callbacks=[callback])

9.Keras 常见问题与解决方案

9.1过拟合问题

  • 增加 Dropout 层
  • 使用 L1/L2 正则化
  • 增加训练数据
  • 使用数据增强

9.2训练速度慢

  • 增加批量大小
  • 使用更简单的模型
  • 尝试不同的优化器
  • 使用 GPU 加速

9.3梯度消失/爆炸

  • 使用 BatchNormalization
  • 使用适当的权重初始化
  • 使用 ReLU 等非饱和激活函数
  • 使用梯度裁剪

欢迎各位彦祖与热巴畅游本人专栏与技术博客

你的三连是我最大的动力

点击➡️指向的专栏名即可闪现

➡️计算机组成原理

➡️操作系统

➡️渗透终极之红队攻击行动 

➡️动画可视化数据结构与算法

➡️ 永恒之心蓝队联纵合横防御

➡️华为高级网络工程师

➡️华为高级防火墙防御集成部署

 ➡️ 未授权访问漏洞横向渗透利用

 ➡️逆向软件破解工程

➡️MYSQL REDIS 进阶实操

➡️红帽高级工程师

➡️红帽系统管理员

 ➡️HVV 全国各地面试题汇总

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐