Keras functional API创建神经网络-常见错误之——NoneType‘ object has no attribute ‘_inbound_nodes‘
在 使用 functional API模式创建神经网络时,每一层网络以及每一个操作都要以 keras中层 的含义来表示,比如 将两个特征拼接,从一个大特征中取出一小块,这些操作不当就会 报错: ‘NoneType‘ object has no attribute ‘_inbound_nodes‘
import keras
import keras as K
from skimage.filters import threshold_otsu
from keras.layers import Input, Dense, Conv2D, Dropout, Flatten, BatchNormalization, Activation
# 会报错的代码
def getModel(CHANNELS, num):
input_plane = Input(shape=(CHANNELS+num, CHANNELS+num, 1))
input_1 = input_plane[:,:CHANNELS, :CHANNELS,:]
conv_11 = Conv2D(32, kernel_size=(3, 3))(input_1 )
conv_1_bn1 = BatchNormalization()(conv_11)
flatten1 = Flatten()(conv_1_bn1 )
input_2 = input_plane[:, :num, :num, :]
conv_12 = Conv2D(32, kernel_size=(3, 3))(input_2 )
conv_1_bn2 = BatchNormalization()(conv_12)
flatten2 = Flatten()(conv_1_bn2)
flatten = keras.layers.concatenate([flatten1, flatten2], axis=1) #tf.concat就会报错
fc_1 = Dense(64)(flatten)
fc_1_bn = BatchNormalization()(fc_1)
model = Model(inputs=input_plane , outputs=fc_1_bn ) #模型创建完毕,但还是报错
## 报错: ‘NoneType‘ object has no attribute ‘_inbound_nodes‘
错误原因:其实我有两个输入,一个输出,我把两个输入放进一个数组中,在模型当中,我分别取出,这部分没有处理成 层,因此报错。
正确处理方式:
input_1= Input(shape=(CHANNELS, CHANNELS, 1)) #采用Input层来构建input_1
input_2= Input(shape=(num, num, 1)) #采用Input层来构建input_2
#模型有两个输入,用列表的方式作为输入,不能像pytorch那样,有多个参数传入,只能是inputs 和outpus这两个。
model = Model(inputs=[input_1, input_2 ] , outputs=fc_1_bn )
import keras
import keras as K
from skimage.filters import threshold_otsu
from keras.layers import Input, Dense, Conv2D, Dropout, Flatten, BatchNormalization, Activation
# 修改后 的代码
def getModel(CHANNELS, num):
#input_plane = Input(shape=(CHANNELS+num, CHANNELS+num, 1))
#input_1 = input_plane[:,:CHANNELS, :CHANNELS,:]
input_1= Input(shape=(CHANNELS, CHANNELS, 1)) #采用Input层来构建input_1
conv_11 = Conv2D(32, kernel_size=(3, 3))(input_1 )
conv_1_bn1 = BatchNormalization()(conv_11)
flatten1 = Flatten()(conv_1_bn1 )
#input_2 = input_plane[:, :num, :num, :]
input_2= Input(shape=(num, num, 1)) #采用Input层来构建input_2
conv_12 = Conv2D(32, kernel_size=(3, 3))(input_2 )
conv_1_bn2 = BatchNormalization()(conv_12)
flatten2 = Flatten()(conv_1_bn2)
flatten = keras.layers.concatenate([flatten1, flatten2], axis=1) #tf.concat就会报错
fc_1 = Dense(64)(flatten)
fc_1_bn = BatchNormalization()(fc_1)
model = Model(inputs=[input_1, input_2 ] , outputs=fc_1_bn ) #模型创建完毕
keras入门 创建神经网络 可参照:
Keras中文文档,多输入多输出方式 的 神经网络创建