Python 为什么可以';我不能在Keras中加载保存的暹罗模型吗?

Python 为什么可以';我不能在Keras中加载保存的暹罗模型吗?,python,keras,callback,google-colaboratory,Python,Keras,Callback,Google Colaboratory,我正在尝试建立一个个人身份识别系统,我使用暹罗体系结构进行模型训练。我使用callbacks.ModelCheckpoint在每个历元中保存模型。加载保存的模型时出错 我使用VGG16预培训模型进行培训: input_shape = (160,60,3) conv_base = VGG16(weights='imagenet', include_top=False, input_shape=(160, 60, 3)) ou

我正在尝试建立一个个人身份识别系统,我使用暹罗体系结构进行模型训练。我使用callbacks.ModelCheckpoint在每个历元中保存模型。加载保存的模型时出错

我使用VGG16预培训模型进行培训:

input_shape = (160,60,3)
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(160, 60, 3))

output = conv_base.layers[-5].output

x=Flatten()(output)
x=Dense(512,activation='relu')(x)
out=Dense(512,activation='relu')(x)

conv_base = Model(conv_base.input, output=out)

for layer in conv_base.layers[:-11]:
    layer.trainable = False
创建暹罗模型:

# We have 2 inputs, 1 for each picture
left_input = Input((160,60,3))
right_input = Input((160,60,3))

# We will use 2 instances of 1 network for this task
convnet = Sequential([
    InputLayer(input_shape=(160, 60, 3)),
    conv_base
])
# Connect each 'leg' of the network to each input
# Remember, they have the same weights
encoded_l = convnet(left_input)
encoded_r = convnet(right_input)

# Getting the L1 Distance between the 2 encodings
L1_layer = Lambda(lambda tensor:K.abs(tensor[0] - tensor[1]))

# Add the distance function to the network
L1_distance = L1_layer([encoded_l, encoded_r])

prediction = Dense(1,activation='sigmoid')(L1_distance)
siamese_net = Model(inputs=[left_input,right_input],outputs=prediction)

#optimizer = Adam(0.00006, decay=2.5e-4)
sgd = optimizers.RMSprop(lr=1e-4)
#//TODO: get layerwise learning rates and momentum annealing scheme described in paperworking
siamese_net.compile(loss="binary_crossentropy", optimizer=sgd, metrics=['accuracy'])
列车网络:

checkpoint = ModelCheckpoint('drive/My Drive/thesis/new change parametr/model/model-{epoch:03d}.h5', verbose=1, save_weights_only=False,monitor='val_loss', mode='auto')

newmodel=siamese_net.fit([left_train,right_train], targets,
          batch_size=64,
          epochs=2,
          verbose=1,shuffle=True, validation_data=([valid_left,valid_right],valid_targets),callbacks=[checkpoint])
模型存储在每个历元中,但加载时会出现以下错误:

loaded_model= load_model('drive/My Drive/thesis/new change parametr/model/model-001.h5')
错误:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-6-8de2283b355f> in <module>()
      1 
----> 2 loaded_model= load_model('drive/My Drive/thesis/new change parametr/model/model-001.h5')
      3 print('Load succesfuly')
      4 
      5 #siamese_net.load_weights('drive/My Drive/thesis/new change parametr/weight/model-{epoch:03d}.h5')

7 frames
/usr/local/lib/python3.6/dist-packages/keras/engine/saving.py in preprocess_weights_for_loading(layer, weights, original_keras_version, original_backend, reshape)
    939                                  str(weights[0].size) + '. ')
    940             weights[0] = np.reshape(weights[0], layer_weights_shape)
--> 941         elif layer_weights_shape != weights[0].shape:
    942             weights[0] = np.transpose(weights[0], (3, 2, 0, 1))
    943             if layer.__class__.__name__ == 'ConvLSTM2D':

IndexError: list index out of range
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在()
1.
---->2 loaded_model=load_model('drive/My drive/thesis/new change parametr/model/model-001.h5'))
3打印(“加载成功”)
4.
5#暹罗净负载重量('drive/My drive/thesis/new change parametr/weight/model-{epoch:03d}.h5')
7帧
/加载预处理中的usr/local/lib/python3.6/dist-packages/keras/engine/saving.py(图层、权重、原始keras版本、原始keras后端、重塑)
939 str(权重[0]。大小)+'。)
940权重[0]=np.重塑(权重[0],层\权重\形状)
-->941 elif层\u权重\u形状!=权重[0]。形状:
942权重[0]=np.转置(权重[0],(3,2,0,1))
943如果层.\uuuuuu类.\uuuuuu名称.\uuuuuu=='ConvLSTM2D':
索引器:列表索引超出范围

我的代码在Google Colaboratory上执行。我在网上搜索过,这个问题可能是因为使用了暹罗建筑。任何帮助都将不胜感激

创建网络时加载保存的模型时出错,如下所示:

input_shape = (160,60,3)
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(160, 60, 3))

output = conv_base.layers[-5].output

x=Flatten()(output)
x=Dense(512,activation='relu')(x)
out=Dense(512,activation='relu')(x)

conv_base = Model(conv_base.input, output=out)

for layer in conv_base.layers[:-11]:
    layer.trainable = False

# We have 2 inputs, 1 for each picture
left_input = Input((160,60,3))
right_input = Input((160,60,3))

# We will use 2 instances of 1 network for this task
convnet = Sequential([
    InputLayer(input_shape=(160, 60, 3)),
    conv_base
])
通过更改创建模型解决了此问题:

# We have 2 inputs, 1 for each picture
left_input = Input((160,60,3))
right_input = Input((160,60,3))

conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(160, 60, 3))

output = conv_base.layers[-5].output

x=Flatten()(output)
x=Dense(512,activation='relu')(x)
out=Dense(512,activation='relu')(x)

for layer in conv_base.layers[:-11]:
    layer.trainable = False 

convnet = Model(conv_base.input, output=out)
然后:


创建网络时加载保存的模型时出错,如下所示:

input_shape = (160,60,3)
conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(160, 60, 3))

output = conv_base.layers[-5].output

x=Flatten()(output)
x=Dense(512,activation='relu')(x)
out=Dense(512,activation='relu')(x)

conv_base = Model(conv_base.input, output=out)

for layer in conv_base.layers[:-11]:
    layer.trainable = False

# We have 2 inputs, 1 for each picture
left_input = Input((160,60,3))
right_input = Input((160,60,3))

# We will use 2 instances of 1 network for this task
convnet = Sequential([
    InputLayer(input_shape=(160, 60, 3)),
    conv_base
])
通过更改创建模型解决了此问题:

# We have 2 inputs, 1 for each picture
left_input = Input((160,60,3))
right_input = Input((160,60,3))

conv_base = VGG16(weights='imagenet',
                  include_top=False,
                  input_shape=(160, 60, 3))

output = conv_base.layers[-5].output

x=Flatten()(output)
x=Dense(512,activation='relu')(x)
out=Dense(512,activation='relu')(x)

for layer in conv_base.layers[:-11]:
    layer.trainable = False 

convnet = Model(conv_base.input, output=out)
然后: