【问题标题】:how do I solve this error : AttributeError: 'NoneType' object has no attribute '_inbound_nodes'?如何解决此错误:AttributeError:'NoneType' 对象没有属性'_inbound_nodes'?
【发布时间】:2019-08-11 20:57:30
【问题描述】:

我有一个自动编码器,我尝试使用 lambda 在中间层中使用输入层的特定值并生成一个新张量并发送到下一层,但它会产生此错误:

Traceback(最近一次调用最后一次):

文件“”,第 99 行,在 model=Model(inputs=[image,wtm],outputs=decoded)

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

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

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

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1366 行,在 _map_graph_network tensor_index=tensor_index)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1353 行,在 build_map 节点索引,张量索引)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\network.py", 第 1325 行,在 build_map node = layer._inbound_nodes[node_index]

AttributeError: 'NoneType' 对象没有属性 '_inbound_nodes'

这是我的代码,在添加第一个 lambda 层后,它会产生这个错误!你能告诉为什么会发生这个错误吗?我感谢您的帮助?我需要的是这样的: wtm={[0,1,1,0],[0,1,1,0],[0,0,0,0],[0,1,0,0]} 我选择 wtm[:,i,j] 并生成形状为 (28,28,1) 且值为 wtm[:,i,j] 的新张量。

wt_random=np.random.randint(2, size=(49999,4,4))
w_expand=wt_random.astype(np.float32)
wv_random=np.random.randint(2, size=(9999,4,4))
wv_expand=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
w_test=w_test.reshape((1,4,4,1))

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

   rep=Kr.layers.Lambda(lambda x:Kr.backend.repeat(x,28))
    a=rep(Kr.layers.Lambda(lambda x:x[1,1])(wtm))

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


    #-----------------------decoder------------------------------------------------
    #------------------------------------------------------------------------------
    deconv1 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl1d')(encoded_merged)
    deconv2 = Conv2D(64, (5, 5), activation='elu', padding='same', name='convl2d')(deconv1)
    deconv3 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl3d')(deconv2)
    deconv4 = Conv2D(64, (5, 5), activation='elu',padding='same', name='convl4d')(deconv3)
    BNd=BatchNormalization()(deconv4)
    #DrO2=Dropout(0.25,name='DrO2')(BNd)

    decoded = Conv2D(1, (5, 5), activation='sigmoid', padding='same', name='decoder_output')(BNd) 
    #model=Model(inputs=image,outputs=decoded)

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

    decoded_noise = GaussianNoise(0.5)(decoded)

    #----------------------w extraction------------------------------------
    convw1 = Conv2D(64, (5,5), activation='relu', name='conl1w')(decoded_noise)#24
    convw2 = Conv2D(64, (5,5), activation='relu', name='convl2w')(convw1)#20
    #Avw1=AveragePooling2D(pool_size=(2,2))(convw2)
    convw3 = Conv2D(64, (5,5), activation='relu' ,name='conl3w')(convw2)#16
    convw4 = Conv2D(64, (5,5), activation='relu' ,name='conl4w')(convw3)#12
    #Avw2=AveragePooling2D(pool_size=(2,2))(convw4)
    convw5 = Conv2D(64, (5,5), activation='relu', name='conl5w')(convw4)#8
    convw6 = Conv2D(64, (5,5), activation='relu', name='conl6w')(convw5)#4
    convw7 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl7w',dilation_rate=(2,2))(convw6)#4
    convw8 = Conv2D(64, (5,5), activation='relu', padding='same',name='conl8w',dilation_rate=(2,2))(convw7)#4
    convw9 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl9w',dilation_rate=(2,2))(convw8)#4
    convw10 = Conv2D(64, (5,5), activation='relu',padding='same', name='conl10w',dilation_rate=(2,2))(convw9)#4
    BNed=BatchNormalization()(convw10)
    pred_w = Conv2D(1, (1, 1), activation='sigmoid', padding='same', name='reconstructed_W',dilation_rate=(2,2))(BNed)  

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

    w_extraction.summary()
