巩义旅游网站建设公司/网络seo首页

巩义旅游网站建设公司,网络seo首页,网站的大图传不上去是怎么回事,网站开发的基本知识从零到精通的迁移学习实战指南:以Keras和EfficientNet为例 一、为什么我们需要迁移学习? 1.1 人类的学习智慧 想象一下:如果一个已经会弹钢琴的人学习吉他,会比完全不懂音乐的人快得多。因为TA已经掌握了乐理知识、节奏感和手指…

从零到精通的迁移学习实战指南:以Keras和EfficientNet为例

一、为什么我们需要迁移学习?

1.1 人类的学习智慧

想象一下:如果一个已经会弹钢琴的人学习吉他,会比完全不懂音乐的人快得多。因为TA已经掌握了乐理知识、节奏感和手指灵活性,这些都可以迁移到新乐器的学习中。这正是迁移学习(Transfer Learning)的核心思想——将已掌握的知识迁移到新任务中。

1.2 深度学习的困境与破局

传统深度学习需要:

  • 大量标注数据
  • 长时间的训练
  • 高昂的计算资源

而迁移学习可以:

  • 在较少的数据上进行训练
  • 快速适应新任务
  • 节省计算资源

二、迁移学习核心技术解析

2.1 核心概念

迁移学习是指将预训练模型在一个任务上学习到的知识迁移到另一个相关任务中。在迁移学习中,我们可以利用已有的模型参数,减少训练时间并提高模型的性能。

2.2 方法论全景图

方法类型数据量要求训练策略适用场景
特征提取少量冻结全部预训练层快速原型开发
部分微调中等解冻部分高层领域适配
端到端微调大量解冻全部层,调整学习率专业领域应用

三、EfficientNet:效率与精度的完美平衡

3.1 模型设计哲学

通过复合缩放(Compound Scaling)统一调整:

  • 网络宽度
  • 深度
  • 分辨率

EfficientNet各版本参数对比

models = {'B0': (224, 0.7),'B3': (300, 1.2),'B7': (600, 2.0)
}

3.2 性能优势

在ImageNet上达到84.4% Top-1准确率,同时:

较小的模型大小
高效的计算性能
适用于多种深度学习任务

四、Keras实战:花卉分类系统开发

4.1 环境准备

import tensorflow as tf
from tensorflow.keras import layers, models
from tensorflow.keras.applications import EfficientNetB0
from tensorflow.keras.preprocessing.image import ImageDataGenerator

4.2 牛津花卉数据集处理

# 数据路径配置
train_dir = 'flower_photos/train'
val_dir = 'flower_photos/validation'# 数据增强配置
train_datagen = ImageDataGenerator(rescale=1./255,rotation_range=40,width_shift_range=0.2,height_shift_range=0.2,shear_range=0.2,zoom_range=0.2,horizontal_flip=True)# 数据流生成
train_generator = train_datagen.flow_from_directory(train_dir,target_size=(224, 224),batch_size=32,class_mode='categorical')val_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(val_dir,target_size=(224, 224),batch_size=32,class_mode='categorical')

ImageDataGenerator 是 Keras 提供的一个类,用于对图片进行实时的数据增强,以提升模型的泛化能力。

这里的配置表示:

  1. rescale=1./255:将像素值归一化为 [0, 1] 之间,因为图像的原始像素值通常是 [0, 255],这种归一化能够帮助加速训练过程。
  2. rotation_range=40:随机旋转图像,角度范围为 -40 到 +40 度。
  3. width_shift_range=0.2:在水平方向上随机平移图像,平移的范围是原图宽度的 20%。
  4. height_shift_range=0.2:在垂直方向上随机平移图像,平移的范围是原图高度的 20%。
  5. shear_range=0.2:对图像进行错切变换,错切的范围为 20%。
  6. zoom_range=0.2:随机缩放图像,缩放的范围是原图的 80% 到 120%。
  7. horizontal_flip=True:随机水平翻转图像。

4.3 模型构建策略

特征提取模式:

def build_model(num_classes):base_model = EfficientNetB0(include_top=False,weights='imagenet',input_shape=(224, 224, 3))# 冻结基础模型base_model.trainable = Falseinputs = tf.keras.Input(shape=(224, 224, 3))x = base_model(inputs, training=False)x = layers.GlobalAveragePooling2D()(x)x = layers.Dense(256, activation='relu')(x)outputs = layers.Dense(num_classes, activation='softmax')(x)return tf.keras.Model(inputs, outputs)

代码解释:

  1. base_model中是加载预训练模型的代码,include_top=False表示不加载EfficientNetB0原始模型的全连接分类层(顶层),因为我们将自己设计分类器(即添加自定义的全连接层)。
  2. base_model.trainable = False将 base_model 的所有参数设置为不可训练,即冻结了EfficientNetB0模型的所有权重。
  3. x = base_model(inputs, training=False):将输入传递给冻结的EfficientNetB0模型,提取特征。这里的 training=False 表示在推理(预测)模式下不需要更新模型的权重(即保持冻结状态)。
  4. GlobalAveragePooling2D()(x):在卷积层输出后应用全局平均池化(Global Average Pooling)。这一层将每个特征图的空间维度(宽度和高度)通过取均值的方式降到 1,使得输出的形状变成 (batch_size, channels)。这种方法减少了参数量,避免了过拟合,并且比全连接层更高效。
  5. 接下来就是自定义分类头,activation='softmax'将输出转换为一个概率分布,用于多分类任务。

渐进式微调策略:

def unfreeze_layers(model, unfreeze_percent=0.2):num_layers = len(model.layers)unfreeze_from = int(num_layers * (1 - unfreeze_percent))for layer in model.layers[:unfreeze_from]:layer.trainable = Falsefor layer in model.layers[unfreeze_from:]:layer.trainable = Truereturn model

代码解释:

  1. 这段代码定义了一个 unfreeze_layers 函数,目的是解冻(unfreeze)一个深度学习模型中的部分层,使得这些层在训练过程中会更新其权重。
  2. 函数 unfreeze_layers 的参数:
    model:这是输入的 Keras 模型,通常是经过预训练的模型(例如 EfficientNet、ResNet 等)。
    unfreeze_percent:这是一个浮动参数,表示要解冻的层所占模型总层数的百分比。默认值为 0.2,意味着解冻模型的 20% 层。
  3. model.layers 是一个包含模型所有层的列表,len(model.layers) 获取该列表中的层数,即模型的总层数。

4.4 训练配置技巧

model = build_model(5)  # 假设有5类花卉# 自定义学习率调度器
lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate=1e-3,decay_steps=1000,decay_rate=0.9)# 优化器配置
optimizer = tf.keras.optimizers.Adam(learning_rate=lr_schedule)model.compile(optimizer=optimizer,loss='categorical_crossentropy',metrics=['accuracy'])# 回调配置
callbacks = [tf.keras.callbacks.EarlyStopping(patience=3),tf.keras.callbacks.ModelCheckpoint('best_model.h5'),tf.keras.callbacks.TensorBoard(log_dir='./logs')
]# 启动训练
history = model.fit(train_generator,epochs=20,validation_data=val_generator,callbacks=callbacks)

代码解释:

  1. 模型构建:定义了一个用于分类花卉的模型。
  2. 学习率调度:使用指数衰减来动态调整学习率,帮助模型更好地收敛。
  3. 优化器:使用 Adam 优化器,并将其与学习率调度器结合。
  4. 回调设置:配置了早停、模型保存和 TensorBoard 日志功能,以便监控训练过程和防止过拟合。
  5. 训练过程启动:通过 model.fit 启动训练,并进行多次迭代。

4.5 性能可视化分析

import matplotlib.pyplot as pltplt.figure(figsize=(12, 5))# 准确率曲线
plt.subplot(1, 2, 1)
plt.plot(history.history['accuracy'], label='Train Accuracy')
plt.plot(history.history['val_accuracy'], label='Val Accuracy')
plt.title('Training and Validation Accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')# 损失曲线
plt.subplot(1, 2, 2)
plt.plot(history.history['loss'], label='Train Loss')
plt.plot(history.history['val_loss'], label='Val Loss')
plt.title('Training and Validation Loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')plt.tight_layout()
plt.show()

五、性能优化进阶技巧

5.1 混合精度训练

tf.keras.mixed_precision.set_global_policy('mixed_float16')

5.2 动态数据增强

augment = tf.keras.Sequential([layers.RandomRotation(0.3),layers.RandomContrast(0.2),layers.RandomZoom(0.2)
])# 在模型内部集成增强层
inputs = tf.keras.Input(shape=(224, 224, 3))
x = augment(inputs)
x = base_model(x)
...

