thetwo--TO BE BETTER!!!

紧随上一篇,我们已经设置好了一些参数,下面我们来定义模型:

代码如下:

import typing
import tensorflow as tf
import theone
def get_vgg19_model(layers):"""初始化并创建vgg19模型:param layers::return:"""#加载imagenet上预训练的vgg19#include_top=False表示不包含模块的顶层也就是全链接层#weights='imagenet'表示使用在Imagenet数据集上的预训练权重加载模型vgg=tf.keras.applications.VGG19(include_top=False,weights='imagenet')#提取需要被用到的vgg层的outputoutputs=[vgg.get_layer(layer).output for layer in layers]#使用outputs创建新的模型model=tf.keras.Model([vgg.input, ],outputs)#锁死参数,不进行训练model.trainable=Falsereturn model
class NeuralStyleTransferModel(tf.keras.Model):def __init__(self, content_layers:typing.Dict[str,float]= theone.CONTENT_LAYERS,style_layers:typing.Dict[str,float]= theone.STYLE_LAYERS):super(NeuralStyleTransferModel,self).__init__()#内容特征层字典DICT[层名,加权系数]self.content_layers=content_layers#风格特征层self.style_layers=style_layers#提取需要用到的所有vgg层layers=list(self.content_layers.keys())+list(self.style_layers.keys())#创建layer_name到output索引的映射self.outputs_index_map=dict(zip(layers,range(len(layers))))#创建并初始化vgg网络self.vgg=get_vgg19_model(layers)def call(self,inputs,training=None,mask=None):"""前向传播::returntyping.Dict[str,typing.List[outputs,加权系数]"""outputs=self.vgg(inputs)#分离内容特征层和风格特征层的输出,方便后续计算typing.List[outputs,加权系数]content_outputs=[]for layer,factor in self.content_layers.items():content_outputs.append((outputs[self.outputs_index_map[layer]][0],factor))style_outputs=[]for layer,factor in self.style_layers.items():style_outputs.append((outputs[self.outputs_index_map[layer]][0],factor))#以字典形式返回输出return {'content':content_outputs,'style':style_outputs}

下面看分析:

先来看这段代码:

def get_vgg19_model(layers):"""初始化并创建vgg19模型:param layers::return:"""#加载imagenet上预训练的vgg19#include_top=False表示不包含模块的顶层也就是全链接层#weights='imagenet'表示使用在Imagenet数据集上的预训练权重加载模型vgg=tf.keras.applications.VGG19(include_top=False,weights='imagenet')#提取需要被用到的vgg层的outputoutputs=[vgg.get_layer(layer).output for layer in layers]#使用outputs创建新的模型model=tf.keras.Model([vgg.input, ],outputs)#锁死参数,不进行训练model.trainable=Falsereturn model

vgg=tf.keras.applications.VGG19(include_top=False,weights='imagenet')
调用VGG19模型,其中include_top=False表示不包含模块的顶层,也就是全连接层。只包含卷积层。weight='imagenet'表示使用在imagenet数据集上的训练权重加载模型。

具体来说,当我们使用VGG19,ResNet50,InceptionV3等经典的神经网络模型时,这些模型通常在大规模图像数据集ImageNet上进行了预训练,在预训练过程中,模型通过学习大量的图像样本来提取特征,并对这些样本进行分类。当我们自己在任务中使用这些预训练模型时,我们可以选择是否加载预训练权重。如果我们将weights='imagenet'设置为true。在实例化模型的时候,TensorFlow会自动下载并加载在ImageNet数据集上预训练的权重。这样做的好处是,模型会具有较好的初始特征提取能力,通常能够提高模型的性能和收敛速度。

outputs=[vgg.get_layer(layer).output for layer in layers]

这段代码创建了一个列表'outputs',其中包含了VGG模型中指定层的输出。
这段代码使用列表推导式,遍历layers中每个层名layer,并为每个层名获取其对应的输出张量,然后将这些输出张量存储在列表‘outputs’中。

总体而言就是根据传入的层列表layers提取需要的VGG层输出(加载预训练模型的权重)。

model=tf.keras.Model([vgg.input, ],outputs)

tf.keras.Model是Keras中用于创建模型的类。
[vgg.input, ]这个列表包含了模型的输入张量,其中vgg.input表示了VGG的输入张量。
在Keras中,模型的输入层可以通过模型的.input属性来访问。
为什么要将其打包成一个列表呢?
tf.keras.Model类构造函数需要接受输入参数的列表。当然,只有一个元素,将其写成[vgg.input]其实也可以。
outputs是一个列表,包含了VGG模型中指定层的输出张量,这些张量将作为新模型的输出。

总的而言就是使用tf.keras.Model类创建了一个新的模型,指定了模型的输入和输出。

model.trainable=False是指定模型的参数不可训练,即在模型进行反向传播算法优化参数时,这些参数不会被更新,意味着模型的参数将不会参与训练过程,他们的值将会保持不变,这通常用于在迁移学习或特定场景下,固定住某些层的参数,只训练模型的部分参数,或者在指定的任务中只使用模型的特征提取能力而不更新模型的参数。(显然使用的参数是预训练模型上的,具有很高的可靠性,训练反而会使可靠性降低)。

接下来我们看:

class NeuralStyleTransferModel(tf.keras.Model):def __init__(self, content_layers:typing.Dict[str,float]= theone.CONTENT_LAYERS,style_layers:typing.Dict[str,float]= theone.STYLE_LAYERS):super(NeuralStyleTransferModel,self).__init__()#内容特征层字典DICT[层名,加权系数]self.content_layers=content_layers#风格特征层self.style_layers=style_layers#提取需要用到的所有vgg层layers=list(self.content_layers.keys())+list(self.style_layers.keys())#创建layer_name到output索引的映射self.outputs_index_map=dict(zip(layers,range(len(layers))))#创建并初始化vgg网络self.vgg=get_vgg19_model(layers)

我们定义了一个名为NeuralStyleTransferModel的自定义神经风格迁移模型类,继承自tf.keras.Model类。表示这个类是一个Keras模型。

def __init__(self, content_layers:typing.Dict[str,float]= theone.CONTENT_LAYERS, style_layers:typing.Dict[str,float]= theone.STYLE_LAYERS): super(NeuralStyleTransferModel,self).__init__()

这是一个构造函数,在创建类的实例时会自动调用。
content_layers和style_layers是构造函数的参数,它们指定了内容特征层和风格特征层以及它们的加权系数。格式就是字典类型,使用content_layers:typing.Dict[str,float]无非就是一个注释功能。
当然我们可以选择:(个人认为这种方法更简洁,源码更能凸显参数类型)。

def __init__(self, content_layers=theone.CONTENT_LAYERS, style_layers=theone.STYLE_LAYERS):
    super(NeuralStyleTransferModel, self).__init__()
 

self.content_layers=content_layers,为什么在构造函数中已经初始化content之后还要再初始化?

在构造函数中通过参数传入的content_layers和style_layers变量仅在构造函数内部可见,并且只在构造函数执行过程中有效,为了在整个类中都能访问这些变量,我们需要将它们保存为类的实例变量,以便在类的其他方法中也能使用它们。

layers = list(self.content_layers.keys()) + list(self.style_layers.keys())

这段代码将内容特征层和风格特征层的层名合并为一个列表layers,得到一个包含所有层名的列表。

self.outputs_index_map = dict(zip(layers, range(len(layers))))

创建一个字典outputs_index_map,用于将层名与它们在VGG模型输出列表中的索引位置相对应。
range(len(layers))生成一个从0到len(layers)-1的整数序列,其长度与列表layers的长度相同。
zip(layers,range(len(layers))):将两个列表中的元素逐一配对,形成一个可迭代的元组序列,每个元组中包含了layers中的一个元素和对应的range(len(layers))中的元素。

self.vgg = get_vgg19_model(layers)

这段代码调用一个函数get_vgg19_model()并传入层列表layers作为参数。
这个函数的作用是创建并初始化一个VGG19的网络模型,其中包含了指定层名的部分,用于提取图像的特征。
用于后面提取图像的特征。

最后一个模块,写完收工:

def call(self,inputs,training=None,mask=None):"""前向传播::returntyping.Dict[str,typing.List[outputs,加权系数]"""outputs=self.vgg(inputs)#分离内容特征层和风格特征层的输出,方便后续计算typing.List[outputs,加权系数]content_outputs=[]for layer,factor in self.content_layers.items():content_outputs.append((outputs[self.outputs_index_map[layer]][0],factor))style_outputs=[]for layer,factor in self.style_layers.items():style_outputs.append((outputs[self.outputs_index_map[layer]][0],factor))#以字典形式返回输出return {'content':content_outputs,'style':style_outputs}

这个模型时前向传播模型:

def call(self,inputs,training=None,mask=None):

