在另一个模型中加载一个 tensorflow 模型,并连接两个模型

Load a tensorflow model inside another one, and concatenate two models

我的想法是根据我的卷积模型创建一个反卷积模型,以查看学习像素的重要性。

Overview of the model

我遇到了无法解释的问题。 首先是当我创建了 3 个模型后,如果我训练卷积模型并测试我的自动模型,一切正常。 而如果我创建我的 3 个模型,然后我加载我的卷积模型(之前训练过),如果我测试我的自动模型,一切看起来都好像我没有加载我的卷积模型的权重。 我的第一个问题是如何将权重加载到我的卷积模型中,以及如何将它们考虑到我的自动模型中?

第二个问题可能与第一个问题有关,当我在我的汽车模型上使用预测时一切正常,但如果我分解它,它就不起作用了。 通过分解,我的意思是采用 x_test 用卷积模型预测它,然后使用我们得到的东西来预测 deconv 模型。当我将卷积模型的结果提供给 deconv 模型时出现错误。 “无效参数:您必须使用 dtype float 为占位符张量 'input_CNN' 提供一个值”

要创建我正在做的汽车模型:

inputs = layers.Input(shape(128,128,1),name='input_CNN')
model_auto = models.Model(inputs,model_deconv(model_conv(inputs)))

如果需要,我可以为您提供更多详细信息。

编辑:

def CNN():
   inputs = layers.Input(shape=(128,128,1),name="input_CNN")
   layers_CNN = CNN_1_layers(inputs)
   model_conv = models.Model(inputs,layers_CNN,name='CNN_1')
   model_conv.compile(loss='categorical_crossentropy',optimizer=Adam(), metrics=[accuracy"])

   inputs_deconv = layers.Inputs(shape=(1,10),name="input_CNN_deconv")
   layers_CNN_deconv = CNN_1_deconv_layers(inputs_deconv)
   model_deconv = models.Model(inputs_deconv, layers_CNN_deconv,name="CNN_1_deconv")
   model_deconv.compile(loss='categorical_crossentropy',optimize=Adam(), metrics=["accuracy"])

   model_auto = models.Model(inputs,model_deconv(model_conv(inputs)))
   model_auto.compile(loss='categorical_crossentropy',optimize=Adam(), metrics=["accuracy"])

   return model_auto, model_conv, model_deconv

我的最后一层model_conv:

def CNN_1_layers(inputs):
   x = layers.Flattend(input_shape(1,1,10))(x)
   x = layers.Dense(10,activation='softmax')(x)

   return x

和反卷积层:

def CNN_1_deconv_layers(inputs_deconv):
   x = layers.Reshape((1,1,10))(x)
   w1 = tf.get_variable("w1",shape=[4,4,128,10],dtype=tf.float32)
   x = layers.Lambda(lambda x: tf.nn.conv2d_transpose(x,w1,output_shape=[1,4,4,128],strides=(1,1,1,1),padding='VALID'),name='deconv_0')(x)
   ...
   return x


def apprentissage(model,nb_epoch=100):
   checkpoint = ModelCheckpoint(filepath="CNN_1.h5",monitor='vall_acc', save_best_only=True,save_weights_only=False,mode='auto')
   hist= model.fit(train_X, train_y, batch_size=128, nb_epoch=nb_epoch, validation_data=(test_X,test_y), callbacks=[checkpoint])
   return hist

我正在使用网络外的另一台计算机进行编码,因此我必须手动重写所有内容,所以我总结了一下。

不知道我的评论是否对你的第一个问题有帮助(其实我没想到你的第一个问题会发生,但无论如何我给了你一个建议)。

对于你的第二个问题,我已经测试了你的代码(老兄,你有很多拼写错误 :D),没有问题。我会写下面的代码:

import numpy as np
import tensorflow as tf
from tensorflow import keras

# use below as you need
from tensorflow.keras.models import Sequential
from tensorflow.keras import layers
from tensorflow.keras.layers import *

# ----------------------

def CNN():
    inputs = layers.Input(shape=(128,128,1),name="input_CNN")
    layers_CNN = CNN_1_layers(inputs)
    model_conv = keras.Model(inputs,layers_CNN,name='CNN_1')
    model_conv.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])

    inputs_deconv = layers.Input(shape=(1,10),name="input_CNN_deconv")
    layers_CNN_deconv = CNN_1_deconv_layers(inputs_deconv)
    model_deconv = keras.Model(inputs_deconv, layers_CNN_deconv,name="CNN_1_deconv")
    model_deconv.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])

    model_auto = keras.Model(inputs,model_deconv(model_conv(inputs)))
    model_auto.compile(loss='categorical_crossentropy',optimizer='adam', metrics=["accuracy"])
    return model_auto, model_conv, model_deconv

# ----------------------

def CNN_1_layers(inputs):
   x = layers.Flatten(input_shape = (1,1,10))(inputs)
   x = layers.Dense(10,activation='softmax')(x)

   return x

# ----------------------

testX = np.random.rand(10, 128, 128, 1)

model_auto, model_conv, model_deconv = CNN()

print(model_auto(testX).shape)
conv_out = model_conv(testX)
deconv_out = model_deconv(conv_out)
print(deconv_out.shape)

谢谢阿明,你回答了我的问题,问题出在我输入变量的类型上。 (uint8 而不是 float32)即使类型错误,预测也能正常工作,但通过解决这个问题,我现在可以分解我的模型并且一切正常!

只剩下加载数据的问题了。 如果你告诉我你在做类似的事情时没有问题,我会做更多的测试。

好吧,我只是放弃并上传我所有的库到最后一个它似乎工作。