如何增加CNN自编码器中Lambda层的数量?



我正在尝试自定义CNN自动编码器这样。但我不明白Lambda层的含义。Lambda(Lambda x: x[:,0:1])是什么意思?在这种情况下,如何添加一个lambda层(即val3) ?

input_img = Input(shape=(384, 192, 2))
## Encoder
x = Conv2D(16, (3, 3), activation='tanh', padding='same')(input_img)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='tanh', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='tanh', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='tanh', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(4, (3, 3), activation='tanh', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(4, (3, 3), activation='tanh', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Reshape([6*3*4])(x) ## Flatten()
encoded = Dense(2,activation='tanh')(x)
## Two variables
val1= Lambda(lambda x: x[:,0:1])(encoded)
val2= Lambda(lambda x: x[:,1:2])(encoded)
## Decoder 1
.....

来自本博客:

假设在名为dense_layer_3的致密层之后,我们想对张量进行某种操作,例如为每个元素添加值2。我们怎么能做到呢?现有的层都没有这样做,所以我们必须自己建立一个新层。

所以Lambda层用于对输入张量执行操作,但仍然被认为是一个层。例如,假设我有一个模型:

layer1 = Dense(...)(x)
layer2 = Dense(...)(x)
model.summary() # will have layer1 and layer2

现在我想在layer1之后做x+2。通常我会写:

layer1 = Dense(...)(x)
x = x+2
layer2 = Dense(...)(x)
model.summary() # will miss the x = x+2 operation

但是x=x+2在模型中不会被识别为Layer。我们知道它的存在,因为我们这样做了,但其他人没有办法知道,这使得在出现问题时很难进行调试。所以我们使用Lambda:

layer1 = Dense(...)(x)
lamb = Lambda(lambda x: x+2)(x) 
layer2 = Dense(...)(x)
model.summary() # will have Lambda layer inside it

对于Lambda(lambda x: x[:,0:1]),它是用于张量切片的Lambda层。x[:, 0:1]表示获取所有行,但只获取索引从0到1的列。

最新更新