(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)
w_extraction.compile(optimizer='adam', loss={'decoder_output':'mse','reconstructed_W':'binary_crossentropy'}, loss_weights={'decoder_output': 0.2, 'reconstructed_W': 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('best_model_5x5F_dp_gn.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=64, 
          validation_data=([x_validation,wv_expand], [x_validation,wv_expand]),
          callbacks=[TensorBoard(log_dir='E:concatnatenetwork', histogram_freq=0, write_graph=False),es,mc])

当我实现它时,会显示这个错误:

Traceback(最近一次调用最后一次):

文件“”,第 1 行,在 encoded_merged = add_const([encoded,a])

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\engine\base_layer.py", 第 457 行,在 调用 output = self.call(inputs, **kwargs)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\keras\layers\core.py", 第 687 行,通话中 return self.function(inputs, **arguments)

文件“”,第 1 行,在 add_const = Kr.layers.Lambda(lambda x: x[0] + x1)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\ops\math_ops.py", 第 866 行,在 binary_op_wrapper 中 返回函数(x, y, name=name)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\ops\gen_math_ops.py", 第 301 行,添加 "添加", x=x, y=y, name=name)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\op_def_library.py", 第 787 行,在 _apply_op_helper op_def=op_def)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\util\deprecation.py", 第 488 行,在 new_func 中 返回函数(*args, **kwargs)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\ops.py", 第 3274 行,在 create_op 中 op_def=op_def)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\ops.py", 第 1792 行,在 init 中 control_input_ops)

文件 "D:\software\Anaconda3\envs\py36\lib\site-packages\tensorflow\python\framework\ops.py", 第 1631 行,在 _create_c_op 引发 ValueError(str(e))

ValueError: 尺寸必须相等,但为 28 和 4 'lambda_9/add' (op: 'Add') 输入形状:[?,28,28,1], [4,28,1]。

