Python AttributeError:layer";输入“U 4”;具有多个具有不同输出形状的入站节点

Python AttributeError:layer";输入“U 4”;具有多个具有不同输出形状的入站节点,python,docker,tensorflow,keras,deep-learning,Python,Docker,Tensorflow,Keras,Deep Learning,属性错误:层“input_4”有多个入站节点,具有不同的 输出形状。因此,层的输出形状概念定义错误”。使用 取而代之的是在(节点索引)处获取_输出_形状_” 这段代码在Docker容器上运行非常好 两个docker容器上的docker容器的TensorFlow版本相同 版本2.1.0和Keras 2.2.4-tf。但是,在以前的系统上,我运行了 windows机器上的代码TensorFlow版本1.12.0和2.1.6-tf谢谢,非常感谢您的帮助 我使用本教程在docker容器中运行Tensor

属性错误:层“input_4”有多个入站节点,具有不同的 输出形状。因此,层的输出形状概念定义错误”。使用 取而代之的是在(节点索引)处获取_输出_形状_”

这段代码在Docker容器上运行非常好 两个docker容器上的docker容器的TensorFlow版本相同 版本2.1.0和Keras 2.2.4-tf。但是,在以前的系统上,我运行了 windows机器上的代码TensorFlow版本1.12.0和2.1.6-tf谢谢,非常感谢您的帮助 我使用本教程在docker容器中运行TensorFlow 下面

Docker文件

FROM tensorflow/tensorflow:latest-py3

RUN pip install -q keras

RUN pip install prettytable

RUN pip install pillow
Python代码

import numpy as np
from keras.applications.vgg19 import decode_predictions
from tensorflow.python.keras.models import load_model
from prettytable import PrettyTable
import time
from keras import backend as K
from tensorflow import keras
from tensorflow.python import keras
import time

model_2=load_model('model_2.h5',compile=False)
model_2.summary()

predictions1= np.load('predictions_result.npy')
times=[]
def profiler(model):
   layer_input = keras.layers.Input(batch_shape=model.get_layer('input_4').get_input_shape_at(0))
   x = layer_input
   t = PrettyTable( ['Layer', 'Latency (milliseconds)', 'Output (bytes)'] )
   for layer in model.layers:
      x = layer( x )
    # input and output of layer
      result = 1
      output_shape_list = []
      for i in layer.output_shape[1:]:
        result = result * i
        output_shape_list.append( i )

    intermediate_model = keras.Model( layer_input, x )
    start = time.time()
    intermediate_model = intermediate_model.predict(predictions1)
    np.save('predictions_result', intermediate_model)
    end = time.time() - start
    print(end)
    times.append(end)

    def convert_bytes(result):
        for x in ['bytes', 'KB', 'MB', 'GB', 'TB']:
            if result < 1024.0:
                return "%3.1f %s" % (result, x)
            result /= 1024.0
        return result
    t.add_row([type( layer ).__name__, round( end*1000, 2 ),  convert_bytes( result*4 )])
 print(t)

profiler(model_2)
print("Total Latency(milliseconds):", round(sum(times*1000),2))
tmp=np.zeros((1,28,28,512))

for i in range(0,1):
  tmp[i,:,:,:]=predictions1[i,:]

predictions2 = model_2.predict(tmp)
label_vgg19 = decode_predictions(predictions2)
print ('label_vgg19 =', label_vgg19)
将numpy导入为np
从keras.applications.vgg19导入解码\u预测
从tensorflow.python.keras.models导入负载模型
从prettytable导入prettytable
导入时间
从keras导入后端为K
从tensorflow进口keras
从tensorflow.python导入keras
导入时间
模型_2=加载模型('model_2.h5',compile=False)
模型2.摘要()
predictions1=np.load('predictions\u result.npy')
时间=[]
def档案器(型号):
图层输入=keras.layers.input(批处理形状=模型。获取图层(“输入4”)。获取(0)处的输入形状)
x=图层输入
t=PrettyTable(['Layer','Latency(毫秒)','Output(bytes)'))
对于model.layers中的图层:
x=层(x)
#层的输入和输出
结果=1
输出形状列表=[]
对于层中的i。输出_形状[1:]:
结果=结果*i
输出形状列表。追加(i)
中间_模型=keras.model(层_输入,x)
开始=时间。时间()
中间模型=中间模型。预测(预测1)
np.save('预测结果',中间模型)
结束=时间。时间()-开始
列印(完)
times.append(结束)
def convert_字节(结果):
对于x,单位为[‘字节’、‘KB’、‘MB’、‘GB’、‘TB’]:
如果结果<1024.0:
返回“%3.1f%s%”(结果,x)
结果/=1024.0
返回结果
t、 添加行([类型(层)。\uuuuuuu名称\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
打印(t)
剖面仪(型号2)
打印(“总延迟(毫秒):”,四舍五入(总和(乘以*1000),2))
tmp=np.零((1,28,28512))
对于范围(0,1)内的i:
tmp[i,:,:,:]=predictions1[i,:]
预测2=模型2.预测(tmp)
label_vgg19=解码预测(预测2)
打印('label_vgg19=',label_vgg19)

问题出现在下一行

`for i in layer.output_shape[1:]:'
固定的

shape=layer.get_output_at( 0 ).get_shape().as_list()
for i in shape[1:]:
  result = result * i 

这是一个版本不匹配:请检查您正在docker映像外部运行代码的版本和内部运行的版本。它们可能不同,并且它们之间的api发生了更改。您好,@Yuri-M-Dias我在两个docker容器上都有两个docker容器我有相同的TensorFlow版本2.1.0和Keras 2.2.4-tf。但是,在previo上在我们的系统中,我在windows机器TensorFlow版本1.12.0和2.1.6-tf上运行了代码