关于这部分常出现的报错:
AttributeError ‘NoneType’ object has no attribute ‘_inbound_nodes’
报错原因:
只要使用Model,就必须保证该函数内全为layer而不能有其他函数,如果有其他函数必须用Lambda封装为layer。因为model函数中不允许除了layer以外的其他函数出现,所以报错。
例子:
conv1_1 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)
conv1_2 = Conv2D(64, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1_1)
conv1 = tf.add([conv1_1,conv1_2])
我的本意是想将两个卷积层生成的特征图按元素相加,但是由于tf.add是函数,不是layer层的,所以表面上看无语法错误,但当模型跑起来时,会在该行报出上述的错误信息。
model = Model(inputs = inputs, outputs = conv10)
修改方法可以参考keras中文手册中keras.layers Merge层中的相关信息,此处进行一些小结。
【https://keras.io/zh/layers/merge】
1、keras.layers.Add()
计算输入张量列表的和。它接受一个张量的列表(可以多个一起相加),所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。
2、keras.layers.Subtract()
计算两个输入张量的差。它接受一个长度为 2 的张量列表,两个张量必须有相同的尺寸,然后返回一个值为 (inputs[0] - inputs[1]) 的张量,输出张量和输入张量尺寸相同。使用格式类似于Add()。
3、keras.layers.Multiply()
计算输入张量列表的(逐元素间的)乘积。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。使用格式类似于Add()。
4、keras.layers.Average()
计算输入张量列表的平均值。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。使用格式类似于Add()。
5、keras.layers.Maximum()
计算输入张量列表的(逐元素间的)最大值。它接受一个张量的列表,所有的张量必须有相同的输入尺寸,然后返回一个张量(和输入张量尺寸相同)。使用格式类似于Add()。
6、keras.layers.Concatenate(axis=-1)
连接一个输入张量的列表。它接受一个张量的列表,除了连接轴之外,其他的尺寸都必须相同,然后返回一个由所有输入张量连接起来的输出张量。axis: 连接的轴。
7、keras.layers.Dot(axes, normalize=False)
计算两个张量之间样本的点积。
例如,如果作用于输入尺寸为(batch_size, n) 的两个张量 a 和 b,那么输出结果就会是尺寸为 (batch_size, 1) 的一个张量。在这个张量中,每一个条目 i 是 a[i] 和 b[i] 之间的点积。
axes: 整数或者整数元组,一个或者几个进行点积的轴。normalize: 是否在点积之前对即将进行点积的轴进行 L2 标准化。如果设置成 True,那么输出两个样本之间的余弦相似值。
ps:以上所有函数,当首字母为小写时(如keras.layers.add()),参数列表将放置于括号内部,参见Add()中所举得代码例子。
参考文献:
【1】https://zhuanlan.zhihu.com/p/138075621
【2】https://keras.io/zh/layers/merge