input是模型输入数据。training表示模型是否处于训练模式,如果为True表示模型正在训练中,在训练模式下,模型通常会执行一些特定的操作。training=False表示处于推断模式(测试模式或者评估模式),在推断模式下,模型可能会有一些与训练不同的行为。training=None的时候,表示模型的训练模式将由框架自动确定,通常情况下,在调用模型的时候,如果没有显式指定训练模式,框架会自动将模型置于推断模式下。

mask=None

如果mask被指定为一个张量(tensor),那么模型的计算将会受到这个掩码的影响,掩码可以指示哪些位置的输入需要被忽略或者被加权。
当mask=None时,表示没有提供掩码,模型在计算时将不会考虑额外的掩码信息。

outputs=self.vgg(inputs)

由前面的可知,vgg是一个模型,通过向get_vgg19_model中传入层(layers)得到。将inputs传入得到outputs输出。

for layer,factor in self.content_layers.items(): content_outputs.append((outputs[self.outputs_index_map[layer]][0],factor))

重点就是看outputs[self.outputs_index_map[layer]]

self.outputs_index_map是一个将层名称映射到输出索引的字典,[self.outputs_index_map[layer]]得到的是一个数值(索引),在outputs中的索引,后面的[0]表示取该元素outputs的该索引处对应的元素的第一个元素。通常是因为特征表示是一个张量的数组,而我们只需要其中的一个特征。
而factor表示的是与特征表示相关联的因子或权重,在风格迁移中,这个因子常用于调整特征表示的权重。

整体而言,这个元组表示了一个特征表示(通过outputs和self.outputs_index_map获取)和与之相关联的权重或因子的组合。

return {'content':content_outputs,'style':style_outputs}

最后将得到的字典以字典的形式返回。



 

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

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

相关文章

vscode与vue/react环境配置

一、下载并安装VScode 安装VScode 官网下载 二、配置node.js环境 安装node.js 官网下载 会自动配置环境变量和安装npm包(npm的作用就是对Node.js依赖的包进行管理),此时可以执行 node -v 和 npm -v 分别查看node和npm的版本号: 配置系统变量 因为在执…

机器学习:朴素贝叶斯算法(Python)

一、朴素贝叶斯算法的实现 naive_bayes_classifier.py import numpy as np import collections as cc # 集合的计数功能 from scipy.stats import norm # 极大似然估计样本的均值和标准方差 from data_bin_wrapper import DataBinsWrapperclass NaiveBayesClassifier:"…

Python分支和循环结构及其应用(文末送书)

一、分支结构 应用场景 我们写的Python代码都是一条一条语句顺序执行,这种代码结构通常称之为顺序结构。然而仅有顺序结构并不能解决所有的问题。 if语句的使用 在Python中,要构造分支结构可以使用if、elif和else关键字。所谓关键字就是有特殊含义的…

SpringCloud(17)之SpringCloud Stream

一、Spring Cloud Stream介绍 Spring Cloud Stream是一个框架,用于构建与共享消息系统连接的高度可扩展的事件驱动微服务。该框架提供了一个灵活的编程模型,该模型建立在已经建立和熟悉的Spring习惯用法和最佳实践之上,包括对持久发布/子语义…

腾讯云4核8G服务器优惠价格表(轻量+CVM)

腾讯云4核8G服务器多少钱?轻量应用服务器4核8G12M带宽一年446元、646元15个月,云服务器CVM标准型S5实例4核8G配置价格15个月1437.3元,5年6490.44元,标准型SA2服务器1444.8元一年,在txy.wiki可以查询详细配置和精准报价…

ChatGPT带火的HBM是什么?

“ChatGPT是人工智能领域的iPhone时刻,也是计算领域有史以来最伟大的技术之一。” 英伟达创始人兼CEO黄仁勋此前这样盛赞ChatGPT。 ChatGPT突然爆火,对大算力芯片提出了更高更多的要求。近日,据韩国经济日报报道,受惠于ChatGPT&am…

[rust] 10 project, crate, mod, pub, use: 项目目录层级组织, 概念和实战

文章目录 一 项目目录层级组织概念1.1 cargo new 创建同名 的 Project 和 crate1.2 多 crate 的 package1.3 mod 模块1.3.1 创建嵌套 mod1.3.2 mod 树1.3.3 用路径引用 mod1.3.3.1 使用绝对还是相对? 1.3.4 代码可见性1.3.4.1 pub 关键字1.3.4.2 用 super 引用 mod1.3.4.3 用 …

