Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Tensorflow tf.keras替换预训练resnet50中的下层_Tensorflow_Keras_Tensorflow2.0_Tf.keras - Fatal编程技术网

Tensorflow tf.keras替换预训练resnet50中的下层

Tensorflow tf.keras替换预训练resnet50中的下层,tensorflow,keras,tensorflow2.0,tf.keras,Tensorflow,Keras,Tensorflow2.0,Tf.keras,是否可以在tf.keras.applications中移除/替换预训练ResNet50模型的底层 例如,我尝试过这样做: import tensorflow as tf pretrained_resnet = tf.keras.applications.ResNet50(include_top=False, weights='imagenet') inputs = tf.keras.Input(shape=(256,256,1)) x = tf.keras.layers.ZeroPadding2

是否可以在tf.keras.applications中移除/替换预训练ResNet50模型的底层

例如,我尝试过这样做:

import tensorflow as tf
pretrained_resnet = tf.keras.applications.ResNet50(include_top=False, weights='imagenet')
inputs = tf.keras.Input(shape=(256,256,1))
x = tf.keras.layers.ZeroPadding2D()(inputs)
x = tf.keras.layers.Conv2D(filters=64,
                           kernel_size=(7,7),
                           strides=(2,2),
                           padding='same')(x)
outputs = pretrained_resnet.layers[3](x)
test = tf.keras.Model(inputs, pretrained_resnet.output)
但它给出了这个错误:ValueError:Graph disconnected:无法获取张量张量的值(“input_2:0”

我也尝试过使用tf.keras Sequential API,但这不起作用,因为ResNet不是一个序列模型。我基本上只是尝试用一个新的层替换ResNet50中的第一个Conv2D层。这可能吗?或者我必须重写整个ResNet模型吗


如果您有任何建议,我们将不胜感激。

ZeroPadding2D
Conv2D(7*7,64,第2步)
Resnet50
网络的
2层和
3层

因此,此处显示仅替换
Resnet50中的第一层(即输入层)

from tensorflow.keras.applications import ResNet50
import tensorflow as tf

model = ResNet50(include_top = False, weights = 'imagenet')
model.save('model.h5')

res50_model = tf.keras.models.load_model('model.h5')
#res50_model.summary()
要从网络中删除第一层,可以运行如下代码

 res50_model._layers.pop(0)
newInput = tf.keras.Input(shape=(256,256,3))
newOutputs = res50_model(newInput)
newModel = tf.keras.Model(newInput, newOutputs)
newModel.summary()
Resnet50要求输入必须有3个通道
,因此将输入层形状添加为
(256256,3)
,而不是
(256256,1)

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

 res50_model._layers.pop(0)
newInput = tf.keras.Input(shape=(256,256,3))
newOutputs = res50_model(newInput)
newModel = tf.keras.Model(newInput, newOutputs)
newModel.summary()
输出:

Model: "model"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_2 (InputLayer)         [(None, 256, 256, 3)]     0         
_________________________________________________________________
resnet50 (Model)             multiple                  23587712  
=================================================================
Total params: 23,587,712
Trainable params: 23,534,592
Non-trainable params: 53,120
_________________________________________________________________

ZeroPadding2D
Conv2D(7*7,64,2步)
Resnet50
网络的
2nd
3rd
层。请确认,您是否只想替换第一层,即输入层?如果是,在回答部分,我已经提供了解决方案。谢谢!我可以问一下,为什么您在替换层之前保存并加载模型吗?