5.3 知识蒸馏

# 教师模型(大型EfficientNet)
teacher = EfficientNetB4(weights='imagenet')# 学生模型(小型EfficientNet)
student = EfficientNetB0()# 蒸馏损失计算
def distillation_loss(y_true, y_pred):alpha = 0.1return alpha * keras.losses.categorical_crossentropy(y_true, y_pred) + \(1-alpha) * keras.losses.kl_divergence(teacher_outputs, student_outputs)

六、模型部署与生产化

6.1 模型轻量化

converter = tf.lite.TFLiteConverter.from_keras_model(model)
tflite_model = converter.convert()with open('flower_model.tflite', 'wb') as f:f.write(tflite_model)

6.2 API服务化

from flask import Flask, request, jsonifyapp = Flask(__name__)
model = tf.keras.models.load_model('best_model.h5')@app.route('/predict', methods=['POST'])
def predict():img = preprocess_image(request.files['image'])prediction = model.predict(img)return jsonify({'class': decode_prediction(prediction)})

可运行的完整代码如下:

大家可以根据这个最基础的代码,一步一步加上数据增强,回调,微调等操作进行练习。

import tensorflow as tf
from tensorflow.keras.preprocessing.image import ImageDataGenerator
from tensorflow.keras import layers
from tensorflow.keras.applications import EfficientNetB0
import matplotlib.pyplot as plt# 数据路径配置
base_dir = 'flower_photos'  # 包含所有花卉的主文件夹路径# 数据生成器配置(简化)
train_datagen = ImageDataGenerator(rescale=1./255)  # 仅进行归一化# 数据流生成(训练集)
train_generator = train_datagen.flow_from_directory(base_dir,target_size=(224, 224),batch_size=32,class_mode='categorical'
)# 数据流生成(验证集)
val_generator = ImageDataGenerator(rescale=1./255).flow_from_directory(base_dir,target_size=(224, 224),batch_size=32

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/897948.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 手机启动过程

梳理 为了梳理思路,笔者画了一幅关于 Android 手机启动的过程图片内容纯属个人见解,如有错误,欢迎各位指正

【Linux】:封装线程

朋友们、伙计们,我们又见面了,本期来给大家带来封装线程相关的知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! C 语 言 专 栏:C语言:从入门到精通 数据结…

星越L_三角指示牌及危险警示灯使用

目录 1.打开危险警告灯 2.取出反光背心穿上 3.取出指示牌 4.放置三角指示牌。 1.打开危险警示灯 2.取出反光背心穿上 3.取出指示牌

AI与人的智能,改变一生的思维模型【7】易得性偏差

目录 **易得性偏差思维模型:大脑的「热搜算法」与反操纵指南****病毒式定义:你的大脑正在被「热搜」劫持****四大核心攻击路径与史诗级案例****1. 信息过载时代的「认知短路」****2. 媒体放大器的「恐怖滤镜」****3. 个人经验的「数据暴政」****4. 社交茧…

Jmeter的简单使用

前置工作 确保java8 版本以上jmeter下载路径(选择Binaries):https://jmeter.apache.org/download_jmeter.cgi直接解压,找到bin下面的文件:jmeter.bat(可选)汉化,修改 jmeter.proper…

MyBatis源码分析の配置文件解析

文章目录 前言一、SqlSessionFactoryBuilder1.1、XMLConfigBuilder1.2、parse 二、mappers标签的解析2.1、cacheElement2.1.1、缓存策略 2.2、buildStatementFromContext2.2.1、sql的解析 前言 本篇主要介绍MyBatis源码中的配置文件解析部分。MyBatis是对于传统JDBC的封装&…

golang快速上手基础语法

变量 第一种,指定变量类型,声明后若不赋值,使用默认值0 package mainimport "fmt"func main() {var a int //第一种,指定变量类型,声明后若不赋值,使用默认值0。fmt.Printf(" a %d\n"…

工程实践:如何使用SU17无人机来实现室内巡检任务

阿木实验室最近发布了科研开发者版本的无人机SU17,该无人机上集成了四目视觉,三维激光雷达,云台吊舱,高算力的机载计算机,是一个非常合适的平台用于室内外巡检场景。同时阿木实验室维护了多个和无人机相关的开源项目。…

蓝桥杯嵌入式赛道复习笔记1(led点亮)

前言 基础的文件创建,参赛资源代码的导入,我就不说了,直接说CubeMX的配置以及代码逻辑思路的书写,在此我也预祝大家人人拿国奖 理论讲解 原理图简介 1.由于存在PC8引脚到PC15引脚存在冲突,那么官方硬件给的解决方案…

Linux进程1.0--task_struct

1.硬件:冯诺依曼体系结构: 单个分析:、 数据流向:数据必须先进入输入设备,再到存储器,然后由存储器给控制器,控制器收到以后进行相应的处理后,再传回存储器,存储器最终传…

代码随想录day17 二叉树part05

654.最大二叉树 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回 nums …

宇树人形机器人开源模型

1. 下载源码 https://github.com/unitreerobotics/unitree_ros.git2. 启动Gazebo roslaunch h1_description gazebo.launch3. 仿真效果 H1 GO2 B2 Laikago Z1 4. VMware: vmw_ioctl_command error Invalid argument 这个错误通常出现在虚拟机环境中运行需要OpenGL支持的应用…

通过特征值和特征向量实现的图像压缩和特征提取

前文,我们在学习人工智能的线性代数基础的时候,就了解到,矩阵在人工智能中被广泛使用,接下来我们就从大家非常常见的图像开始,深度理解矩阵在人工智能中的应用。有关线性代数基础的文章可以看的我CSDN:人工智能中的线性…

蓝桥杯2023年第十四届省赛真题-整数删除 暴力-->链表+小根堆

题目来自DOTCPP: 思路: ①每次找到数列中的最小值下标,然后用状态数组st标记它,相当与删除它,之后就不会访问它。 ②对最小值下标左边和右边判断一下,看有没有数字,如果有就把最小值加到两边第…

springboot438-基于SpringBoot的数字化教学资源管理系统(源码+数据库+纯前后端分离+部署讲解等)

💕💕作者: 爱笑学姐 💕💕个人简介:十年Java,Python美女程序员一枚,精通计算机专业前后端各类框架。 💕💕各类成品Java毕设 。javaweb,ssm&#xf…

蓝桥杯刷题——第十五届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组

一、0握手问题 - 蓝桥云课 算法代码&#xff1a; #include <iostream> using namespace std; int main() {int sum0;for(int i49;i>7;i--)sumi;cout<<sum<<endl;return 0; } 直接暴力&#xff0c;题意很清晰&#xff0c;累加即可。 二、0小球反弹 - 蓝…

跨境卫士跟vps哪个更好用?跨境卫士为卖家提供固定IP环境

跨境卫士是通过为卖家提供固定的环境 i p来隔离本地电脑环境&#xff0c;为卖家创造一个真实独立的物理环境&#xff0c;让买家再任意电脑&#xff0c;任意网络下都能够安全的管理账号。跨境卫士和紫鸟原理一样&#xff0c;是通过为卖家提供固定的环境 i p来隔离本地电脑环境&a…

coding ability 展开第四幕(滑动指针——巩固篇)超详细!!!!

文章目录 前言水果成篮思路 找到字符串中所有字母异位词思路 串联所有单词的子串思路 最小覆盖子串思路 总结 前言 本专栏上一篇博客&#xff0c;带着大家从认识滑动窗口到慢慢熟悉 相信大家对滑动窗口已经有了大概的认识 其实主要就是抓住——一段连续的区间 今天来学习一些滑…

Netty启动源码NioEventLoop剖析accept剖析read剖析write剖析

学习链接 NIO&Netty - 专栏 Netty核心技术十–Netty 核心源码剖析Netty核心技术九–TCP 粘包和拆包及解决方案Netty核心技术七–Google ProtobufNetty核心技术六–Netty核心模块组件Netty核心技术五–Netty高性能架构设计 聊聊Netty那些事儿 - 专栏 一文搞懂Netty发送数…

2024年12月CCF-GESP编程能力等级认证C++编程一级真题解析

一级真题的难度: ‌ CCF-GESP编程能力等级认证C++编程一级真题的难度适中‌。这些真题主要考察的是C++编程的基础知识、基本语法以及简单的算法逻辑。从搜索结果中可以看到,真题内容包括了选择题、编程题等题型,涉及的内容如C++表达式的计算、基本输入输出语句的理解…