当前位置: 首页 > 知识库问答 >
问题:

卷积自动编码器

丁承德
2023-03-14

我正在编写一个代码,用于在CIFAR10数据集上运行autoencoder并查看重建的图像。

要求是创建

具有第一层的编码器

  • 输入形状:(32,32,3)
  • 具有64个(3,3)过滤器的Conv2D层
  • 批量标准化层
  • ReLu激活
  • 带(2,2)滤波器的2D MaxPoolglayer

第二层编码器

  • Conv2D层具有16个过滤器(3,3)
  • 批量标准化层
  • ReLu激活
  • 带有(2,2)过滤器的2D MaxPoolglayer
  • 最终编码为MaxPool,带有(2,2)和所有先前层

第一层解码器

  • 输入形状:编码器输出
  • Conv2D层,具有16个(3,3)
  • 批量标准化层
  • ReLu激活
  • 带(2,2)滤波器的上采样2D

第二层解码器

  • 具有32个(3,3)过滤器的Conv2D层

我明白

  1. 当我们创建卷积自编码器(或任何AE)时,我们需要将前一层的输出传递给下一层。
  2. 所以,当我用ReLu创建第一个Conv2D层,然后执行BatchNormize...
  3. 但是当我做MaxPooling2D...我应该通过什么...批处理标准化输出还是Conv2D层输出?

还有,我执行这些操作的顺序是什么?

  • Conv2D--

我在下面附上我的代码。。。我尝试了两种不同的方法,因此得到了不同的输出(在模型摘要和模型训练图方面)

谁能帮我解释一下哪种方法是正确的(方法1或方法2)?另外,我如何理解哪个图形显示了更好的模型性能?

方法-1

input_image = Input(shape=(32, 32, 3))

### Encoder
conv1_1 = Conv2D(64, (3, 3), activation='relu', padding='same')(input_image)
bnorm1_1 = BatchNormalization()(conv1_1)
mpool1_1 = MaxPooling2D((2, 2), padding='same')(conv1_1)

conv1_2 = Conv2D(16, (3, 3), activation='relu', padding='same')(mpool1_1)
borm1_2 = BatchNormalization()(conv1_2)

encoder = MaxPooling2D((2, 2), padding='same')(conv1_2)

### Decoder
conv2_1 = Conv2D(16, (3, 3), activation='relu', padding='same')(encoder)
bnorm2_1 = BatchNormalization()(conv2_1)
up1_1 = UpSampling2D((2, 2))(conv2_1)

conv2_2 = Conv2D(32, (3, 3), activation='relu', padding='same')(up1_1)
bnorm2_2 = BatchNormalization()(conv2_2)
up2_1 = UpSampling2D((2, 2))(conv2_2)

decoder = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(up2_1)

model = Model(input_image, decoder)
model.compile(optimizer='adam', loss='binary_crossentropy')
model.summary()

history = model.fit(trainX, trainX, 
                    epochs=50, 
                    batch_size=1000, 
                    shuffle=True,
                    verbose=2,
                    validation_data=(testX, testX)
                    )

作为模型摘要的输出,我得到

总参数:18851

可训练参数: 18,851

不可训练参数:0

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right')
plt.show()

方法2

input_image = Input(shape=(32, 32, 3))

### Encoder
x = Conv2D(64, (3, 3), activation='relu', padding='same')(input_image)
x = BatchNormalization()(x)
x = MaxPooling2D((2, 2), padding='same')(x)

x = Conv2D(16, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)

encoder = MaxPooling2D((2, 2), padding='same')(x)

### Decoder

x = Conv2D(16, (3, 3), activation='relu', padding='same')(encoder)
x = BatchNormalization()(x)
x = UpSampling2D((2, 2))(x)

x = Conv2D(32, (3, 3), activation='relu', padding='same')(x)
x = BatchNormalization()(x)
x = UpSampling2D((2, 2))(x)

decoder = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)

model = Model(input_image, decoder)
model.compile(optimizer='adam', loss='binary_crossentropy')
model.summary()

history = model.fit(trainX, trainX, 
                        epochs=50, 
                        batch_size=1000, 
                        shuffle=True,
                        verbose=2,
                        validation_data=(testX, testX)
                        )

作为模型摘要的输出,我得到

总参数:19363

可培训参数:19107

不可训练参数:256

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('model loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right')
plt.show()

共有2个答案

雷锋
2023-03-14

要有效地使用BatchNormation层,您应该始终在激活前使用它。

而不是:

conv1_1 = Conv2D(64, (3, 3), activation='relu', padding='same')(input_image)
bnorm1_1 = BatchNormalization()(conv1_1)
mpool1_1 = MaxPooling2D((2, 2), padding='same')(bnorm1_1)

像这样使用它:

conv1_1 = Conv2D(64, (3, 3), padding='same')(input_image)
bnorm1_1 = BatchNormalization()(conv1_1)
act_1 = Activation('relu')(bnorm1_1)
mpool1_1 = MaxPooling2D((2, 2), padding='same')(act_1)

有关更多详细信息,请查看此处:在Keras中,我在哪里调用BatchNormalization函数

沈国安
2023-03-14

在方法1中,BatchNormation层不存在于编译的模型中,因为这些层的输出在任何地方都不使用。你可以通过运行model1.summary()来检查

方法2完全可以。

操作顺序:Conv2D-

编辑:

对于Conv2D--

conv1_1=Conv2D(64,(3,3),激活='relu',填充='相同')(input_image)bnorm1_1=BatchNormize()(conv1_1)mpool1_1=MaxPooling2D((2,2),填充='相同')(bnorm1_1),然后使用mpool1_1作为下一层的输入。

对于Conv2D--

conv1\u 1=Conv2D(64,(3,3),activation='relu',padding='same')(输入图像)mpool1\u 1=maxpoolig2d((2,2),padding='same')(conv1\u 1)bnorm1\u 1=BatchNormalization()(mpool1\u 1)然后使用bnorm1\u 1作为下一层的输入。

 类似资料:
  • 我正在使用卷积自动编码器。我的autoenoder配置有一个带stride(2,2)或avg pooling和relu激活的卷积层和一个带stride(2,2)或avg Unmooling和relu激活的反卷积层。 我用MNIST数据集训练自动编码器。 当我在第一个卷积层(20个过滤器,过滤器大小为3)后查看特征图时,我得到了一些黑色特征图,而学习到的过滤器不是黑色的。如果更改过滤器数量或过滤器大

  • 我正在尝试创建一个三维卷积神经网络自动编码器。我无法将张量的输入维与输出维匹配 我尝试过改变图层形状并使用Keras自动编码器。 ValueError:无法将具有1850688元素的张量重塑为'Reshape'(op:'Reshape')的形状[1,31,73,201,3](1364589元素),输入形状:[1,36,84,204,3],[5]并且输入张量计算为部分形状:输入[1]=[1,31,7

  • 图像的卷积(Convolution)定义为 $$f(x) = act(\sum{i, j}^n \theta{(n - i)(n - j)} x_{ij}+b)$$ 其计算过程为 示例1 import tensorflow as tf import numpy as np sess = tf.InteractiveSession() input_batch = tf.constant([

  • 对于我的教育,我正在尝试在卷积神经网络中实现一个N维卷积层。 我想实现一个反向传播函数。然而,我不确定这样做最有效的方式。 目前,我正在使用信号。fftconvolve收件人: > 在反向传播步骤中,使用数组卷积导数(在所有维度上使用FlipAllAxes函数进行反转)(https://jefkine.com/general/2016/09/05/backpropagation-in-convol

  • 具体过程简单的说明如下: 1)给定无标签数据,用非监督学习学习特征: 在我们之前的神经网络中,如第一个图,我们输入的样本是有标签的,即(input, target),这样我们根据当前输出和target(label)之间的差去改变前面各层的参数,直到收敛。但现在我们只有无标签数据,也就是右边的图。那么这个误差怎么得到呢? 如上图,我们将input输入一个encoder编码器,就会得到一个code,这

  • 卷积神经网络有一个批量过滤器, 持续不断的在图片上滚动收集图片里的信息,每一次收集的时候都只是收集一小块像素区域, 然后把收集来的信息进行整理, 这时候整理出来的信息有了一些实际上的呈现, 比如这时的神经网络能看到一些边缘的图片信息, 然后在以同样的步骤, 用类似的批量过滤器扫过产生的这些边缘信息, 神经网络从这些边缘信息里面总结出更高层的信息结构,比如说总结的边缘能够画出眼睛,鼻子等等. 再经过

  • Convolution1D层 keras.layers.convolutional.Convolution1D(nb_filter, filter_length, init='uniform', activation='linear', weights=None, border_mode='valid', subsample_length=1, W_regularizer=None, b_regu

  • Conv1D层 keras.layers.convolutional.Conv1D(filters, kernel_size, strides=1, padding='valid', dilation_rate=1, activation=None, use_bias=True, kernel_initializer='glorot_uniform', bias_initializer='zero