【问题讨论】:

    标签: python tensorflow keras


    【解决方案1】:

    在 keras 中,每一层都应该是 keras 的 Layer 类的一个实例。在下一行

    a=rep(wtm[1,1])
    

    您正在选择张量元素而不使用 keras 层。此行导致错误。您应该将行更改为以下内容以处理错误。

    a=rep(Kr.layers.Lambda(lambda x:x[1,1])(wtm))
    

    编辑 1。

    由于 wtm 的形状为 [None, 4,4,1](您可以尝试打印形状),wtm[1,1] 将从第一个维度中选择一个元素,然后从所选元素中选择第一个元素。如果你想得到 [1,1] 形状数组,你可以做的是索引前三个维度。在这里你也应该注意批量大小,所以你想要的是具有形状 [Batchsize, 1] 的数组。这可以按如下方式完成。

    new_wtm = Kr.layers.Lambda(lambda x:x[:,1,1,:])(wtm)
    

    现在 new_wtm.shape 将为 [None, 1] 并且调用 repeat 方法将生成具有 shape[None, rep, 1] 的数组。

    rep=Kr.layers.Lambda(lambda x:Kr.backend.repeat(x,28))
    a=rep(Kr.layers.Lambda(lambda x:x[:,1,1,:])(wtm))
    print(a.shape) # [None, 28, 1]
    

    希望能解决问题

    编辑 2:

    要获取形状为[None, 28, 28,1]的a,需要使用平铺方法。

    rep=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]))
    a_1 = Kr.layers.Lambda(lambda x: x[:, 1, 1, :])(wtm)
    
    a=rep(Kr.layers.Reshape([1,1,1])(a_1))
    

    测试代码

    from keras.layers import Input, Concatenate, Activation,GaussianNoise,Dropout,BatchNormalization,MaxPool2D,AveragePooling2D
    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;
    #-----------------building w train---------------------------------------------
    
    #wv_expand=np.zeros((9999,28,28),dtype='float32')
    wt_random=np.random.randint(2, size=(49999,4,4))
    w_expand=wt_random.astype(np.float32)
    wv_random=np.random.randint(2, size=(9999,4,4))
    wv_expand=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
    w_test=w_test.reshape((1,4,4,1))
    
    #wt_expand=wt_expand.reshape((1,28,28,1))
    
    #-----------------------encoder------------------------------------------------
    #------------------------------------------------------------------------------
    wtm=Input((4,4,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)
    #conv3 = Conv2D(8, (3, 3), activation='relu', padding='same', name='convl3e', kernel_initializer='Orthogonal',bias_initializer='glorot_uniform')(conv2)
    BN=BatchNormalization()(conv3)
    #DrO1=Dropout(0.25,name='Dro1')(BN)
    encoded =  Conv2D(1, (5, 5), activation='relu', padding='same',name='encoded_I',dilation_rate=(2,2))(BN)
    
    #-----------------------adding w---------------------------------------
    
    
    #-----------------------decoder------------------------------------------------
    #------------------------------------------------------------------------------
    rep0=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]),name='aux0')
    a_0 = Kr.layers.Lambda(lambda x: x[:, 0, 0, :])(wtm)
    
    a0=rep0(Kr.layers.Reshape([1,1,1])(a_0))
    
    rep1=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]),name='aux1')
    a_1 = Kr.layers.Lambda(lambda x: x[:, 0, 1, :])(wtm)
    
    a1=rep1(Kr.layers.Reshape([1,1,1])(a_1))
    
    rep2=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]),name='aux2')
    a_2 = Kr.layers.Lambda(lambda x: x[:, 0, 2, :])(wtm)
    
    a2=rep2(Kr.layers.Reshape([1,1,1])(a_2))
    
    rep3=Kr.layers.Lambda(lambda x:Kr.backend.tile(x,[1, 28, 28, 1]),name='aux3')
    a_3 = Kr.layers.Lambda(lambda x: x[:, 0, 3, :])(wtm)
    
    a3=rep3(Kr.layers.Reshape([1,1,1])(a_3))
    
    
    add_const1 = Kr.layers.Lambda(lambda x: x[0] + x[1]+x[2]+x[3]+x[4],name='decoder_output')
    encoded_merged = add_const1([encoded,a0,a1,a2,a3])
    
    w=Model(inputs=[image,wtm],outputs=encoded_merged)
    
    w.summary()
    #----------------------training the model--------------------------------------
    #------------------------------------------------------------------------------
    #----------------------Data preparesion----------------------------------------
    
    (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(lr=0.0001,momentum=0.9)
    w.compile(optimizer='adam', loss={'decoder_output':'mse'}, metrics=['mae'])
    es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=40)
    mc = ModelCheckpoint('los4x4_repw.h5', monitor='val_loss', mode='min', verbose=1, save_best_only=True)
    history=w.fit([x_train,w_expand], x_train,
              epochs=1,
              batch_size=32, 
              validation_data=([x_validation,wv_expand], x_validation))
    w.summary()
    
    layer_name = 'lambda_96'
    intermediate_layer_model = Model(inputs=watermark_extraction.input,outputs=watermark_extraction.get_layer(layer_name).output)
    intermediate_output = intermediate_layer_model.predict([x_test[8000:8001],w_test])
    fig = plt.figure(figsize=(20, 20))
    
    rows = 8
    columns = 8
    
    first = intermediate_output
    
    for i in range(1, columns*rows +1):
        img = intermediate_output[0,:,:,i-1]
        fig.add_subplot(rows, columns, i)
        plt.imshow(img, interpolation='nearest',cmap='gray')
        plt.axis('off')
    plt.show()
    

    【讨论】:

    • 我更新了我的代码,这会产生这个错误。请帮助我该怎么办?
    • 第一个错误已经解决,但它产生了我上面提到的新错误。在这一行 (rep=Kr.layers.Lambda(lambda x:Kr.backend.repeat(x,28)) ,我想沿每个轴重复 wtm(1,1) 并产生 (28,28) 输出但是这个的输出是 (4,28)!我应该怎么做才能沿着两个轴重复一个值 28 次,或者最好说用 wtm(1,1) 填充形状为 (28,28) 的张量?请你帮我解决这个问题?我真的需要你的指导
    • Kr.layers.Lambda(lambda x:x[1,1])(wtm) 的输出形状是什么?我认为应该是(1,1)但它是(4,1)?!为什么?你能帮我解决这个问题并只访问 wtm 的一个元素吗?
    • 谢谢。根据您的输出,输出形状将为 [None,28,1]。但我需要产生一个形状为 [None,28,28] 的张量。我怎样才能做到这一点?我认为我的代码只是在一个维度上重复 wtm[:,1,1,:] 但我需要一个代码来在两个维度上重复它。你能帮我解决这个问题吗?
    • shape [None,28,28]...,你确定吗?您不能使用 encoded 添加此数组,因为编码的形状为 [None, 28, 28, 1]。所以你正在寻找的是获得形状为 [None, 28, 28, 1] 的张量。我将更新代码以反映这一点。
    猜你喜欢
    • 2019-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 2019-09-23
    • 1970-01-01
    • 2018-12-01
    • 1970-01-01
    • 2019-12-08
    相关资源
    最近更新 更多