Linux之安装jdk,tomcat,mysql,部署项目

目录 一、操作流程 1.1安装jdk 1.2安装tomcat(加创建自启动脚本) 1.3 安装mysql 1.4部署项目 一、操作流程 首先把需要用的包放进opt文件下 1.1安装jdk 把jdk解压到/usr/local/java里 在刚刚放解压包的文件夹打开vim /etc/profile编辑器&#xff0c…

普中51单片机学习(8*8LED点阵)

8*8LED点阵 实验代码 #include "reg52.h" #include "intrins.h"typedef unsigned int u16; typedef unsigned char u8; u8 lednum0x80;sbit SHCPP3^6; sbit SERP3^4; sbit STCPP3^5;void HC595SENDBYTE(u8 dat) {u8 a;SHCP1;STCP1;for(a0;a<8;a){SERd…

第十一章——期约与异步函数(上)——异步编程、期约

ECMAScript 6及之后的几个版本逐步加大了对异步编程机制的支持&#xff0c;提供了令人眼前一亮的新特性。ECMAScript 6新增了正式的Promise&#xff08;期约&#xff09;引用类型&#xff0c;支持优雅地定义和组织异步逻辑。接下来几个版本增加了使用async和await关键字定义异步…

[回溯]复原ip地址

有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔。 例如&#xff1a;"0.1.2.201" 和 "192.168.1.1" 是 有效 IP 地址&#xff0c;但是 "0.011.255.2…

【GameFramework框架内置模块】4、内置模块之调试器(Debugger)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址QQ群&#xff1a;398291828 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 【GameFramework框架】系列教程目录&#xff1a;…

MATLAB_ESP32有限脉冲响应FIR无限脉冲响应IIR滤波器

要点 ESP32闪烁LED&#xff0c;计时LEDESP32基础控制&#xff1a;温控输出串口监控&#xff0c;LCD事件计数器&#xff0c;SD卡读写&#xff0c;扫描WiFi网络&#xff0c;手机控制LED&#xff0c;经典蓝牙、数字麦克风捕捉音频、使用放大器和喇叭、播放SD卡和闪存MP3文件、立体…

Android通过反射动态挂载/卸载U盘

代码中动态控制U盘挂载和卸载。&#xff08;仅适用于系统应用&#xff09; 反射方式实现。 需要添加android:sharedUserId"android.uid.system" 到AndroidManifest.xml public static void mountDisk() {Log.v(TAG, "mountDisk begin");try {Class<?…

R语言【mclust】——Mclust():基于模型的聚类

Package mclust version 6.0.1 Description 基于参数化有限高斯混合模型的模型聚类。采用基于层次模型的聚类初始化EM算法对模型进行估计。然后根据BIC选择最优模型。 Usage Mclust(data, G = NULL, modelNames = NULL, prior = NULL, control = emControl(), initialization…

如何多环境切换?如何在微服务配置多环境?

问题本质: nacos配置中心的配置是如何被项目读取到的&#xff1f;(nacos的配置中心和项目是如何联系的&#xff1f;) 注意&#xff1a;nacos有配置管理和服务管理&#xff0c;别弄混。自动注册的是服务管理&#xff01;&#xff01;&#xff01; 1. 如何注册到nacos服务管理中心…

深度学习-回顾CNN经典网络LetNet

深度学习-回顾CNN经典网络LetNet 深度学习中&#xff0c;从LetNet到当前最火的GPT所用的Transformer&#xff0c;经典网络引领一波又一波的技术革命&#xff0c;它们把AI技术不断推向高潮。 用pytorch构建CNN经典网络模型LetNet&#xff0c;还可用数据进行训练模型&#xff0…

Java基础知识--12

目录 一、final的使用 二、接口 1.概述 2.与抽象类的异同 3.具体使用 4.内部类 成员内部类 静态内部类 局部内部类 一、final的使用 描述&#xff1a;final是最终的&#xff0c;不可改变的含义&#xff1b;可以修饰在类&#xff0c;方法&#xff0c;变量中 修饰类&…

蓝桥杯备战刷题one(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

玩转ChatGPT:参考文献速查

一、写在前面 各位大佬&#xff0c;我又回来了&#xff0c;最近2月太忙啦&#xff08;过年、奶娃、本子、材料、结题&#xff09;&#xff0c;断更了。现水一篇证明我还活着&#xff01;&#xff01;&#xff01; 最近在写国自然本子&#xff0c;遇到一个估计大家都会遇到的问…