Как решить эту ошибку: AttributeError: у объекта 'NoneType' нет атрибута '_inbound_nodes'? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть автоэнкодер, и я пытаюсь использовать конкретное значение входного слоя в промежуточном слое, используя лямбду, и создаю новый тензор и отправлять в следующие слои, но он выдает эту ошибку:

Traceback(последний вызов был последним):

Файл "", строка 99, в модели = Модель (входные данные = [изображение, wtm], выходные данные = декодированные)

Файл "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)

File"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 tenor_index = тензор_индекс)

Файл" D: \ software \ Anaconda3 \ envs \ py36 "\ Lib \ site-packages \ keras \ engine \ network.py ", строка 1353, в build_map node_index, тензор_индекс)

Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras "\ engine \ network.py ", строка 1353, в build_map node_index, тензор_индекса)

Файл" D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py ", строка 1353, в build_map node_index, тензор_индекс)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", строка 1353, в build_map node_index, tenors_index)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", строка 1353, в build_map node_index, tenor_index)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py", строка 1353, в build_map node_index, тензор_индекс)

Файл "D: \software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ network.py ", строка 1353, в build_map node_index, тензор_индекс)

Файл" 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'

это мой код и после добавления первого лямбда-слоя выдает эту ошибку!не могли бы вы рассказать, почему произошла эта ошибка?Я ценю вашу помощь?мне нужно вот что: 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])

при реализацииэто, эта ошибка показана:

Трассировка (последний последний вызов):

Файл "", строка 1, в encoded_merged = add_const ([кодированный, a])

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ engine \ base_layer.py", строка 457, в вызов output = self.call (входные данные, ** kwargs)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ keras \ Layers \ core.py", строка 687, в функции возврата вызова self.function (входные данные, ** аргументы)

Файл "", строка 1, в add_const = Kr.layers.Lambda (лямбда х: х [0] + х 1 )

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ ops \ math_ops.py", строка 866, в двоичном_оперехвате возвращает func (x, y, name = name)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ensorflow \ python \ ops \ gen_math_ops.py", строка 301, добавьте «Добавить», x = x, y = y, name = name)

Файл "D: \ software \ Anaconda3 \ envs \ py36 \ lib \ site-packages \ tenorflow \ python \ framework\ op_def_library.py ", строка 787, в _apply_op_helper op_def = op_def)

Файл"D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ Util \ deprecation.py", строка 488, в new_func return func (* args, ** kwargs)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ рамки \ ops.py", строка 3274, в create_op op_def = op_def)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ рамки \ ops.py", строка 1792, в init control_input_ops)

Файл "D: \ Software \ Anaconda3 \ envs \ py36 \ Lib \ сайт-пакеты \ tensorflow \ питон \ рамки \ ops.py", строка 1631, в _create_c_op поднять ValueError (str (e))

ValueError: Размеры должны быть равны, но 28 и 4 для 'lambda_9 / add' (op: 'Add') с входными фигурами: [?, 28,28,1], [4,28,1].

enter image description here

1 Ответ

0 голосов
/ 21 марта 2019

В керасе каждый слой должен быть экземпляром класса слоя кераса.В следующей строке

a=rep(wtm[1,1])

Вы выбираете тензорный элемент без использования слоя keras.Эта строка вызывает ошибку.Вы должны изменить строку на следующую, чтобы справиться с ошибкой.

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

Редактировать 1.

Поскольку wtm имеет форму [Нет, 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 даст массив с формой [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:

Чтобы получить a с формой [Нет, 28, 28,1], вам нужно использовать метод плиток.

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...