Tensorflow 我试图合并2个预训练的keras模型,但失败了

Tensorflow 我试图合并2个预训练的keras模型,但失败了,tensorflow,keras,deep-learning,Tensorflow,Keras,Deep Learning,我的目标是使用keras加载“2相同”的pretrain模型(resnet或inception_net或其他什么),将它们展平并添加两个新层来训练它们。我以为这是一项简单的任务,但我就是做不到 我尝试了很多不同的方法,但编译器一直告诉我我犯了错误(1.不能被展平2.一些奇怪的张量不在图中等) 请帮帮我 (注:我甚至不能“将tensorflow作为tf导入”,否则模型将显示另一个新问题) 这是我的代码: from keras.models import Model from keras.layer

我的目标是使用keras加载“2相同”的pretrain模型(resnet或inception_net或其他什么),将它们展平并添加两个新层来训练它们。我以为这是一项简单的任务,但我就是做不到

我尝试了很多不同的方法,但编译器一直告诉我我犯了错误(1.不能被展平2.一些奇怪的张量不在图中等)

请帮帮我

(注:我甚至不能“将tensorflow作为tf导入”,否则模型将显示另一个新问题)

这是我的代码:

from keras.models import Model
from keras.layers import Dense, concatenate
from keras.applications import vgg16
import numpy as np
import pandas as pd
import keras
from keras.layers import Dense, Flatten, Concatenate,Input,Conv2D
from keras.models import Model
#import tensorflow as tf
from tensorflow import reset_default_graph
from keras.layers import Dense, concatenate
from keras.applications import vgg16
import numpy as np
import pandas as pd
import keras
from keras.layers import Dense, Flatten, Concatenate,Input,Dropout
from keras.models import Model
#import tensorflow as tf
from tensorflow import reset_default_graph
from keras.applications.resnet50 import ResNet50
from keras.preprocessing import image
from keras.applications.resnet50 import preprocess_input, decode_predictions
import tensorflow as tf
reset_default_graph()
#vgg16_model =vgg16. VGG16(weights="imagenet", include_top=False, input_shape=(224,224,3))
#x = vgg16_model.output

resnet50_model =ResNet50(weights="imagenet", include_top=False, input_shape=(224,224,3))
x = resnet50_model.output

x=Flatten()(x)
x=Dense(256, activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(3, activation='softmax')(x)

#model_1 = Model(inputs=vgg16_model.input, outputs=predictions)
model_1 = Model(inputs=resnet50_model.input, outputs=predictions)

#vgg16_model =vgg16. VGG16(weights="imagenet", include_top=False, input_shape=(224,224,3))
#x = vgg16_model.output
resnet50_model =ResNet50(weights="imagenet", include_top=False, input_shape=(224,224,3))
x = resnet50_model.output

x=Flatten()(x)
x=Dense(256, activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(3, activation='softmax')(x)

#model_2 = Model(inputs=vgg16_model.input, outputs=predictions)
model_2 = Model(inputs=resnet50_model.input, outputs=predictions)

merged = concatenate([model_1.output, model_2.output])
#merged=Conv2D(64, (3, 3))(merged)
merged=Flatten()(merged)
merged=Dropout(0.5)(merged)
merged = Dense(1024, activation='relu')(merged)
merged = Dense(num_classes, activation='softmax')(merged)

model_fusion = Model([model_1.input, model_2.input], merged)
model_fusion.compile('adam', loss = 'binary_crossentropy')
model_fusion.summary()
这是错误消息

ValueError                                Traceback (most recent call last)
<ipython-input-1-c22d3213d917> in <module>
     52 merged = concatenate([model_1.output, model_2.output])
     53 #merged=Conv2D(64, (3, 3))(merged)
---> 54 merged=Flatten()(merged)
     55 merged=Dropout(0.5)(merged)
     56 merged = Dense(1024, activation='relu')(merged)

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\engine\base_layer.py in __call__(self, inputs, **kwargs)
    412                 # Raise exceptions in case the input is not compatible
    413                 # with the input_spec specified in the layer constructor.
--> 414                 self.assert_input_compatibility(inputs)
    415 
    416                 # Collect input shapes to build layer.

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\engine\base_layer.py in assert_input_compatibility(self, inputs)
    325                                      self.name + ': expected min_ndim=' +
    326                                      str(spec.min_ndim) + ', found ndim=' +
--> 327                                      str(K.ndim(x)))
    328             # Check dtype.
    329             if spec.dtype is not None:

ValueError: Input 0 is incompatible with layer flatten_3: expected min_ndim=3, found ndim=2
顺便说一句,如果我再次尝试执行代码,它将显示以下消息:

Using TensorFlow backend.
WARNING: Logging before flag parsing goes to stderr.
W0112 07:22:12.336960 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:74: The name tf.get_default_graph is deprecated. Please use tf.compat.v1.get_default_graph instead.

W0112 07:22:12.351963 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:517: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.

W0112 07:22:12.356964 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:4185: The name tf.truncated_normal is deprecated. Please use tf.random.truncated_normal instead.

W0112 07:22:12.376968 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:174: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.

W0112 07:22:12.378969 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:181: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.

W0112 07:22:12.408976 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:1834: The name tf.nn.fused_batch_norm is deprecated. Please use tf.compat.v1.nn.fused_batch_norm instead.

W0112 07:22:12.460988 14720 deprecation_wrapper.py:119] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:3976: The name tf.nn.max_pool is deprecated. Please use tf.nn.max_pool2d instead.

