关于用keras提取NN中间layer输出

博客围绕网络层数结构展开,介绍了在Keras中获取Pooling层输出的两种方法,指出第10层为Pooling层,且两个代码的输出相同,还提到一般人们常用第二种方法。

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

Build model...
__________________________________________________________________________________________________
Layer (type)                    Output Shape         Param #     Connected to                     
==================================================================================================
main_input (InputLayer)         (None, 89, 39)       0                                            
__________________________________________________________________________________________________
cropping1d_1 (Cropping1D)       (None, 85, 39)       0           main_input[0][0]                 
__________________________________________________________________________________________________
cropping1d_2 (Cropping1D)       (None, 85, 39)       0           main_input[0][0]                 
__________________________________________________________________________________________________
cropping1d_3 (Cropping1D)       (None, 85, 39)       0           main_input[0][0]                 
__________________________________________________________________________________________________
cropping1d_4 (Cropping1D)       (None, 85, 39)       0           main_input[0][0]                 
__________________________________________________________________________________________________
cropping1d_5 (Cropping1D)       (None, 85, 39)       0           main_input[0][0]                 
__________________________________________________________________________________________________
concatenate_1 (Concatenate)     (None, 85, 195)      0           cropping1d_1[0][0]               
                                                                 cropping1d_2[0][0]               
                                                                 cropping1d_3[0][0]               
                                                                 cropping1d_4[0][0]               
                                                                 cropping1d_5[0][0]               
__________________________________________________________________________________________________
fc1 (BatchNormalization)        (None, 85, 195)      780         concatenate_1[0][0]              
__________________________________________________________________________________________________
fc2 (Bidirectional)             (None, 85, 2048)     9994240     fc1[0][0]                        
__________________________________________________________________________________________________
fc3 (BatchNormalization)        (None, 85, 2048)     8192        fc2[0][0]                        
__________________________________________________________________________________________________
global_average_pooling1d_1 (Glo (None, 2048)         0           fc3[0][0]                        
__________________________________________________________________________________________________
main_output (Dense)             (None, 2)            4098        global_average_pooling1d_1[0][0] 
==================================================================================================
Total params: 10,007,310
Trainable params: 10,002,824
Non-trainable params: 4,486
__________________________________________________________________________________________________

假设我网络层数是上面这个结构.

如果我想得到pooling的输出, keras上有两张方法。

intermediate_layer_model = Model(inputs=model.input,outputs=model.get_layer(str('global_average_pooling1d_1')).output)
#model.summary()
#model.get_layer(str('cropping1d_1'))
intermediate_output = intermediate_layer_model.predict(data)

data是你的输入所用的数据.... 

from keras import backend as K
get_11rd_layer_output = K.function([model.layers[0].input],
                                  [model.layers[10].output])
layer_output = get_11rd_layer_output([data])[0]

我这里第10层是Pooling层.

这两个代码的output是一样的.. 

一般我看人用的都是第二个... 

 

### 使用Keras实现Vision Transformer (ViT) Rollout 为了理解如何使用Keras实现Vision Transformer (ViT),先了解其基本结构至关重要。Vision Transformer是一种纯变换器模型,直接应用于图像补丁序列以完成图像分类任务[^1]。 下面展示了一个简化版的Vision Transformer在Keras中的实现方法: ```python import tensorflow as tf from tensorflow.keras import layers, models class PatchEncoder(layers.Layer): def __init__(self, num_patches, projection_dim): super(PatchEncoder, self).__init__() self.num_patches = num_patches self.projection = layers.Dense(units=projection_dim) self.position_embedding = layers.Embedding( input_dim=num_patches, output_dim=projection_dim) def call(self, patch): positions = tf.range(start=0, limit=self.num_patches, delta=1) encoded = self.projection(patch) + self.position_embedding(positions) return encoded def create_vit_classifier(input_shape=(224, 224, 3), num_classes=1000, patch_size=16, transformer_layers=12, mlp_head_units=[2048, 1024], representation_size=None): # 图像分割成多个patch并扁平化处理 inputs = layers.Input(shape=input_shape) patches = Patches(patch_size)(inputs) encoded_patches = PatchEncoder(num_patches=(input_shape[0]//patch_size)**2, projection_dim=768)(patches) # 创建多层Transformer Blocks for _ in range(transformer_layers): x1 = layers.LayerNormalization(epsilon=1e-6)(encoded_patches) attention_output = layers.MultiHeadAttention( num_heads=12, key_dim=64, dropout=0.1)(x1, x1) x2 = layers.Add()([attention_output, encoded_patches]) x3 = layers.LayerNormalization(epsilon=1e-6)(x2) fully_connected_output = layers.Dense(units=mlp_head_units[0], activation=tf.nn.gelu)(x3) fully_connected_output = layers.Dropout(0.1)(fully_connected_output) fully_connected_output = layers.Dense(units=mlp_head_units[1])(fully_connected_output) fully_connected_output = layers.Dropout(0.1)(fully_connected_output) encoded_patches = layers.Add()([fully_connected_output, x2]) representation = layers.LayerNormalization(epsilon=1e-6)(encoded_patches) if representation_size and not tf.config.list_physical_devices('GPU'): representation = layers.Dense(representation_size)(representation) representation = tf.tanh(representation) else: representation = layers.Flatten()(representation) representation = layers.Dropout(0.5)(representation) features = layers.Dense(mlp_head_units[-1], activation=tf.nn.tanh)(representation) logits = layers.Dense(num_classes)(features) model = models.Model(inputs=inputs, outputs=logits) return model ``` 此代码片段定义了创建基于Keras框架下的Vision Transformer分类器的过程。通过`PatchEncoder`类来编码输入图片到固定长度向量表示;接着利用一系列变压器块(Transformer Block),这些块由一个多头自注意力机制和一个全连接网络组成,用于提取特征;最后经过一层或多层MLP预测类别标签。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值