【问题标题】:VGG-19 Tensorflow 2.0 implementationVGG-19 TensorFlow 2.0 实施
【发布时间】:2020-07-24 20:01:52
【问题描述】:

我正在尝试在 CIFAR-10 数据集上实现 VGG-19 CNN,其中图像的维度为 (32, 32, 3)。训练集有 50000 张图像,而测试集有 10000 张图像。 我正在使用 Python 3.7 和 TensorFlow 2.0。我已经通过规范化对数据集进行了预处理-

# Normalize the training and testing datasets-
X_train /= 255.0
X_test /= 255.0

然后我设计了一个 CNN-

def vgg_19():

    """
    Function to define the architecture of a convolutional neural network
    model following VGG-19 architecture for CIFAR-10 dataset.

    Vgg-19 architecture-
    64, 64, pool                 -- convolutional layers
    128, 128, pool               -- convolutional layers
    256, 256, 256, 256, max-pool -- convolutional layers
    512, 512, 512, 512, max-pool -- convolutional layers
    512, 512, 512, 512, avg-pool -- convolutional layers
    256, 256, 10                 -- fully connected layers

    Output: Returns designed and compiled convolutional neural network model
    """


    l = tf.keras.layers

    model = Sequential()

    model.add(
    Conv2D(
            filters = 64, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same',
            input_shape=(32, 32, 3)
        )
    )

    model.add(
    Conv2D(
            filters = 64, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
        )
    )

    model.add(
    Conv2D(
            filters = 128, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 128, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
        )
    )

    model.add(
    Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 256, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )

    model.add(
    Conv2D(
            filters = 512, kernel_size = (3, 3),
            activation='relu', kernel_initializer = tf.initializers.GlorotUniform(),
            strides = (1, 1), padding = 'same'
        )
    )


    model.add(
    AveragePooling2D(
        pool_size=(2, 2), strides=(2, 2)
    )
    )


    '''
    model.add(
        MaxPooling2D(
            pool_size = (2, 2),
            strides = (2, 2)
        )
    )
    '''

    model.add(Flatten())


    model.add(
    Dense(
            units = 256, activation='relu'
        )
    )

    model.add(
    Dense(
            units = 256, activation='relu'
        )
    )

    '''
    model.add(
    Dense(
            units = 1000, activation='relu'
        )
    )
    '''

    model.add(
    Dense(
            units = 10, activation='softmax'
        )
    )


    # Compile pruned CNN-
    model.compile(
        loss=tf.keras.losses.categorical_crossentropy,
        # optimizer='adam',
        optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, momentum=0.9),
        metrics=['accuracy']
    )

    return model

但是,当我尝试训练它时-

history = orig_model.fit(
        x = X_train, y = y_train,
        batch_size = batch_size,
        epochs = num_epochs,
        verbose = 1,
        # callbacks = callback,
        validation_data = (X_test, y_test),
        shuffle = True
    )

设计的 CNN 的验证准确率约为 9%。

怎么了?

【问题讨论】:

    标签: python-3.x conv-neural-network tensorflow2.0 vgg-net


    【解决方案1】:

    验证准确率极低是由于 Glorot 初始化程序。将其更改为“他正常”后,VGG-19 CNN 开始学习并达到约 77-79% 的验证准确率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2014-11-16
      • 2021-10-24
      • 2011-09-19
      • 1970-01-01
      • 2020-09-28
      • 2014-10-27
      相关资源
      最近更新 更多