C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras_applications\resnet50.py:265: UserWarning: The output shape of `ResNet50(include_top=False)` has been changed since Keras 2.2.0.
  warnings.warn('The output shape of `ResNet50(include_top=False)` '
W0112 07:22:18.834421 14720 deprecation.py:506] From C:\Users\User\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py:3445: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.
Instructions for updating:
Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.
简短版本:

TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.
长版本:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1112             subfeed_t = self.graph.as_graph_element(
-> 1113                 subfeed, allow_tensor=True, allow_operation=False)
   1114           except Exception as e:

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\tensorflow\python\framework\ops.py in as_graph_element(self, obj, allow_tensor, allow_operation)
   3795     with self._lock:
-> 3796       return self._as_graph_element_locked(obj, allow_tensor, allow_operation)
   3797 

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\tensorflow\python\framework\ops.py in _as_graph_element_locked(self, obj, allow_tensor, allow_operation)
   3874       if obj.graph is not self:
-> 3875         raise ValueError("Tensor %s is not an element of this graph." % obj)
   3876       return obj

ValueError: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.

During handling of the above exception, another exception occurred:

TypeError                                 Traceback (most recent call last)
<ipython-input-2-c22d3213d917> in <module>
     26 #x = vgg16_model.output
     27 
---> 28 resnet50_model =ResNet50(weights="imagenet", include_top=False, input_shape=(224,224,3))
     29 x = resnet50_model.output
     30 

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\applications\__init__.py in wrapper(*args, **kwargs)
     26             kwargs['models'] = models
     27             kwargs['utils'] = utils
---> 28         return base_fun(*args, **kwargs)
     29 
     30     return wrapper

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\applications\resnet50.py in ResNet50(*args, **kwargs)
      9 @keras_modules_injection
     10 def ResNet50(*args, **kwargs):
---> 11     return resnet50.ResNet50(*args, **kwargs)
     12 
     13 

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras_applications\resnet50.py in ResNet50(include_top, weights, input_tensor, input_shape, pooling, classes, **kwargs)
    289                 cache_subdir='models',
    290                 md5_hash='a268eb855778b3df3c7506639542a6af')
--> 291         model.load_weights(weights_path)
    292         if backend.backend() == 'theano':
    293             keras_utils.convert_all_kernels_in_model(model)

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\engine\network.py in load_weights(self, filepath, by_name, skip_mismatch, reshape)
   1164             else:
   1165                 saving.load_weights_from_hdf5_group(
-> 1166                     f, self.layers, reshape=reshape)
   1167 
   1168     def _updated_config(self):

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\engine\saving.py in load_weights_from_hdf5_group(f, layers, reshape)
   1056                              ' elements.')
   1057         weight_value_tuples += zip(symbolic_weights, weight_values)
