8. Dropout and Strides For Larger Models

Intro

这是深度学习第8课。

本科结束后,你将会理解并知道如何使用:

  • Stride lengths来快速建立模型并减少内存消耗;
  • Dropout 来对抗过拟合;

这两个技术在大型模型中很有用。

Lesson

[1]

from IPython.display import YouTubeVideo
YouTubeVideo('fwNLf4t7MR8', width=800, height=450)

Sample Code

[2]

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from tensorflow.python import keras
from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout

img_rows, img_cols = 28, 28
num_classes = 10

def data_prep(raw):
    out_y = keras.utils.to_categorical(raw.label, num_classes)

    num_images = raw.shape[0]
    x_as_array = raw.values[:,1:]
    x_shaped_array = x_as_array.reshape(num_images, img_rows, img_cols, 1)
    out_x = x_shaped_array / 255
    return out_x, out_y

train_size = 30000
train_file = "../input/digit-recognizer/train.csv"
raw_data = pd.read_csv(train_file)

x, y = data_prep(raw_data)

model = Sequential()
model.add(Conv2D(30, kernel_size=(3, 3),
                 strides=2,
                 activation='relu',
                 input_shape=(img_rows, img_cols, 1)))
model.add(Dropout(0.5))
model.add(Conv2D(30, kernel_size=(3, 3), strides=2, activation='relu'))
model.add(Dropout(0.5))
model.add(Flatten())
model.add(Dense(128, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer='adam',
              metrics=['accuracy'])
model.fit(x, y,
          batch_size=128,
          epochs=2,
          validation_split = 0.2)
/opt/conda/lib/python3.6/site-packages/h5py/__init__.py:36: FutureWarning: Conversion of the second argument of issubdtype from `float` to `np.floating` is deprecated. In future, it will be treated as `np.float64 == np.dtype(float).type`.
  from ._conv import register_converters as _register_converters

Train on 33600 samples, validate on 8400 samples
Epoch 1/2
33600/33600 [==============================] - 14s 408us/step - loss: 0.6243 - acc: 0.8026 - val_loss: 0.2235 - val_acc: 0.9354
Epoch 2/2
33600/33600 [==============================] - 14s 417us/step - loss: 0.2664 - acc: 0.9176 - val_loss: 0.1315 - val_acc: 0.9630

<tensorflow.python.keras._impl.keras.callbacks.History at 0x7f58d9f92c88>

Exercise: Dropout and Strides For Larger Models

Introduction

您已经构建了一个模型来识别MNIST for Fashion数据集中的服装类型。 现在,您将使模型更大,指定更大的stride lengths并应用dropout。 这些更改将使您的模型更快,更准确。

这是深度学习课程的最后一步。

Starter Code

Data Preparation

你需要运行以下单元

【3】

import numpy as np
from sklearn.model_selection import train_test_split
from tensorflow.python import keras

img_rows, img_cols = 28, 28
num_classes = 10

def prep_data(raw, train_size, val_size):
    y = raw[:, 0]
    out_y = keras.utils.to_categorical(y, num_classes)
    
    x = raw[:,1:]
    num_images = raw.shape[0]
    out_x = x.reshape(num_images, img_rows, img_cols, 1)
    out_x = out_x / 255
    return out_x, out_y

fashion_file = "../input/fashionmnist/fashion-mnist_train.csv"
fashion_data = np.loadtxt(fashion_file, skiprows=1, delimiter=',')
x, y = prep_data(fashion_data, train_size=50000, val_size=5000)

Sample Model Code

[4]

fashion_model = Sequential()
fashion_model.add(Conv2D(12, kernel_size=(3, 3), strides=2,
                 activation='relu',
                 input_shape=(img_rows, img_cols, 1)))
fashion_model.add(Conv2D(12, (3, 3), strides=2, activation='relu'))
fashion_model.add(Flatten())
fashion_model.add(Dense(128, activation='relu'))
fashion_model.add(Dense(num_classes, activation='softmax'))

fashion_model.compile(loss=keras.losses.categorical_crossentropy,
              optimizer='adam',
              metrics=['accuracy'])

fashion_model.fit(train_x, train_y,
          batch_size=batch_size,
          epochs=epochs,
          validation_split = 0.2)

Adding Strides

指定,编译和拟合模型,与上面的模型非常相似,但为每个卷积层指定步长为2。 调用你的新模型fashion_model_1。

【5】

from tensorflow.python.keras.models import Sequential
from tensorflow.python.keras.layers import Dense, Flatten, Conv2D, Dropout

fashion_model_1 = Sequential()
# Specify the rest of the model

# Compile fashion_model_1

# Fit fashion_model_1

Make Model Larger

您应该已经注意到fashion_model_1训练得非常快。 这样可以使模型更大。 指定名为fashion_model_2的新模型,该模型与fashion_model_1相同,但以下情况除外:

  1.      在Flatten图层之前添加一个额外的Conv2D图层。 使它类似于你已经拥有的Conv2D图层,除了不在这个新图层中设置步幅长度(我们已经用现有图层缩小了表示)。
  2.      将每个卷积层中的过滤器数量更改为24。

指定fashion_model_2后,编译并拟合它。

【6】

# Your code for fashion_model_2 below

Add Dropout

指定fashion_model_3,它与fashion_model_2相同,只是它在每个卷积层之后立即添加了丢失(因此它增加了3次丢失)。 编译并拟合此模型。 将模型在验证数据上的性能与之前的模型进行比较。

【7】

# Your code for fashion_model_3 below

Congrats

你已经完成了深度学习课程的第1级。 您可以使用工具来创建和调整计算机视觉模型。 选择一个项目并尝试你的技能。
您可能尝试的一些有趣的数据集包括:

你学到了很多东西。 在深度学习中还有很多东西需要学习,但你应该对自己的新技能感到满意。

Conclusion

练习结束后,您已完成深度学习课程。 你已经可以做一些很棒的事了,当我们发布它时你就可以开始升级。 2级将扩展您可以做的许多新类型的应用程序。

猜你喜欢

转载自blog.csdn.net/cg129054036/article/details/82892614