我正在使用编码器-解码器模型从灰度图像中预测二进制图像。这是模型
inputs = Input(shape=(height, width, 1))
conv1 = Conv2D(4, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(inputs)
conv1 = Conv2D(4, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv1)
pool1 = MaxPooling2D(pool_size=(2, 2))(conv1)
conv2 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool1)
conv2 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv2)
drop2 = Dropout(0.2)(conv2)
pool2 = MaxPooling2D(pool_size=(2, 2))(drop2)
conv4 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool2)
conv4 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv4)
drop4 = Dropout(0.2)(conv4)
pool4 = MaxPooling2D(pool_size=(2, 2))(drop4)
conv5 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(pool4)
conv5 = Conv2D(32, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv5)
drop5 = Dropout(0.2)(conv5)
up6 = Conv2D(16, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(drop5))
merge6 = concatenate([drop4,up6], axis = 3)
conv6 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge6)
conv6 = Conv2D(16, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv6)
up7 = Conv2D(8, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv6))
merge7 = concatenate([drop2,up7], axis = 3)
conv7 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge7)
conv7 = Conv2D(8, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv7)
up9 = Conv2D(4, 2, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(UpSampling2D(size = (2,2))(conv7))
merge9 = concatenate([conv1,up9], axis = 3)
conv9 = Conv2D(4, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(merge9)
conv9 = Conv2D(4, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
conv9 = Conv2D(2, 3, activation = 'relu', padding = 'same', kernel_initializer = 'he_normal')(conv9)
conv10 = Conv2D(1, 1, activation = 'sigmoid')(conv9)
model = Model(inputs=inputs, outputs=conv10)
nadam = optimizers.Nadam(lr=1e-4, beta_1=0.9, beta_2=0.999, epsilon=None, schedule_decay=0.0004)
model.compile(loss='mean_squared_error', optimizer=nadam, metrics=['accuracy', norm_mse])
nb_epoch = 30
batch_size = 8
history = unet.fit(training, trainingLabel,
validation_data=(validation, validationLabel),
batch_size=batch_size, epochs=nb_epoch, shuffle="batch", callbacks=[checkpointer], verbose=1)
我也有训练数据集大小为:6912,验证数据集大小为:1728 每次我一开始就开始训练我的编码器-解码器时,我都会得到不同的训练精度和归一化 MSE。它对每次测试都有很大影响。我知道一开始的权重是随机选择的,因此它会影响第一个 epoch 的性能。我担心的是差异太大。这里有些例子:
Epoch 1/30
6912/6912 [==============================] - 27s 4ms/step - loss: 0.0612 - acc: 0.9252 - normalized_mse: 0.3661 - val_loss: 0.0367 - val_acc: 0.9559 - val_normalized_mse: 0.2920
另一个例子:
Epoch 1/30
6912/6912 [==============================] - 28s 4ms/step - loss: 0.1251 - acc: 0.8982 - normalized_mse: 0.5686 - val_loss: 0.1077 - val_acc: 0.9564 - val_normalized_mse: 0.5302
最后一个:
Epoch 1/30
6912/6912 [==============================] - 26s 4ms/step - loss: 0.1721 - acc: 0.9400 - normalized_mse: 0.6751 - val_loss: 0.1582 - val_acc: 0.9582 - val_normalized_mse: 0.6473
如果我运行我的模型超过 30 个 epoch,它就会开始高估。输入图像的大小为 256x256,每个图像都有相当多的特征,并且是灰度的 - 输出是二进制图像。
如果我做错了什么,有人可以帮我理解吗?我怎样才能让我的模型更稳定?
[已解决] 对于那些面临同样问题的人,只需给 kernel_initializer 一些随机种子。示例 kernel_initializer=he_normal(seed=seed_val)。这将解决问题。