-> 1058     K.batch_set_value(weight_value_tuples)
   1059 
   1060 

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\keras\backend\tensorflow_backend.py in batch_set_value(tuples)
   2468             assign_ops.append(assign_op)
   2469             feed_dict[assign_placeholder] = value
-> 2470         get_session().run(assign_ops, feed_dict=feed_dict)
   2471 
   2472 

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\tensorflow\python\client\session.py in run(self, fetches, feed_dict, options, run_metadata)
    948     try:
    949       result = self._run(None, fetches, feed_dict, options_ptr,
--> 950                          run_metadata_ptr)
    951       if run_metadata:
    952         proto_data = tf_session.TF_GetBuffer(run_metadata_ptr)

~\Anaconda3\envs\tensorflow-gpu2\lib\site-packages\tensorflow\python\client\session.py in _run(self, handle, fetches, feed_dict, options, run_metadata)
   1114           except Exception as e:
   1115             raise TypeError(
-> 1116                 'Cannot interpret feed_dict key as Tensor: ' + e.args[0])
   1117 
   1118           if isinstance(subfeed_val, ops.Tensor):

TypeError: Cannot interpret feed_dict key as Tensor: Tensor Tensor("Placeholder:0", shape=(7, 7, 3, 64), dtype=float32) is not an element of this graph.
---------------------------------------------------------------------------
ValueError回溯(最近一次调用上次)
运行中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\tensorflow\python\client\session.py(self、handle、fetches、feed、dict、options、run\u元数据)
1112 subfeed\u t=self.graph.as\u graph\u元素(
->1113子进纸,允许张量=真,允许操作=假)
1114例外情况除外,如e:
as\u graph\u元素中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\tensorflow\python\framework\ops.py(self、obj、allow\u tensor、allow\u operation)
3795带自锁:
->3796返回自作为图元素锁定(obj、允许张量、允许操作)
3797
~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\tensorflow\python\framework\ops.py in\u as\u graph\u element\u locked(self、obj、allow\u tensor、allow\u operation)
3874如果obj.graph不是自身:
->3875 raise VALUERROR(“张量%s不是此图的元素。”%obj)
3876返回obj
ValueError:Tensor Tensor(“占位符:0”,shape=(7,7,3,64),dtype=float32)不是此图形的元素。
在处理上述异常期间,发生了另一个异常:
TypeError回溯(最近一次调用上次)
在里面
26#x=VGG16U型输出
27
--->28 resnet50_model=resnet50(weights=“imagenet”,include_top=False,input_shape=(224224,3))
29 x=resnet50_型号输出
30
包装中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\applications\\ uuuu init\uuuuuu.py(*args,**kwargs)
26 kwargs[“模型”]=模型
27 kwargs['utils']=utils
--->28返回基地乐趣(*args,**kwargs)
29
30返回包装器
resnet50中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\applications\resnet50.py(*args,**kwargs)
9@keras\u模块\u注入
10 def ResNet50(*args,**kwargs):
--->11返回resnet50.resnet50(*args,**kwargs)
12
13
resnet50中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\u applications\resnet50.py(包括顶部、权重、输入张量、输入形状、池、类、**kwargs)
289缓存_subdir='models',
290 md5_hash='a268eb855778b3df3c7506639542a6af')
-->291型号。负载重量(重量路径)
292如果backend.backend()
293 keras_utils.转换_模型中的所有_内核(模型)
加载权重中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\engine\network.py(self、filepath、按名称、跳过不匹配、重塑)
1164其他:
1165保存。从组hdf5加载权重(
->1166 f,自我层,重塑=重塑)
1167
1168 def_更新的_配置(自身):
~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\engine\saving.py从\u hdf5\u组(f,层,重塑)加载
1056“元素”。)
1057权重值元组+=zip(符号权重、权重值)
->1058 K.批次设置值(重量值元组)
1059
1060
~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\keras\backend\tensorflow\u backend.py in batch\u set\u值(元组)
2468分配操作追加(分配操作)
2469馈送指令[分配占位符]=值
->2470获取会话()。运行(分配操作,提要内容=提要内容)
2471
2472
运行中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\tensorflow\python\client\session.py(self、fetches、feed\u dict、options、run\u元数据)
948尝试:
949结果=self.\u运行(无、获取、馈送、选项、,
-->950运行(元数据(ptr)
951如果运行\u元数据:
952 proto_data=tf_session.tf_GetBuffer(运行元数据\u ptr)
运行中的~\Anaconda3\envs\tensorflow-gpu2\lib\site packages\tensorflow\python\client\session.py(self、handle、fetches、feed、dict、options、run\u元数据)
1114例外情况除外,如e:
1115 raise TYPE错误(
->1116'无法将提要索引键解释为张量:'+e.args[0])
1117
1118如果存在(副进纸值,操作张量):
TypeError:无法将feed_dict键解释为张量:张量张量(“占位符:0”,shape=(7,7,3,64),dtype=float32)不是此图的元素。

非常感谢您阅读本段。

我做了一些小的编辑。将导入语句更改为使用tensorflow keras。使用VGG代替ResNet以避免层名称冲突。为num_类提供了任意值。但是,我不确定该体系结构是否有效,尽管整个代码运行正常

#Edited imports to have TF keras instead of keras.
import tensorflow
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, concatenate
from tensorflow.keras.applications import vgg16
import numpy as np
#import pandas as pd
#import keras
from tensorflow.keras.layers import Dense, Flatten, Concatenate,Input,Conv2D
from tensorflow.keras.models import Model
#import tensorflow as tf
from tensorflow import reset_default_graph
from tensorflow.keras.layers import Dense, concatenate
from tensorflow.keras.applications import vgg16
#import numpy as np
#import pandas as pd
#import keras
from tensorflow.keras.layers import Dense, Flatten, Concatenate,Input,Dropout
from tensorflow.keras.models import Model
#import tensorflow as tf
from tensorflow import reset_default_graph
from tensorflow.keras.applications.resnet50 import ResNet50
from tensorflow.keras.preprocessing import image
from tensorflow.keras.applications.resnet50 import preprocess_input, decode_predictions
#import tensorflow as tf
#reset_default_graph()
#vgg16_model =vgg16. VGG16(weights="imagenet", include_top=False, input_shape=(224,224,3))
#x = vgg16_model.output

resnet50_model =ResNet50(weights="imagenet", include_top=False, input_shape=(224,224,3))
x = resnet50_model.output

x=Flatten()(x)
x=Dense(256, activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(3, activation='softmax')(x)

#model_1 = Model(inputs=vgg16_model.input, outputs=predictions)
model_1 = Model(inputs=resnet50_model.input, outputs=predictions)

vgg16_model =vgg16. VGG16(weights="imagenet", include_top=False, input_shape=(224,224,3))#Edited here.Using same model causes name conflicts of layers.Every layer names should be unique.
x = vgg16_model.output
#resnet50_model =ResNet50(weights="imagenet", include_top=False, input_shape=(224,224,3))
#x = resnet50_model.output

x=Flatten()(x)
x=Dense(256, activation='relu')(x)
x=Dropout(0.5)(x)
predictions=Dense(3, activation='softmax')(x)

model_2 = Model(inputs=vgg16_model.input, outputs=predictions)
#model_2 = Model(inputs=resnet50_model.input, outputs=predictions)

merged = concatenate([model_1.output, model_2.output])
print(merged)
#merged=Conv2D(64, (3, 3))(merged)
merged=Flatten()(merged)
merged=Dropout(0.5)(merged)
merged = Dense(1024, activation='relu')(merged)
num_classes=3#Edited here added num_classes explicitly.
merged = Dense(num_classes, activation='softmax')(merged)

model_fusion = Model([model_1.input, model_2.input], merged)
model_fusion.compile('adam', loss = 'binary_crossentropy')
model_fusion.summary()

请发布你的“一些奇怪的张量”错误的完整跟踪。