【问题标题】:Keras model summary incorrectKeras 模型摘要不正确
【发布时间】:2020-08-16 15:07:15
【问题描述】:

我正在使用

进行数据扩充
data_gen=image.ImageDataGenerator(rotation_range=20,width_shift_range=0.2,height_shift_range=0.2,
                                  zoom_range=0.15,horizontal_flip=False)

iter=data_gen.flow(X_train,Y_train,batch_size=64)

data_gen.flow()需要一个秩为4的数据矩阵,所以X_train的形状是(60000, 28, 28, 1)。我们需要传递相同的形状,即(60000, 28, 28, 1),同时定义模型的架构如下;

model=Sequential()
model.add(Dense(units=64,activation='relu',kernel_initializer='he_normal',input_shape=(28,28,1)))
model.add(Flatten())    
model.add(Dense(units=10,activation='relu',kernel_initializer='he_normal'))
model.summary()

model.add(Flatten()) 用于处理 rank-2 问题。现在问题出在model.summary() 上。它给出的输出不正确,如下所示;

Model: "sequential_1"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense_1 (Dense)              (None, 28, 28, 64)        128       
_________________________________________________________________
flatten_1 (Flatten)          (None, 50176)             0         
_________________________________________________________________
dense_2 (Dense)              (None, 10)                501770    
=================================================================
Total params: 501,898
Trainable params: 501,898
Non-trainable params: 0

dense_1 (Dense)Output Shape 应该是 (None,64)Param # 应该是 (28*28*64)+6450240Output Shapedense_2 (Dense) 是正确的,但 Param # 应该是 (64*10)+10,即 650

为什么会发生这种情况以及如何解决这个问题?

【问题讨论】:

    标签: python-3.x machine-learning keras deep-learning keras-layer


    【解决方案1】:

    总结没有错。 keras Dense 层总是在输入的最后一个维度上工作。

    参考:https://www.tensorflow.org/api_docs/python/tf/keras/layers/Dense

    输入形状:

    具有形状的 N 维张量:(batch_size, ..., input_dim)。最常见的情况 > 是具有形状 (batch_size, input_dim) 的 2D 输入。 输出形状:

    具有形状的 N-D 张量:(batch_size, ..., units)。例如,对于 2D 输入 shape (batch_size, input_dim),输出将具有 shape (batch_size, units)。

    在每个 Dense 层之前,您需要手动应用 Flatten() 以确保您正在传递二维数据。

    您想要的 output_shape 的一种解决方法是:

    model=Sequential()
    model.add(Dense(units=1,activation='linear', use_bias = False, trainable = False, kernel_initializer=tf.keras.initializers.Ones(),input_shape=(28,28,1)))
    model.add(Flatten())
    model.add(Dense(units=64,activation='relu'))    
    model.add(Dense(units=10,activation='relu',kernel_initializer='he_normal'))
    model.summary()
    

    第一层只是一层,用 1 初始化,没有偏差,所以它只是将输入乘以 1 并传递到下一层进行展平。这会从模型中删除不必要的参数。

    Model: "sequential"
    _________________________________________________________________
    Layer (type)                 Output Shape              Param #   
    =================================================================
    dense (Dense)                (None, 28, 28, 1)         2         
    _________________________________________________________________
    flatten (Flatten)            (None, 784)               0         
    _________________________________________________________________
    dense_1 (Dense)              (None, 64)                50240     
    _________________________________________________________________
    dense_2 (Dense)              (None, 10)                650       
    =================================================================
    Total params: 50,892
    Trainable params: 50,892
    Non-trainable params: 0
    

    【讨论】:

    • Output Shape(None, 28, 28, 1) 是否意味着它是 4-D?如果X_train(60000, 28, 28, 3) 怎么办?在这种情况下,Output Shape 应该是什么?同样对于第一层W=1,它被广播到输入矩阵(28,28,1)的形状。所以在那种情况下不应该是Param # = 28*28*1+1=785 而不是Param # =2
    • 两者都是 4-D,不是输出形状,而是密集的输入形状应该是 2-d(batch_dim,特征)。参数应该是 2,因为 28*28*1 是输入,它们不需要权重/偏差。
    • 你在这里使用了权重kernel_initializer=tf.keras.initializers.Ones(),那么权重矩阵的大小不应该是(28,28,1)吗?我们在具有相同形状的X_trainW 之间执行逐元素乘法。
    • 这里要考虑的另一件事是,在反向传播期间,由于 kernel_initializer=tf.keras.initializers.Ones() 导致的之前为 1 的第一层的权重现在将被更新。所以现在基本上我们添加了一个隐藏层,其权重将在每个时期更新。你有什么想法?
    • 第一层设置trainable = False即可,不更新。
    猜你喜欢
    • 2023-03-30
    • 2020-12-28
    • 2022-08-18
    • 2020-05-28
    • 2019-03-14
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多