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

时间:2020-11-05 09:41:14

标签: python tensorflow deep-learning deconvolution

想法是在我的卷积模型之后创建一个反卷积模型,以了解学习像素的重要性。

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

以及deconv层:

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

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

3 个答案:

答案 0 :(得分:0)

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

对于第二个问题,我已经测试了您的代码(您有很多错别字: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)

答案 1 :(得分:0)

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

仅加载数据仍然存在问题。 如果您告诉我,您在执行类似操作时没有问题,我会做更多测试。

答案 2 :(得分:0)

好吧,我只是放弃了所有的lib并将其上传到似乎可以使用的最后一个lib。

相关问题