Keras:改变训练模型的结构

如何解决Keras:改变训练模型的结构

我是机器学习的新手。我正在通过Keras锻炼自己来学习它。

Here is the video来自我最近的练习。我已经训练了卷积神经网络来识别三个不同的对象。手机将图像发送到运行Keras的台式机上的Web服务器。

花了一段时间才找到一个可行的模型。我首先在无菌背景下训练这三个对象的视频帧。我不知道这种技术是否有公认的名称,但我使用了一种“训练轮”方法。首先,我在非常简单的背景上训练了模型。然后在繁忙的背景上拍摄了更多视频。我做了6个回合,每个回合都有不同的背景。在每一轮中,我都加载了前几轮的权重,并在所有前几轮的组合数据集上训练了网络。这个想法是让神经网络从简单的事情开始,然后逐渐扩展其知识,而不是立即给它一个困难的任务。

这似乎可行,现在在不同背景下识别这些对象时,我的准确性很高。我已经将模型权重保存到文件中。

我的问题是:现在我拥有训练有素的网络,是否可以更改其结构?例如,现在我将图像裁剪并调整为64x64。如果我想将其提高到128x128,是否可以使用到目前为止训练过的权重?如果我想添加颜色(所以3个通道而不是1个)怎么办,而无需从头开始训练?

解决方法

对神经网络有一点了解。 神经网络架构的第一层学习简单的功能。
对于例如
考虑图像,第一层将学习检测水平或垂直边缘,随后将能够检测更复杂的特征。看看thisthis

现在,您拥有一个训练有素的神经网络,它具有很高的准确性,您想使用这些训练有素的权重,但同时又要更改架构。

保持模型常量的顶部并更改底层的体系结构:

如果您保持顶层不变并更改较低层的体系结构,则此方法将起作用。即。添加/删除密集层,添加/删除卷积层。

这是因为在上一层学习的功能负责下一层的功能。看一下this。如果更改第一层中的神经元数量,则特征表示将在随后的层中更改。

因此,如果在现有层上添加另一个卷积层,它将使用从训练后的模型生成的特征,并使用这些特征来学习甚至更复杂的特征。

现在,如果要使模型的顶部保持恒定,则必须使用训练模型时所用的相同输入格式。

更改部门:
更改输入时,参数数量以及可以处理该特定输入的图层类型都会发生变化。

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(3,3,input_shape=(64,64,1)),tf.keras.layers.Dense(512,activation=tf.nn.relu),tf.keras.layers.Dense(10,activation=tf.nn.softmax)
])
model.summary()

输出:

Model: "sequential_5"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_5 (Conv2D)            (None,62,3)         30        
_________________________________________________________________
dense_10 (Dense)             (None,512)       2048      
_________________________________________________________________
dense_11 (Dense)             (None,10)        5130      
=================================================================
Total params: 7,208
Trainable params: 7,208
Non-trainable params: 0

代码:

model = tf.keras.models.Sequential([
  tf.keras.layers.Conv2D(3,3)),activation=tf.nn.softmax)
])
model.summary()

输出:

Model: "sequential_6"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None,3)         84        
_________________________________________________________________
dense_12 (Dense)             (None,512)       2048      
_________________________________________________________________
dense_13 (Dense)             (None,262
Trainable params: 7,262
Non-trainable params: 0

如您所见,两个模型的参数都不同。因此,由于权重矩阵的尺寸不匹配,您将无法在一个模型中将权重用于第二个模型。

更改输入大小:

如果更改输入大小而不更改通道数,即。 (64,1)->(128,128,1)您的参数将保持不变。因此,您可以在新模型中使用以前训练过的砝码。
但是,要知道,学习到的权重取决于输入的大小。因此,对于(64,1)而言,效果最佳的不一定对(128,128,1)而言,但可以作为良好的初始化权重。

在经过培训的体系结构之前添加未经培训的层:

这是行不通的,因为如前所述,前一层生成的要素负责下一层的要素。如果上一层的特征发生变化,则下一层的特征应发生相应的变化。

要点:

  1. 如果要使用预先训练的模型,请将模型保留为新体系结构的顶部,并使用与训练预先训练的模型相同的输入结构。

  2. 如果要更改渠道数量,最好从头开始训练模型。

  3. 如果要更改输入大小,可以使用预先训练的模型权重作为一个很好的起点。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-