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