问题描述
我有一个预训练的网络。我想阅读该模型并更改输入层的形状。我试过以下代码:
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
_________________________________________________________________