TensorFlow Keras模型中如何删除指定神经元并同步适配后续层权重
Keras删除指定神经元的实现方法
核心逻辑是:Dense层的权重矩阵维度为(输入维度, 神经元数量),删除指定神经元时,同步修改目标层和后一层的权重矩阵对应维度即可,具体操作步骤如下:
- 步骤1:生成保留神经元的索引
首先从512个神经元的全量索引中排除待删除索引,排序保证权重顺序一致:
import numpy as np # 你的待删除神经元索引列表 list_indices = [xxx, xxx, ...] # 生成保留的索引并排序 keep_indices = np.sort(list(set(range(512)) - set(list_indices)))
- 步骤2:提取原有目标层的权重
定位512神经元Dense层和后续输出层,提取原始权重:
# 你的原模型为model,倒数第二层为512神经元Dense,倒数第一层为输出Dense dense_512 = model.layers[-2] dense_output = model.layers[-1] # 提取权重:每个Dense层返回[权重矩阵, 偏置向量] dense_512_kernel, dense_512_bias = dense_512.get_weights() dense_out_kernel, dense_out_bias = dense_output.get_weights()
- 步骤3:生成适配新结构的权重
# 512层新权重:删除对应神经元的权重列和偏置项 new_dense_512_kernel = dense_512_kernel[:, keep_indices] new_dense_512_bias = dense_512_bias[keep_indices] # 输出层新权重:删除对应前层神经元的权重行,偏置项完全不变 new_dense_out_kernel = dense_out_kernel[keep_indices, :]
逻辑说明:512层的输出维度对应神经元数量,删除神经元即删除权重矩阵的对应列、偏置的对应位置;输出层的输入维度等于前一层神经元数,所以删除前层神经元对应删除输出层权重矩阵的对应行,不影响输出层自身的偏置。
- 步骤4:生成新模型并赋值权重
有两种实现方式可选:
方式一:重新搭建结构,仅修改目标层神经元数,适配后赋值权重
# 沿用你原有定义的conv2d、max_pool、input_shape、only_digits参数 new_model = tf.keras.models.Sequential([ conv2d(filters=32, input_shape=input_shape), max_pool(), conv2d(filters=64), max_pool(), tf.keras.layers.Flatten(), tf.keras.layers.Dense(412, activation=tf.nn.relu), tf.keras.layers.Dense(10 if only_digits else 62), ]) # 给未改动的前几层赋值原模型权重 for layer_idx in range(len(new_model.layers)-2): new_model.layers[layer_idx].set_weights(model.layers[layer_idx].get_weights()) # 给修改后的两层赋值新权重 new_model.layers[-2].set_weights([new_dense_512_kernel, new_dense_512_bias]) new_model.layers[-1].set_weights([new_dense_out_kernel, dense_out_bias])
方式二:直接修改原有模型,删掉两层后新增适配层
# 删掉原模型最后两层 model.pop() model.pop() # 新增修改后的两层 model.add(tf.keras.layers.Dense(412, activation=tf.nn.relu)) model.add(tf.keras.layers.Dense(10 if only_digits else 62)) # 给新增层赋值新权重 model.layers[-2].set_weights([new_dense_512_kernel, new_dense_512_bias]) model.layers[-1].set_weights([new_dense_out_kernel, dense_out_bias])
修改完成后可拿相同输入分别跑原模型和新模型,将原模型512层的待删除神经元输出置0后,二者输出结果完全一致即说明修改正确。
内容的提问来源于stack exchange,提问作者Leyla23
相关产品推荐
相关产品推荐

