为什么在Keras中发生此错误?当我想将整个网络分成两个模型时? [英] why does this error happen in Keras,"Graph disconnected" when I want to separate whole network into two models?

查看:89
本文介绍了为什么在Keras中发生此错误?当我想将整个网络分成两个模型时?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在keras中有一个自动编码器,我需要为每个部分定义一个不同的模型,因为我的网络有两个输出,并且我想在测试过程中为每个输出有两个单独的网络,但是当我这样做时,它会产生以下结果错误.

I have an autoencoder in keras and I need to define a different model for each part because my network has two outputs and I want to have two separate network for each output during the test, but when I do this it produces the following error.

回溯(最近通话最近一次):

Traceback (most recent call last):

文件",第99行,在 wext = Model(inputs = decoded_noise,outputs = pred_w)

File "", line 99, in wext=Model(inputs=decoded_noise,outputs=pred_w)

文件 "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ legacy \ interfaces.py", 第91行,在包装器中 返回func(* args,** kwargs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\legacy\interfaces.py", line 91, in wrapper return func(*args, **kwargs)

文件 "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", 第93行,初始化 self._init_graph_network(* args,** kwargs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 93, in init self._init_graph_network(*args, **kwargs)

文件 "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", _init_graph_network中的第231行 self.inputs,self.outputs)

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 231, in _init_graph_network self.inputs, self.outputs)

文件 "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", _map_graph_network中的第1443行 str(layers_with_complete_input))

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", line 1443, in _map_graph_network str(layers_with_complete_input))

ValueError:图形已断开:无法获取张量的值 层上的Tensor("input_8:0",shape =(?, 28,28,1),dtype = float32) "input_8".可以访问以下先前的层,而不会出现问题: []

ValueError: Graph disconnected: cannot obtain value for tensor Tensor("input_8:0", shape=(?, 28, 28, 1), dtype=float32) at layer "input_8". The following previous layers were accessed without issue: []

在测试期间,我希望有两个网络,其中一个网络从编码器到解码器的末端,第二个网络用于w提取部分.问题是什么?谢谢你.

I want to have two networks during test one of them from the encoder to end of the decoder and second for w extraction part. what is the problem? Thank you.

#-----------------------encoder------------------------------------------------
wtm=Input((28,28,1))
image = Input((28, 28, 1))
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e',dilation_rate=(2,2))(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e',dilation_rate=(2,2))(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e',dilation_rate=(2,2))(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I',dilation_rate=(2,2))(BN)


add_const = Kr.layers.Lambda(lambda x: x[0] + x[1])
encoded_merged = add_const([encoded,wtm])

#-----------------------decoder------------------------------------------------
deconv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1d',dilation_rate=(2,2))(encoded_merged)
deconv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2d',dilation_rate=(2,2))(deconv1)
deconv3 = Conv2D(64, (5, 5), activation='relu',padding='same', name='convl3d',dilation_rate=(2,2))(deconv2)
deconv4 = Conv2D(64, (5, 5), activation='relu',padding='same', name='convl4d',dilation_rate=(2,2))(deconv3)
BNd=BatchNormalization()(deconv3)

decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output',dilation_rate=(2,2))(BNd) 

model1=Model(inputs=[image,wtm],outputs=decoded)

decoded_noise = GaussianNoise(0.5)(decoded)

#----------------------w extraction------------------------------------
convw1 = Conv2D(64, (3,3), activation='relu', padding='same', name='conl1w',dilation_rate=(2,2))(decoded_noise)
convw2 = Conv2D(64, (3, 3), activation='relu', padding='same', name='convl2w',dilation_rate=(2,2))(convw1)
convw3 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl3w',dilation_rate=(2,2))(convw2)
convw4 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl4w',dilation_rate=(2,2))(convw3)
convw5 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl5w',dilation_rate=(2,2))(convw4)
convw6 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl6w',dilation_rate=(2,2))(convw5)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(convw6)  
wext=Model(inputs=decoded_noise,outputs=pred_w)
final=Model(inputs=[image,wtm],outputs=[decoded,pred_w])

修改后的代码:

from keras.layers import Input, Concatenate, GaussianNoise,Cropping2D,Activation,Dropout,BatchNormalization,MaxPool2D,AveragePooling2D,ZeroPadding2D
from keras.layers import Conv2D, AtrousConv2D
from keras.models import Model
from keras.datasets import mnist
from keras.callbacks import TensorBoard
from keras import backend as K
from keras import layers
import matplotlib.pyplot as plt
import tensorflow as tf
import keras as Kr
from keras.optimizers import SGD,RMSprop,Adam
from keras.callbacks import ReduceLROnPlateau
from keras.callbacks import EarlyStopping
from keras.callbacks import ModelCheckpoint
import numpy as np
import pylab as pl
import matplotlib.cm as cm
import keract
from matplotlib import pyplot
from keras import optimizers
from keras import regularizers

from tensorflow.python.keras.layers import Lambda;
w_expand=np.zeros((49999,28,28),dtype='float32')
wv_expand=np.zeros((9999,28,28),dtype='float32')
wt_random=np.random.randint(2, size=(49999,4,4))
wt_random=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_random=wv_random.astype(np.float32)
w_expand[:,:4,:4]=wt_random
wv_expand[:,:4,:4]=wv_random
x,y,z=w_expand.shape
w_expand=w_expand.reshape((x,y,z,1))
x,y,z=wv_expand.shape
wv_expand=wv_expand.reshape((x,y,z,1))

