Keras 自动编码器输出错误的形状
Keras autoencoder outputting wrong shape
我正在尝试在 Keras 中构建深度卷积自动编码器,但它一直输出错误的形状。
代码:
def build_network(input_shape):
input_input = Input(shape=input_shape)
#Encode
x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
#Decode
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_input, decoded)
return autoencoder
if __name__ == "__main__":
print(build_network((1, 32, 32)).layers[-1].output)
我希望输出形状与输入形状相同,但 (1, 32, 32)
却是 (8, 32, 1)
尝试使用print(build_network((32,32,1)).layers[-1].output)
。或者,如果您想先使用频道而不是像这样更改模型,
def build_network(input_shape):
input_input = Input(shape=input_shape)
#Encode
x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
#Decode
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
decoded = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
# decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_input, decoded)
return autoencoder
if __name__ == "__main__":
print(build_network((1, 32, 32)).layers[-1].output)
因为在UpSampling2D
中,默认是"channels_last"。
我正在尝试在 Keras 中构建深度卷积自动编码器,但它一直输出错误的形状。
代码:
def build_network(input_shape):
input_input = Input(shape=input_shape)
#Encode
x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
#Decode
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D((2, 2))(x)
decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_input, decoded)
return autoencoder
if __name__ == "__main__":
print(build_network((1, 32, 32)).layers[-1].output)
我希望输出形状与输入形状相同,但 (1, 32, 32)
(8, 32, 1)
尝试使用print(build_network((32,32,1)).layers[-1].output)
。或者,如果您想先使用频道而不是像这样更改模型,
def build_network(input_shape):
input_input = Input(shape=input_shape)
#Encode
x = Conv2D(16, (3, 3), activation='relu', padding = 'same')(input_input)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = MaxPooling2D((2, 2), padding='same')(x)
#Decode
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
x = Conv2D(8, (3, 3), activation='relu', padding='same')(x)
x = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
decoded = UpSampling2D(size=(2, 2),data_format="channels_first")(x)
# decoded = Conv2D(1, (3, 3), activation='sigmoid', padding='same')(x)
autoencoder = Model(input_input, decoded)
return autoencoder
if __name__ == "__main__":
print(build_network((1, 32, 32)).layers[-1].output)
因为在UpSampling2D
中,默认是"channels_last"。