我正在编写一个代码,用于在CIFAR10数据集上运行autoencoder并查看重建的图像。
要求是创建
具有第一层的编码器
第二层编码器
第一层解码器
第二层解码器
我明白
还有,我执行这些操作的顺序是什么?
我在下面附上我的代码。。。我尝试了两种不同的方法,因此得到了不同的输出(在模型摘要和模型训练图方面)
谁能帮我解释一下哪种方法是正确的(方法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()
要有效地使用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函数?
在方法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