tf.Keras (tf-1.15)使用记录2-基于tf.keras.layers创建层
tf.keras.layers是keras的主要网络创建方法,里面已经有成熟的网络层,也可以通过继承的方式自定义神经网络层。
在keras的model定义中,为了保证所有对数据的操作都是可追溯、可保存、可反向传播,需要保证对数据的任何操作都是基于tf.keras.layers的父类的,否则模型就可能出问题。
1、使用tf.keras.layers自带的层
注意下面这些都是类,还需要实例化之后传入x,即layer(x)
Dense (全连接层)
layer = tf.keras.layers.Dense(units, activation=None, use_bias=True)
units: 输出空间的维度(神经元数量)activation: 激活函数,如 ‘relu’, ‘sigmoid’, ‘tanh’ 等use_bias: 是否使用偏置项
Dropout
layer = tf.keras.layers.Dropout(rate, noise_shape=None, seed=None)
rate: 需要丢弃的输入比例,范围在 0 到 1 之间noise_shape: 可选,用于指定丢弃模式的形状seed: 可选,用于设置随机种子
BatchNormalization
layer = tf.keras.layers.BatchNormalization(axis=-1, momentum=0.99, epsilon=0.001, center=True, scale=True)
axis: 需要规范化的轴momentum: 移动平均的动量epsilon: 添加到方差的小数值,以避免除以零center: 如果为True,则减去均值scale: 如果为True,则乘以标准差的倒数
Embedding(返回值会增加一维)
Embedding 层用于将正整数(索引值)转换为固定大小的稠密向量。这种层通常用于处理文本数据,将单词映射为向量,这些向量更适合神经网络处理。
layer = tf.keras.layers.Embedding(input_dim, output_dim, embeddings_initializer='uniform', mask_zero=False)
input_dim: 词汇表大小(最大整数索引 + 1)output_dim: 嵌入向量的维度embeddings_initializer: 嵌入矩阵的初始化方法mask_zero: 是否将 0 视为需要屏蔽的特殊值- 注意,一般embedding都是第一层,传入input_length=n_features参数用来指示有几个整数特征用来被处理。使用示例:
import pandas as pd
import numpy as np
import tensorflow as tf
from sklearn.model_selection import train_test_split# 创建示例数据
n_samples = 1000
n_features = 5
max_value = 100data = np.random.randint(0, max_value, size=(n_samples, n_features))
labels = np.random.randint(0, 2, size=(n_samples,))df = pd.DataFrame(data, columns=[f'feature_{i}' for i in range(n_features)])
df['label'] = labels# 分割训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(df.drop('label', axis=1), df['label'], test_size=0.2, random_state=42)# 创建模型
model = tf.keras.Sequential([tf.keras.layers.Embedding(input_dim=max_value, output_dim=32, input_length=n_features), # 输出 (None, 5, 32) ;参数量为100 * 32 * 5tf.keras.layers.Flatten(),tf.keras.layers.Dense(64, activation='relu'),tf.keras.layers.Dense(1, activation='sigmoid')
])
# 打印模型摘要
model.summary()
LSTM
layer = tf.keras.layers.LSTM(units, activation='tanh', recurrent_activation='sigmoid', use_bias=True, return_sequences=False)
units: 输出空间的维度activation: 激活函数recurrent_activation: 循环步骤中使用的激活函数use_bias: 是否使用偏置向量return_sequences: 是否返回完整序列或仅返回最后一个输出
GRU
layer = tf.keras.layers.GRU(units, activation='tanh', recurrent_activation='sigmoid', use_bias=True, return_sequences=False)
参数含义与 LSTM 相同
Bidirectional (双向包装器)
layer = tf.keras.layers.Bidirectional(layer, merge_mode='concat')
layer: 要包装的 RNN 层实例merge_mode: 定义如何组合正向和反向 RNN 的输出,可以是 ‘sum’, ‘mul’, ‘concat’, ‘ave’ 等
LayerNormalization
layer = tf.keras.layers.LayerNormalization(axis=-1, epsilon=0.001, center=True, scale=True)
axis: 要规范化的轴epsilon: 添加到方差的小数值,以避免除以零center: 如果为True,则减去均值scale: 如果为True,则乘以标准差的倒数
除了上面的神经网络层,以下是一些常用的操作层,这些操作都默认不改变第一维度的batch_size:
Reshape
layer = tf.keras.layers.Reshape(target_shape) # target_shape是一个tuple
改变输入的形状,不改变数据。
import tensorflow as tf
import numpy as np# 创建一个模型,将 (batch, 12) 的输入重塑为 (batch, 3, 4)
model = tf.keras.Sequential([tf.keras.layers.Input(shape=(12,)),tf.keras.layers.Reshape((3, 4))
])# 测试模型
input_data = np.array([[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]])
output = model.predict(input_data)print("Input shape:", input_data.shape) # Input shape: (1, 12)
print("Output shape:", output.shape) # Output shape: (1, 3, 4)
Flatten
layer = tf.keras.layers.Flatten()
将输入展平成一维。
Permute
layer = tf.keras.layers.Permute(dims)
按指定模式重排输入的维度,本质上是进行维度的交换,最常用的场景是对张量进行后两维度的转置,比如注意力计算中的K的转置。
import tensorflow as tf
import numpy as np# 创建一个模型,将输入的维度从 (batch, dim1, dim2, dim3) 变为 (batch, dim3, dim1, dim2)
model = tf.keras.Sequential([tf.keras.layers.Input(shape=(10, 20, 30)),tf.keras.layers.Permute((3, 1, 2)) # 不会处理0维度因为是batchsize;123->321
])# 测试模型
input_data = np.random.rand(1, 10, 20, 30)
output = model(input_data)print("Input shape:", input_data.shape) # (1, 10, 20, 30)
print("Output shape:", output.shape) # (1, 30, 10, 20)
RepeatVector
layer = tf.keras.layers.RepeatVector(n)
重复输入 n 次。在batch后面增加一维度n,把整个向量都重复n遍。
Lambda
layer = tf.keras.layers.Lambda(function)
封装任意表达式为 Keras 层;这个函数非常有意思,可以把很多数学运算直接封装成tf.keras的layers,例如:
# 将输入乘以2
layer1 = tf.keras.layers.Lambda(lambda x: x * 2)# 自定义一个激活函数
def custom_activation(x):return tf.nn.tanh(x) * tf.nn.sigmoid(x)
layer2 = tf.keras.layers.Lambda(custom_activation)# 将2D输入转换为3D
layer3 = tf.keras.layers.Lambda(lambda x: tf.expand_dims(x, axis=-1))# 复杂操作
def complex_operation(x):# 假设x是一个2D张量mean = tf.reduce_mean(x, axis=-1, keepdims=True)centered = x - meanreturn tf.nn.l2_normalize(centered, axis=-1)
layer4 = tf.keras.layers.Lambda(complex_operation)# 待参数的函数
def parameterized_function(x, a):return x * a
layer5 = tf.keras.layers.Lambda(lambda x: parameterized_function(x, a=0.5))# 处理多个输入
layer6 = tf.keras.layers.Lambda(lambda inputs: inputs[0] * inputs[1])
Concatenate
layer = tf.keras.layers.Concatenate(axis=-1)
沿指定轴连接一系列输入。
Add
layer = tf.keras.layers.Add()
计算输入的和。
Subtract
layer = tf.keras.layers.Subtract()
计算两个输入的差。
Multiply
layer = tf.keras.layers.Multiply()
计算输入的元素级乘积。
Average
layer = tf.keras.layers.Average()
计算输入的平均值。
Maximum
layer = tf.keras.layers.Maximum()
计算输入的逐元素最大值。
Minimum
layer = tf.keras.layers.Minimum()
计算输入的逐元素最小值。
2、自定义自己的层
注意需要继承tf.keras.layers.Layer父类,以及注意传入**kwargs关键字参数。
1)自定义一个dense层
self.add_weight方法是用来初始化模型参数的。
import tensorflow as tfclass MyDenseLayer(tf.keras.layers.Layer):def __init__(self, num_outputs, activation=None, **kwargs):super(MyDenseLayer, self).__init__(**kwargs)self.num_outputs = num_outputsself.activation = tf.keras.activations.get(activation)def build(self, input_shape):self.w = self.add_weight("kernel",shape=[int(input_shape[-1]),self.num_outputs])self.b = self.add_weight("bias",shape=[self.num_outputs,],initializer='zeros')def call(self, input):z = tf.matmul(input, self.w) + self.breturn self.activation(z) if self.activation else z# 使用自定义层创建模型
model = tf.keras.Sequential([MyDenseLayer(32, activation='relu', input_shape=(222,)), # 注意这个input必须指定MyDenseLayer(64, activation='relu'),tf.keras.layers.Dense(10, activation='softmax')
])model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.summary()
2)自定义一个单调层(mixing net)和一个重复层
call函数的输入inputs就是固定的,build函数每次实例化只调用一次。
class MonoDense(tf.keras.layers.Layer):def __init__(self, output_dim, activation='elu', is_b=True, **kwargs):super(MonoDense, self).__init__(**kwargs)self.activation = tf.keras.activations.get(activation) self.output_dim = output_dimself.is_b = is_bprint('monotonic model initial!')def build(self, input_shape):# 确保输入是一个包含三个元素的列表assert isinstance(input_shape, list) and len(input_shape) >= 2def call(self, inputs):if self.is_b:inputs_x, inputs_w, inputs_b =inputs[0], inputs[1], inputs[2]input_shape = tf.shape(inputs_x)self.input_dim = input_shape[1]self.batch_size = input_shape[0]# print(self.batch_size, self.input_dim, self.output_dim)w = tf.reshape(inputs_w, [self.batch_size, self.input_dim, self.output_dim])# print(inputs)b = tf.reshape(inputs_b, [self.batch_size, 1, self.output_dim])# print(inputs)inputs_x = tf.reshape(inputs_x, [self.batch_size, 1, self.input_dim])output = tf.matmul(inputs_x, tf.maximum(w, 0)) + boutput2 = tf.reshape(output, [self.batch_size, self.output_dim])else:inputs_x, inputs_w=inputs[0], inputs[1]input_shape = tf.shape(inputs_x)self.input_dim = input_shape[1]self.batch_size = input_shape[0]# print(self.batch_size, self.input_dim, self.output_dim)w = tf.reshape(inputs_w, [self.batch_size, self.input_dim, self.output_dim])# print(inputs)inputs_x = tf.reshape(inputs_x, [self.batch_size, 1, self.input_dim])output = tf.matmul(inputs_x, tf.maximum(w, 0))output2 = tf.reshape(output, [self.batch_size, self.output_dim])return self.activation(output2)class RepeatToMatrixLayer(tf.keras.layers.Layer):def __init__(self, n, max_t, **kwargs):super(RepeatToMatrixLayer, self).__init__(**kwargs)self.n = nself.max_t = max_tdef call(self, inputs):inputs2 = tf.reshape(inputs, [-1])return (tf.tile(tf.expand_dims(inputs2, axis=-1), [1, self.n]) + 1) / (self.max_t + 1) # 做了一个归一化处理layer1 = RepeatToMatrixLayer(16, 32, name='my_repeat_layer')layer2 = MonoDense(64, activation='tanh', name='my_z_with_t', is_b=True) # 这里的激活函数比较重要
相关文章:
tf.Keras (tf-1.15)使用记录2-基于tf.keras.layers创建层
tf.keras.layers是keras的主要网络创建方法,里面已经有成熟的网络层,也可以通过继承的方式自定义神经网络层。 在keras的model定义中,为了保证所有对数据的操作都是可追溯、可保存、可反向传播,需要保证对数据的任何操作都是基于t…...
面试经典150题——栈
文章目录 1、有效的括号1.1 题目链接1.2 题目描述1.3 解题代码1.4 解题思路 2、2.1 题目链接2.2 题目描述2.3 解题代码2.4 解题思路 3、最小栈3.1 题目链接3.2 题目描述3.3 解题代码3.4 解题思路 4、逆波兰表达式求值4.1 题目链接4.2 题目描述4.3 解题代码4.4 解题思路 5、基本…...
FBX SDK的使用:读取Mesh
读取顶点数据 要将一个Mesh渲染出来,必须要有顶点的位置,法线,UV等顶点属性,和三角面的顶点索引数组。在提取这些数据之前,先理解FBX SDK里面的几个概念: Control Point 顶点的位置,就是x,y,z…...
EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站
EtherCAT主站IGH-- 49 -- 搭建xenomai系统及自己的IGH主站 0 Ubuntu18.04系统IGH博客、视频欣赏链接一 移植xenomai系统1,下载安装工具包2,下载linux内核及xenomai2.1,下载linux内核2.2,下载xenomai2.3,下载补丁ipipe2.4,解压缩包3,打补丁4,配置内核5,编译内核6,安装编译好的内…...
Java控制台登录系统示例代码
实现一个简单的登录系统需要包括用户输入用户名和密码、验证用户信息等功能。以下是一个简单的Java控制台登录系统示例代码。这个系统使用一个简单的用户信息存储方式(如数组或哈希表),并提供基本的登录验证功能。 示例代码 import java.ut…...
S4 HANA明确税金汇差科目(OBYY)
本文主要介绍在S4 HANA OP中明确税金汇差科目(OBYY)相关设置。具体请参照如下内容: 1. 明确税金汇差科目(OBYY) 以上配置点定义了在外币挂账时,当凭证抬头汇率和税金行项目汇率不一致时,造成的差异金额进入哪个科目。此类情况只发生在FB60/F…...
Web-3.0(Solidity)基础教程
Solidity 是 以太坊智能合约编程语言,用于编写 去中心化应用(DApp)。如果你想开发 Web3.0 应用,Solidity 是必学的。 Remix - Ethereum IDE(在线编写 Solidity) 特性Remix IDEHardhat适用场景适合 初学者 …...
深入理解linux中的文件(上)
1.前置知识: (1)文章 内容 属性 (2)访问文件之前,都必须打开它(打开文件,等价于把文件加载到内存中) 如果不打开文件,文件就在磁盘中 (3&am…...
背包问题和单调栈
背包问题(动态规划) 动态五步曲 dp数组及下标索引的含义递推公式dp数组如何初始化遍历顺序打印dp数组 01背包:n种物品,有一个,二维数组遍历顺序可以颠倒,(滚动数组)一维数组遍历顺序不可颠倒…...
Airflow:深入理解Apache Airflow Task
Apache Airflow是一个开源工作流管理平台,支持以编程方式编写、调度和监控工作流。由于其灵活性、可扩展性和强大的社区支持,它已迅速成为编排复杂数据管道的首选工具。在这篇博文中,我们将深入研究Apache Airflow 中的任务概念,探…...
WebSocket——环境搭建与多环境配置
一、前言:为什么要使用多环境配置? 在开发过程中,我们通常会遇到多个不同的环境,比如开发环境(Dev)、测试环境(Test)、生产环境(Prod)等。每个环境的配置和需…...
93,【1】buuctf web [网鼎杯 2020 朱雀组]phpweb
进入靶场 页面一直在刷新 在 PHP 中,date() 函数是一个非常常用的处理日期和时间的函数,所以应该用到了 再看看警告的那句话 Warning: date(): It is not safe to rely on the systems timezone settings. You are *required* to use the date.timez…...
ChatGPT怎么回事?
纯属发现,调侃一下~ 这段时间deepseek不是特别火吗,尤其是它的推理功能,突发奇想,想用deepseek回答一些问题,回答一个问题之后就回复服务器繁忙(估计还在被攻击吧~_~) 然后就转向了GPT…...
机器学习day7
自定义数据集 使用pytorch框架实现逻辑回归并保存模型,然后保存模型后再加载模型进行预测,对预测结果计算精确度和召回率及F1分数 代码 import numpy as np import torch import torch.nn as nn import torch.optim as optimizer import matplotlib.pyp…...
本地部署DeepSeek教程(Mac版本)
第一步、下载 Ollama 官网地址:Ollama 点击 Download 下载 我这里是 macOS 环境 以 macOS 环境为主 下载完成后是一个压缩包,双击解压之后移到应用程序: 打开后会提示你到命令行中运行一下命令,附上截图: 若遇…...
2月3日星期一今日早报简报微语报早读
2月3日星期一,农历正月初六,早报#微语早读。 1、多个景区发布公告:售票数量已达上限,请游客合理安排行程; 2、2025春节档总票房破70亿,《哪吒之魔童闹海》破31亿; 3、美宣布对中国商品加征10…...
202周日复盘(159)本周回顾
1、当日总结。 定价相关内容,学习与思考。 第一性原理,分析游戏成本的构成。 ------------- 2、周总结 大思路,细节设计都有进展,每天都挖坑与加工。 a 学习游戏思想 任天堂游戏研发四大标准,创新,直…...
Linux基础 ——tmux vim 以及基本的shell语法
Linux 基础 ACWING y总的Linux基础课,看讲义作作笔记。 tmux tmux 可以干嘛? tmux可以分屏多开窗口,可以进行多个任务,断线,不会自动杀掉正在进行的进程。 tmux – session(会话,多个) – window(多个…...
error: RPC failed; curl 56 OpenSSL SSL_read: SSL_ERROR_SYSCALL, errno 10054
Descriptions: Solutions:...
WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果
WPF进阶 | WPF 动画特效揭秘:实现炫酷的界面交互效果 前言一、WPF 动画基础概念1.1 什么是 WPF 动画1.2 动画的基本类型1.3 动画的核心元素 二、线性动画详解2.1 DoubleAnimation 的使用2.2 ColorAnimation 实现颜色渐变 三、关键帧动画深入3.1 DoubleAnimationUsin…...
DeepSeek 遭 DDoS 攻击背后:DDoS 攻击的 “千层套路” 与安全防御 “金钟罩”
当算力博弈升级为网络战争:拆解DDoS攻击背后的技术攻防战——从DeepSeek遇袭看全球网络安全新趋势 在数字化浪潮席卷全球的当下,网络已然成为人类社会运转的关键基础设施,深刻融入经济、生活、政务等各个领域。从金融交易的实时清算…...
本地部署DeepSeek-R1模型(新手保姆教程)
背景 最近deepseek太火了,无数的媒体都在报道,很多人争相着想本地部署试验一下。本文就简单教学一下,怎么本地部署。 首先大家要知道,使用deepseek有三种方式: 1.网页端或者是手机app直接使用 2.使用代码调用API …...
Scratch 《像素战场》系列综合游戏:像素战场游戏Ⅰ~Ⅲ 介绍
资源下载 Scratch《像素战场》系列综合游戏合集:像素战场游戏Ⅰ~Ⅲ压缩包 https://download.csdn.net/download/leyang0910/90332765 游戏操作介绍 Scratch 《像素战场Ⅰ》操作规则: 这是一款与朋友一起玩的 1v1 游戏。先赢得6轮胜利! WA…...
手机连接WIFI可以上网,笔记本电脑连接WIFI却不能上网? 解决方法?
原因:DNS受污染了 解决办法 step 1:清空域名解析记录(清空DNS) ipconfig /flushdns (Windows cmd命令行输入) step 2:重新从DHCP 获取IP ipconfig /release(释放当前IP地址) ipconfig /renew &…...
DRM系列七:Drm之CREATE_DUMB
本系列文章基于linux 5.15 DRM驱动的显存由GEM(Graphics execution management)管理。 一、创建流程 创建buf时,user层提供需要buf的width,height以及bpp(bite per pixel),然后调用drmIoctl(fd, DRM_IOCTL_MODE_CREATE_DUMB, &…...
Windows图形界面(GUI)-QT-C/C++ - QT Stacked Widget
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 一、概述 二、使用场景 1. 多步表单 2. 选项卡界面 3. 状态机界面 三、常见样式 四、属性设置 1. 页面管理 2. 布局管理 3. 信号与槽 五、内容处理 1. 添加页面 2. 移除页面 3.…...
二叉树——429,515,116
今天继续做关于二叉树层序遍历的相关题目,一共有三道题,思路都借鉴于最基础的二叉树的层序遍历。 LeetCode429.N叉树的层序遍历 这道题不再是二叉树了,变成了N叉树,也就是该树每一个节点的子节点数量不确定,可能为2&a…...
使用mybatisPlus插件生成代码步骤及注意事项
使用mybatisPlus插件可以很方便的生成与数据库对应的PO对象,以及对应的controller、service、ImplService、mapper代码,生成这种代码的方式有很多,包括mybatis-plus提供的代码生成器,以及idea提供的代码生成器,无论哪一…...
Apache Hudi数据湖技术应用在网络打车系统中的系统架构设计、软硬件配置、软件技术栈、具体实现流程和关键代码
网络打车系统利用Hudi数据湖技术成功地解决了其大规模数据处理和分析的难题,提高了数据处理效率和准确性,为公司的业务发展提供了有力的支持。 Apache Hudi数据湖技术的一个典型应用案例是网络打车系统的数据处理场景,具体如下: 大…...
TryHackMe: TryPwnMe Two
TryExecMe2 限制了直接进行系统调用,即syscall sysenter int 0x80,但是这样的限制是十分好绕过的,我们只需要通过异或生成syscall构造read再次写入shellcode即可 构造read shellcode asm(""" mov rdx, 0x100 mov r15, rdi…...
