修改 Keras 模型的输入层

问题描述

我有一个预训练的网络。我想阅读该模型并更改输入层的形状。我试过以下代码

import os
import tensorflow as tf
from tensorflow import keras
print(tf.version.VERSION)

2.4.1

from google.colab import drive
drive.mount("/content/drive",force_remount=True )
new_model = tf.keras.models.load_model("/content/drive/My Drive/NonQuantRelu.h5")
new_model.summary()

模型:“functional_1”

层(类型)输出形状参数#

输入 (InputLayer) [(,108,1)] 0

ConvL1_Filters (Conv1D)(无、98、24)264

我真的不想要 InputLayer 中的 None,所以我尝试:

new_input_layer = keras.Input(batch_size=1,shape=(108,1),name="Input",dtype="float32",ragged=False,sparse=False)
new_input_layer.shape

TensorShape([1,1])

new_model.layers[0] = new_input_layer
new_model.summary()

模型:“functional_1”

层(类型)输出形状参数#

输入 (InputLayer) [(,1)] 0

ConvL1_Filters (Conv1D)(无、98、24)264

为什么输入层没有改变? 谢谢大家

解决方法

我能够使用 vgg16 网络复制您的问题。

import tensorflow as tf
print(tf.__version__)

from google.colab import drive
drive.mount('/content/drive/')

model = tf.keras.models.load_model('/content/drive/MyDrive/vgg16.h5')
model.summary()

输出:

2.4.1
Drive already mounted at /content/drive/; to attempt to forcibly remount,call drive.mount("/content/drive/",force_remount=True).

Model: "vgg16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(None,224,3)]     0         
_________________________________________________________________
block1_conv1 (Conv2D)        (None,64)      1792      
_________________________________________________________________
block1_conv2 (Conv2D)        (None,64)      36928     
_________________________________________________________________
block1_pool (MaxPooling2D)   (None,112,64)      0         
_________________________________________________________________
block2_conv1 (Conv2D)        (None,128)     73856     
_________________________________________________________________
block2_conv2 (Conv2D)        (None,128)     147584    
_________________________________________________________________
block2_pool (MaxPooling2D)   (None,56,128)       0         
_________________________________________________________________
block3_conv1 (Conv2D)        (None,256)       295168    
_________________________________________________________________
block3_conv2 (Conv2D)        (None,256)       590080    
_________________________________________________________________
block3_conv3 (Conv2D)        (None,256)       590080    
_________________________________________________________________
block3_pool (MaxPooling2D)   (None,28,256)       0         
_________________________________________________________________
block4_conv1 (Conv2D)        (None,512)       1180160   
_________________________________________________________________
block4_conv2 (Conv2D)        (None,512)       2359808   
_________________________________________________________________
block4_conv3 (Conv2D)        (None,512)       2359808   
_________________________________________________________________
block4_pool (MaxPooling2D)   (None,14,512)       0         
_________________________________________________________________
block5_conv1 (Conv2D)        (None,512)       2359808   
_________________________________________________________________
block5_conv2 (Conv2D)        (None,512)       2359808   
_________________________________________________________________
block5_conv3 (Conv2D)        (None,512)       2359808   
_________________________________________________________________
block5_pool (MaxPooling2D)   (None,7,512)         0         
=================================================================
Total params: 14,714,688
Trainable params: 14,688
Non-trainable params: 0
_________________________________________________________________

要移除网络的第一层,请使用pop,如下所示

 model._layers.pop(0)

要添加新的输入层,您可以运行如下所示的代码

new_input_layer = tf.keras.Input(batch_size= 32,shape=(224,3))
new_output_layer = model(new_input_layer)
new_model = tf.keras.Model(new_input_layer,new_output_layer)
new_model.summary()

输出:

Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_1 (InputLayer)         [(32,3)]       0         
_________________________________________________________________
vgg16 (Functional)           (None,512)         14714688  
=================================================================
Total params: 14,688
Non-trainable params: 0
_________________________________________________________________

您可以使用 get_layer 来检索图层。在这里获取vgg16 (Functional)层(即在new_model中索引为1)的详细信息,您可以运行如下所示的代码

new_model.get_layer(index=1).summary()

输出:

Model: "vgg16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
block1_conv1 (Conv2D)        (None,688
Non-trainable params: 0
_________________________________________________________________