理解extract_patches_2d

本文介绍了sklearn库中的extract_patches_2d函数,该函数用于从图像中按指定尺寸随机抽取patch。参数包括patch_size(提取的patch大小)、max_patches(可选,提取patch的比例)和random_state(随机数种子)。通过调用此函数并指定适当参数,可以获取裁剪后的图像数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这是sklearn中的一种图像特征提取方法,该方法的导入(import)如下:

from sklearn.feature_extraction.image import extract_patches_2d

extract_patches_2d(image, patch_size, max_patches=None, random_state=None)

该方法作用是按照给定尺寸要求,随机提取原始图像patch大小尺寸图片,然后将其返回。patch_size就是要提取的尺寸。max_patches是0和1之间的数,表示提取pathes的比例,如果是1就是表示提取整个patch。

在这里插入图片描述
因为第一个维度是n_patches的信息,通常情况下我们要想获得实际裁剪过后的图像应该写成

return extract_patches_2d(image, patch_size, max_patches=
def transformer_encoder(inputs, num_heads, ff_dim, dropout_rate=0.1): """ Transformer Encoder 块: - 多头自注意力层 - 前馈神经网络(FFN) - 残差连接和层归一化 """ # 多头自注意力 attn_output = MultiHeadAttention(num_heads=num_heads, key_dim=ff_dim, dropout=dropout_rate)(inputs, inputs) attn_output = Dropout(dropout_rate)(attn_output) out1 = LayerNormalization(epsilon=1e-6)(inputs + attn_output) # 前馈网络 ffn_output = Dense(ff_dim * 4, activation='relu')(out1) ffn_output = Dense(ff_dim)(ffn_output) ffn_output = Dropout(dropout_rate)(ffn_output) out2 = LayerNormalization(epsilon=1e-6)(out1 + ffn_output) return out2 def create_model(input_shape, static_feature_dim, embed_dim=128, num_heads=4, ff_dim=128, num_transformer_layers=4, dropout_rate=0.1, num_classes=1, patch_size=4): """ 基于 Transformer 的多模态分类模型 参数说明: - input_shape: 图像输入的形状,例如 (64, 64, 102) - static_feature_dim: 静态特征的维度 - embed_dim: 图像 patch 的嵌入维度 - num_heads: MultiHeadAttention 的头数 - ff_dim: Transformer 前馈网络的隐藏层维度 - num_transformer_layers: Transformer Encoder 层数 - dropout_rate: Dropout 率 - num_classes: 输出类别数;二分类任务时设为 1(使用 sigmoid 激活) - patch_size: 图像划分成小 patch 的尺寸,例如 4 表示 4x4 的 patch """ # ---------------------- # 图像分支(基于 Vision Transformer) # ---------------------- # 图像输入 image_input = Input(shape=input_shape, name="image_input") # 利用 tf.image.extract_patches 将图像分割为 patch # 该层会把图像划分为不重叠的小块 patches = tf.image.extract_patches( images=image_input, sizes=[1, patch_size, patch_size, 1], strides=[1, patch_size, patch_size, 1], rates=[1, 1, 1, 1], padding="VALID" ) # 计算每个 patch 的展平尺寸 patch_dim = patch_size * patch_size * input_shape[2] # 计算总的 patch 数量(假设输入尺寸为 64x64,patch_size=4,则共有 (64/4)*(64/4)=16*16=256 个 patch) num_patches = (input_shape[0] // patch_size) * (input_shape[1] // patch_size) # 将 patches reshape 成 (batch_size, num_patches, patch_dim) x = Reshape((num_patches, patch_dim))(patches) # 线性映射:将每个 patch 映射到 embed_dim 维空间 x = Dense(embed_dim)(x) # 添加位置编码(使用 Embedding 层) positions = tf.range(start=0, limit=num_patches, delta=1) pos_embedding = Embedding(input_dim=num_patches, output_dim=embed_dim)(positions) x = x + pos_embedding # (batch_size, num_patches, embed_dim) # Transformer Encoder 层堆叠 for _ in range(num_transformer_layers): x = transformer_encoder(x, num_heads=num_heads, ff_dim=ff_dim, dropout_rate=dropout_rate) # 利用全局平均池化对 Transformer 输出进行汇聚,得到图像全局特征 image_features = GlobalAveragePooling1D()(x) # (batch_size, embed_dim) image_features = Dropout(dropout_rate)(image_features) # ---------------------- # 静态特征分支(简单 MLP) # ---------------------- static_input = Input(shape=(static_feature_dim,), name="static_input") static_features = Dense(embed_dim, activation='relu')(static_input) static_features = Dropout(dropout_rate)(static_features) # ---------------------- # 融合图像和静态特征 # ---------------------- merged = Concatenate()([image_features, static_features]) merged = Dense(128, activation='relu')(merged) merged = Dropout(dropout_rate)(merged) # ---------------------- # 输出层 # ---------------------- if num_classes == 1: outputs = Dense(num_classes, activation='sigmoid')(merged) else: outputs = Dense(num_classes, activation='softmax')(merged) # 构建模型 model = Model(inputs=[image_input, static_input], outputs=outputs) return model上面代码被用于处理多通道的图像数据,同时在图像数据中也带有一定的静态特征,但是最终的效果并不是很好,那么应该对上面代码进行怎样的处理才能得到更好的效果,给出具体的修改点及修改代码
03-17
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Einstellung

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值