Объединение выводов лямбда-слоев в Керасе - PullRequest
0 голосов
/ 31 октября 2019

Я создаю модель в Керасе. У меня есть слой x_1 с 64 выходными каналами, я хочу установить 16 с наименьшим глобальным средним значением равным 0, чтобы он не использовал их в качестве входных данных на следующем слое (чтобы уменьшить количество умножений). Этот код работает:

x_2 = GlobalAveragePooling2D()(x_1)
temp = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 17)(x_2)
temp = Lambda(lambda x: x[:,np.newaxis,np.newaxis,:])(temp)
temp = Lambda(lambda x: K.cast(x, np.float32))(temp)
x_1 = Multiply()([x_1,temp])

Теперь я хочу адаптировать код так, чтобы он выбирал один канал из каждой группы из 4 каналов для установки на 0. Я попробовал следующее:

x_2 = GlobalAveragePooling2D()(x_1)
temp1 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 0:4])
temp2 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 4:8])
temp3 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 8:12])
temp4 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 12:16])
temp5 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 16:20])
temp6 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 20:24])
temp7 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 24:28])
temp8 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 28:32])
temp9 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 32:36])
temp10 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 36:40])
temp11 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 40:44])
temp12 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 44:48])
temp13 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 48:52])
temp14 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 52:56])
temp15 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 56:60])
temp16 = Lambda(lambda x: K.sum(K.cast(x[:, :, np.newaxis] <= x[:, np.newaxis, :], np.int16), 1) >= 2)(x_2[:, 60:64])
temp = Lambda(lambda x: K.concatenate([x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11], x[12], x[13], x[14], x[15]],axis=-1))([temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16])
temp = Lambda(lambda x: x[:,np.newaxis,np.newaxis,:])(temp)
temp = Lambda(lambda x: K.cast(x, np.float32))(temp)
x_1 = Multiply()([x_1,temp])

Это не работает, также когда я меняю

temp = Lambda(lambda x: K.concatenate([x[0], x[1], x[2], x[3], x[4], x[5], x[6], x[7], x[8], x[9], x[10], x[11], x[12], x[13], x[14], x[15]],axis=-1))([temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16])

на

temp = Concatenate(axis=-1)([temp1, temp2, temp3, temp4, temp5, temp6, temp7, temp8, temp9, temp10, temp11, temp12, temp13, temp14, temp15, temp16])

Я всегда получаю ошибку:

AttributeError: 'NoneType' object has no attribute '_inbound_nodes'

Кто-то видитчто я делаю не так? Заранее спасибо!

...