Keras 将下采样层预处理为Resnet50预训练模型

Keras 将下采样层预处理为Resnet50预训练模型,keras,Keras,我正在windows 7中使用keras 1.1.1和tensorflow后端 我正试图用一个图像降采样器来预装股票Resnet50预装模型。下面是我的代码 from keras.applications.resnet50 import ResNet50 import keras.layers # this could also be the output a different Keras model or layer input = keras.layers.Input(shape=(40

我正在windows 7中使用keras 1.1.1和tensorflow后端

我正试图用一个图像降采样器来预装股票Resnet50预装模型。下面是我的代码

from keras.applications.resnet50 import ResNet50
import keras.layers

# this could also be the output a different Keras model or layer
input = keras.layers.Input(shape=(400, 400, 1))  # this assumes K.image_dim_ordering() == 'tf'
x1 = keras.layers.AveragePooling2D(pool_size=(2,2))(input)
x2 = keras.layers.Flatten()(x1)
x3 = keras.layers.RepeatVector(3)(x2)
x4 = keras.layers.Reshape((200, 200, 3))(x3)
x5 = keras.layers.ZeroPadding2D(padding=(12,12))(x4)
m = keras.models.Model(input, x5) 
model = ResNet50(input_tensor=m.output, weights='imagenet', include_top=False) 
但是我得到了一个错误,我不知道如何修复

内置。异常:图形断开连接:无法获取张量值 输出(“输入_2:0”,形状=(?,400,400,1),数据类型=浮动32)在层 “输入2”。访问以下以前的层时没有问题: []


您可以使用函数API和顺序方法来解决这个问题。请参见以下两种方法的工作示例:

from keras.applications.ResNet50 import ResNet50
from keras.models import Sequential, Model
from keras.layers import AveragePooling2D, Flatten, RepeatVector, Reshape, ZeroPadding2D, Input, Dense

pretrained = ResNet50(input_shape=(224, 224, 3), weights='imagenet', include_top=False)

# Sequential method
model_1 = Sequential()
model_1.add(AveragePooling2D(pool_size=(2,2),input_shape=(400, 400, 1)))
model_1.add(Flatten())
model_1.add(RepeatVector(3))
model_1.add(Reshape((200, 200, 3)))
model_1.add(ZeroPadding2D(padding=(12,12)))
model_1.add(pretrained)
model_1.add(Dense(1))

# functional API method
input = Input(shape=(400, 400, 1))
x = AveragePooling2D(pool_size=(2,2),input_shape=(400, 400, 1))(input)
x = Flatten()(x)
x = RepeatVector(3)(x)
x = Reshape((200, 200, 3))(x)
x = ZeroPadding2D(padding=(12,12))(x)
x = pretrained(x)
preds = Dense(1)(x)

model_2 = Model(input,preds)

model_1.summary()
model_2.summary()
总结(例外情况下替换resnet):

这两种方法都很有效。如果您计划冻结预训练模型并让前/后层学习——然后对模型进行微调,我发现的工作方法如下:

# given the same resnet model as before...
model = load_model('modelname.h5')

# pull out the nested model
nested_model = model.layers[5] # assuming the model is the 5th layer

# loop over the nested model to allow training
for l in nested_model.layers:
  l.trainable=True

# insert the trainable pretrained model back into the original
model.layer[5] = nested_model

令人难以置信的是,似乎没有任何关于如何做到这一点的指导。这似乎是你向人们解释的最简单最愚蠢的第一件事,但不,凯拉斯很酷。纪录片糟透了。
# given the same resnet model as before...
model = load_model('modelname.h5')

# pull out the nested model
nested_model = model.layers[5] # assuming the model is the 5th layer

# loop over the nested model to allow training
for l in nested_model.layers:
  l.trainable=True

# insert the trainable pretrained model back into the original
model.layer[5] = nested_model