首页 > 解决方案 > 为什么以两种不同的方式构建相同的模型会产生不同的输出?

问题描述

我有一个非常奇怪的问题。

  1. 模型有什么区别?(我想不通)
  2. 如何将第二个模型更新为与第一个模型相同?

第一个模型(“源”模型):

    input_img = Input(shape=(dim_x, dim_y, dim_z))

    x = Conv2D(16, (3, 3), activation='relu', padding='same')(input_img)
    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)
    encoder = MaxPooling2D((2, 2), padding='same')(x)




    x = Conv2D(8, (3, 3), activation='relu', padding='same')(encoder)
    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)
    decoder = Conv2D(3, (3, 3), activation='sigmoid', padding='same')(x)

    autoencoder = Model(input_img, decoder)
    autoencoder.compile(optimizer='adam', loss=loss_func)     Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
conv2d_28 (Conv2D)           (None, 224, 224, 16)      448       
_________________________________________________________________
max_pooling2d_12 (MaxPooling (None, 112, 112, 16)      0         
_________________________________________________________________
conv2d_29 (Conv2D)           (None, 112, 112, 8)       1160      
_________________________________________________________________
max_pooling2d_13 (MaxPooling (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_30 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 28, 28, 8)         0         
_________________________________________________________________
conv2d_31 (Conv2D)           (None, 28, 28, 8)         584       
_________________________________________________________________
up_sampling2d_12 (UpSampling (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_32 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
up_sampling2d_13 (UpSampling (None, 112, 112, 8)       0         
_________________________________________________________________
conv2d_33 (Conv2D)           (None, 112, 112, 16)      1168      
_________________________________________________________________
up_sampling2d_14 (UpSampling (None, 224, 224, 16)      0         
_________________________________________________________________
conv2d_34 (Conv2D)           (None, 224, 224, 3)       435       
=================================================================
Total params: 4,963
Trainable params: 4,963
Non-trainable params: 0

在此处输入图像描述

概括:

Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_21 (Conv2D)           (None, 224, 224, 16)      448       
_________________________________________________________________
max_pooling2d_9 (MaxPooling2 (None, 112, 112, 16)      0         
_________________________________________________________________
conv2d_22 (Conv2D)           (None, 112, 112, 8)       1160      
_________________________________________________________________
max_pooling2d_10 (MaxPooling (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_23 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
max_pooling2d_11 (MaxPooling (None, 28, 28, 8)         0         
_________________________________________________________________
conv2d_24 (Conv2D)           (None, 28, 28, 8)         584       
_________________________________________________________________
up_sampling2d_9 (UpSampling2 (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_25 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
up_sampling2d_10 (UpSampling (None, 112, 112, 8)       0         
_________________________________________________________________
conv2d_26 (Conv2D)           (None, 112, 112, 16)      1168      
_________________________________________________________________
up_sampling2d_11 (UpSampling (None, 224, 224, 16)      0         
_________________________________________________________________
conv2d_27 (Conv2D)           (None, 224, 224, 3)       435       
=================================================================
Total params: 4,963
Trainable params: 4,963
Non-trainable params: 0

第二个模型(我想以不同方式作为第一个模型构建的模型):

    autoencoder = Sequential()
    autoencoder.add(el1)
    autoencoder.add(el2)
    autoencoder.add(el3)
    autoencoder.add(el4)
    autoencoder.add(el5)
    autoencoder.add(el6)
    autoencoder.add(dl1)
    autoencoder.add(dl2)
    autoencoder.add(dl3)
    autoencoder.add(dl4)
    autoencoder.add(dl5)
    autoencoder.add(dl6)
    autoencoder.add(output_layer)
    autoencoder.compile(optimizer='adam', loss=loss_func)

在此处输入图像描述

概括:

 Layer (type)                 Output Shape              Param #   
=================================================================
input_3 (InputLayer)         [(None, 224, 224, 3)]     0         
_________________________________________________________________
conv2d_28 (Conv2D)           (None, 224, 224, 16)      448       
_________________________________________________________________
max_pooling2d_12 (MaxPooling (None, 112, 112, 16)      0         
_________________________________________________________________
conv2d_29 (Conv2D)           (None, 112, 112, 8)       1160      
_________________________________________________________________
max_pooling2d_13 (MaxPooling (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_30 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
max_pooling2d_14 (MaxPooling (None, 28, 28, 8)         0         
_________________________________________________________________
conv2d_31 (Conv2D)           (None, 28, 28, 8)         584       
_________________________________________________________________
up_sampling2d_12 (UpSampling (None, 56, 56, 8)         0         
_________________________________________________________________
conv2d_32 (Conv2D)           (None, 56, 56, 8)         584       
_________________________________________________________________
up_sampling2d_13 (UpSampling (None, 112, 112, 8)       0         
_________________________________________________________________
conv2d_33 (Conv2D)           (None, 112, 112, 16)      1168      
_________________________________________________________________
up_sampling2d_14 (UpSampling (None, 224, 224, 16)      0         
_________________________________________________________________
conv2d_34 (Conv2D)           (None, 224, 224, 3)       435       
=================================================================
Total params: 4,963
Trainable params: 4,963
Non-trainable params: 0

标签: tensorflowkeras

解决方案


tensorflow.set_random_seed(0)您应该使用and设置随机种子numpy.random.seed(0)。种子可以是 anyint1D array_like,并且应该在您的代码中设置一次。

还要确保您禁用了改组model.fit(data, shuffle=False)

之后,随机权重/参数初始化和数据排序将在连续的实验和模型中重现。

尽管运行模型后仍然可能存在一些随机性导致不同的结果。它可以来自使用其他随机模块的其他库。(例如:mnist_cnn.py 没有给出可重现的结果


推荐阅读