#-----------------building w test---------------------------------------------
w_test = np.random.randint(2,size=(1,4,4))
w_test=w_test.astype(np.float32)
wt_expand=np.zeros((1,28,28),dtype='float32')
wt_expand[:,0:4,0:4]=w_test
wt_expand=wt_expand.reshape((1,28,28,1))
#-----------------------encoder------------------------------------------------
#------------------------------------------------------------------------------
wtm=Input((28,28,1))
image = Input((28, 28, 1))
conv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1e',dilation_rate=(2,2))(image)
conv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2e',dilation_rate=(2,2))(conv1)
conv3 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl3e',dilation_rate=(2,2))(conv2)
BN=BatchNormalization()(conv3)
encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I',dilation_rate=(2,2))(BN)


add_const = Kr.layers.Lambda(lambda x: x[0] + x[1])
encoded_merged = add_const([encoded,wtm])

#-----------------------decoder------------------------------------------------
deconv1 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl1d',dilation_rate=(2,2))(encoded_merged)
deconv2 = Conv2D(64, (5, 5), activation='relu', padding='same', name='convl2d',dilation_rate=(2,2))(deconv1)
deconv3 = Conv2D(64, (5, 5), activation='relu',padding='same', name='convl3d',dilation_rate=(2,2))(deconv2)
deconv4 = Conv2D(64, (5, 5), activation='relu',padding='same', name='convl4d',dilation_rate=(2,2))(deconv3)
BNd=BatchNormalization()(deconv3)

decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output',dilation_rate=(2,2))(BNd) 

model1=Model(inputs=[image,wtm],outputs=decoded)
decoded_input=Input((28,28,1))

#----------------------w extraction------------------------------------
convw1 = Conv2D(64, (3,3), activation='relu', padding='same', name='conl1w',dilation_rate=(2,2))(decoded_input)
convw2 = Conv2D(64, (3, 3), activation='relu', padding='same', name='convl2w',dilation_rate=(2,2))(convw1)
convw3 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl3w',dilation_rate=(2,2))(convw2)
convw4 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl4w',dilation_rate=(2,2))(convw3)
convw5 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl5w',dilation_rate=(2,2))(convw4)
convw6 = Conv2D(64, (3, 3), activation='relu', padding='same', name='conl6w',dilation_rate=(2,2))(convw5)
pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(convw6)  
decoded_noise = GaussianNoise(0.5)(decoded)
wext=Model(inputs=decoded_input, outputs=pred_w)
pred_w = wext(decoded_noise)

w_extraction=Model(inputs=[image,wtm],outputs=[decoded,pred_w])
#----------------------training the model-----------------------------------

(x_train, _), (x_test, _) = mnist.load_data()
x_validation=x_train[1:10000,:,:]
x_train=x_train[10001:60000,:,:]
#
x_train = x_train.astype('float32') / 255.
x_test = x_test.astype('float32') / 255.
x_validation = x_validation.astype('float32') / 255.
x_train = np.reshape(x_train, (len(x_train), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_test = np.reshape(x_test, (len(x_test), 28, 28, 1))  # adapt this if using `channels_first` image data format
x_validation = np.reshape(x_validation, (len(x_validation), 28, 28, 1))

#---------------------compile and train the model------------------------------
opt=SGD(momentum=0.99,lr=0.0001)
w_extraction.compile(optimizer='adam', loss={'imageprim':'mse','wprimmain':'binary_crossentropy'}, loss_weights={'imageprim': 1.0, 'wprimmain': 1.0},metrics=['mae'])
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=40)
#rlrp = ReduceLROnPlateau(monitor='val_loss', factor=0.1, patience=20, min_delta=1E-4, verbose=1)
mc = ModelCheckpoint('los4x4_con_tile_convolw_FBN_SigAct_SandPAttack.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)
history=w_extraction.fit([x_train,w_expand], [x_train,w_expand],
          epochs=1,
          batch_size=32, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='/home/jamalm8/tensorboardGNWLoss/', histogram_freq=0, write_graph=False),es,mc])
w_extraction.summary()

产生的错误:

回溯(最近通话最近一次):

Traceback (most recent call last):

文件",第113行,在 w_extraction.compile(optimizer ='adam',loss = {''imageprim':'mse','wprimmain':'binary_crossentropy'}, loss_weights = {'imageprim':1.0,'wprimmain':1.0},metrics = ['mae'])

File "", line 113, in w_extraction.compile(optimizer='adam', loss={'imageprim':'mse','wprimmain':'binary_crossentropy'}, loss_weights={'imageprim': 1.0, 'wprimmain': 1.0},metrics=['mae'])

文件 "D:\ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ training.py", 第119行,在编译中 str(self.output_names))

File "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\training.py", line 119, in compile str(self.output_names))

ValueError:丢失字典中的未知条目:"imageprim".仅有的 需要以下键:['decoder_output','model_29']

ValueError: Unknown entry in loss dictionary: "imageprim". Only expected the following keys: ['decoder_output', 'model_29']

推荐答案

问题是decoded_noise不是Input层,因此在定义wext模型时不能将其作为输入.而是为您的wext模型定义一个新的输入层:

The problem is that decoded_noise is not an Input layer so you can't you it as input when defining your wext model. Instead, define a new input layer for your wext model:

#----------------------w extraction------------------------------------
# Here we define a new input to be used by the wext model
decoded_input = Input((28,28,1)) 
convw1 = Conv2D(64, (3,3), ...)(decoded_input)
convw2 = ...
...
pred_w = ...

wext=Model(inputs=decoded_input, outputs=pred_w)

# Final model: pass the gaussian noise through the wext model
decoded_noise = GaussianNoise(0.5)(decoded)
pred_w = wext(decoded_noise)

final=Model(inputs=[image, wtm], outputs=[decoded, pred_w])

这篇关于为什么在Keras中发生此错误?当我想将整个网络分成两个模型时?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