吴恩达深度学习第四章卷积神经网络第二周1

欢迎来到第2周的第一个作业。在此作业中,您将:

学习使用Keras,一种高级神经网络API(编程框架),用Python编写,能够运行在几个较低级别的框架之上,包括TensorFlow和CNTK。
了解如何在几个小时内构建深度学习算法。
我们为什么要使用Keras?Keras的开发是为了让深度学习工程师能够非常快速地构建和试验不同的模型。正如TensorFlow是一个比Python更高级的框架,Keras是一个更高级别的框架,并提供额外的抽象。能够以最小的延迟从想法到结果是找到好模型的关键。但是,Keras比较低级别的框架更具限制性,因此有一些非常复杂的模型可以在TensorFlow中实现,但在Keras中没有(没有更多困难)。话虽这么说,Keras将适用于许多常见的模型。

在本练习中,您将处理“快乐之家”问题,我们将在下面解释。让我们加载所需的包,解决快乐之家的问题!


 

import numpy as np
from keras import layers
from keras.layers import Input, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D
from keras.layers import AveragePooling2D, MaxPooling2D, Dropout, GlobalMaxPooling2D, GlobalAveragePooling2D
from keras.models import Model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
import pydot
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
from kt_utils import *

import keras.backend as K
K.set_image_data_format('channels_last')
import matplotlib.pyplot as plt
from matplotlib.pyplot import imshow

%matplotlib inline

注意:如您所见,我们从Keras导入了许多功能。只需直接在笔记本中调用它们即可轻松使用它们。例如:X = Input(...)或X = ZeroPadding2D(...)。

1 - 快乐之家
为了你的下一个假期,你决定和你的五个朋友在学校度过一个星期。这是一个非常方便的房子,附近有许多事情要做。但最重要的好处是每个人在家里都会很高兴。因此,任何想要进入这所房子的人都必须证明他们目前的幸福状态。


图1 :快乐之家
作为深度学习专家,为了确保严格应用“快乐”规则,您将构建一种算法,该算法使用来自前门摄像头的图片来检查该人是否幸福。只有在人快乐的时候,门才能打开。

你已经收集了你的朋友和你自己的照片,由前门摄像头拍摄。数据集是标记的。


运行以下代码以规范化数据集并了解其形状。

X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

# Normalize image vectors
X_train = X_train_orig/255.
X_test = X_test_orig/255.

# Reshape
Y_train = Y_train_orig.T
Y_test = Y_test_orig.T

print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))
number of training examples = 600
number of test examples = 150
X_train shape: (600, 64, 64, 3)
Y_train shape: (600, 1)
X_test shape: (150, 64, 64, 3)
Y_test shape: (150, 1)





“快乐”数据集的详细信息:
- 图像形状(64,64,3)
- 培训:600张图片
- 测试:150张图片

现在是解决“快乐”挑战的时候了。

2 - 在Keras建立模型
Keras非常适合快速原型设计。在短时间内,您将能够构建一个可以获得出色结果的模型。

以下是Keras模型的示例:

def model(input_shape):
    # Define the input placeholder as a tensor with shape input_shape. Think of this as your input image!
    X_input = Input(input_shape)

    # Zero-Padding: pads the border of X_input with zeroes
    X = ZeroPadding2D((3, 3))(X_input)

    # CONV -> BN -> RELU Block applied to X
    X = Conv2D(32, (7, 7), strides = (1, 1), name = 'conv0')(X)
    X = BatchNormalization(axis = 3, name = 'bn0')(X)
    X = Activation('relu')(X)

    # MAXPOOL
    X = MaxPooling2D((2, 2), name='max_pool')(X)

    # FLATTEN X (means convert it to a vector) + FULLYCONNECTED
    X = Flatten()(X)
    X = Dense(1, activation='sigmoid', name='fc')(X)

    # Create model. This creates your Keras model instance, you'll use this instance to train/test the model.
    model = Model(inputs = X_input, outputs = X, name='HappyModel')

    return model



请注意,Keras使用的变量名称与我们以前在numpy和TensorFlow中使用的变量名称不同。特别是,而不是创建和分配上正向传播诸如的每个步骤的新变量X,Z1,A1,Z2,A2在Keras代码的计算的不同的层,等等,上述每行只重新分配X到使用新的值X = ...。换句话说,在前向传播的每个步骤中,我们只是将组合中的最新值写入同一个变量X。唯一的例外是X_input,我们保持独立并且没有覆盖,因为我们最后需要它来创建Keras模型实例(model = Model(inputs = X_input, ...)上图)。

练习:实施HappyModel()。这项任务比大多数人更开放。我们建议您首先使用我们建议的体系结构实现模型,然后使用它作为初始模型来完成此任务的其余部分。但在那之后,回过头来主动尝试其他模型架构。例如,您可能会从上面的模型中获取灵感,但随后会根据您的需要改变网络架构和超参数。您还可以使用其他功能,如AveragePooling2D(),GlobalMaxPooling2D(),Dropout()。

注意:您必须小心数据的形状。使用您在视频中学到的内容,确保卷积,合并和完全连接的图层适应您正在应用的卷。

# GRADED FUNCTION: HappyModel

def HappyModel(input_shape):
    """
    Implementation of the HappyModel.

    Arguments:
    input_shape -- shape of the images of the dataset

    Returns:
    model -- a Model() instance in Keras
    """

    ### START CODE HERE ###
    # Feel free to use the suggested outline in the text above to get started, and run through the whole
    # exercise (including the later portions of this notebook) once. The come back also try out other
    # network architectures as well. 

    # Define the input placeholder as a tensor with shape input_shape. Think of this as your input image!
    X_input = Input(input_shape)

    # Zero-Padding: pads the border of X_input with zeroes
    X = ZeroPadding2D((3, 3))(X_input)

    # CONV -> BN -> RELU Block applied to X
    X = Conv2D(32, (7, 7), strides = (1, 1), name = 'conv0')(X)
    X = BatchNormalization(axis = 3, name = 'bn0')(X)
    X = Activation('relu')(X)

    # MAXPOOL
    X = MaxPooling2D((2, 2), name='max_pool')(X)

    # FLATTEN X (means convert it to a vector) + FULLYCONNECTED
    X = Flatten()(X)
    X = Dense(1, activation='sigmoid', name='fc')(X)

    # Create model. This creates your Keras model instance, you'll use this instance to train/test the model.
    model = Model(inputs = X_input, outputs = X, name='HappyModel')

    ### END CODE HERE ###

    return model


您现在已经构建了一个描述模型的函数。为了训练和测试这个模型,Keras有四个步骤:
1。通过调用上面的函数创建模型
2.通过调用编译模型model.compile(optimizer = "...", loss = "...", metrics = ["accuracy"]) 
3.通过调用model.fit(x = ..., y = ..., epochs = ..., batch_size = ...) 
4 在训练数据上训练模型。通过测试数据测试模型调用model.evaluate(x = ..., y = ...)

如果你想知道更多关于model.compile(),model.fit(),model.evaluate()和它们的参数,参考官方Keras文档。

练习:实施步骤1,即创建模型。

### START CODE HERE ### (1 line)
happyModel = HappyModel(X_train.shape[1:])
### END CODE HERE ###



练习:实现步骤2,即编译模型以配置学习过程。compile()明智地选择3个论点。提示:快乐挑战是一个二元分类问题。

### START CODE HERE ### (1 line)
happyModel.compile(optimizer = "Adam", loss = "binary_crossentropy", metrics = ["accuracy"])
### END CODE HERE ###



练习:实施步骤3,即训练模型。选择纪元数和批量大小。

### START CODE HERE ### (1 line)
happyModel.fit(x = X_train, y = Y_train, epochs = 10, batch_size = 32)
### END CODE HERE ###

 

Epoch 1/10
600/600 [==============================] - 12s - loss: 2.3311 - acc: 0.5567    
Epoch 2/10
600/600 [==============================] - 12s - loss: 0.6309 - acc: 0.7733    
Epoch 3/10
600/600 [==============================] - 13s - loss: 0.2546 - acc: 0.8883    
Epoch 4/10
600/600 [==============================] - 14s - loss: 0.1593 - acc: 0.9467    
Epoch 5/10
600/600 [==============================] - 14s - loss: 0.1358 - acc: 0.9517    
Epoch 6/10
600/600 [==============================] - 14s - loss: 0.1558 - acc: 0.9367    
Epoch 7/10
600/600 [==============================] - 14s - loss: 0.1704 - acc: 0.9367    
Epoch 8/10
600/600 [==============================] - 14s - loss: 0.0987 - acc: 0.9667    
Epoch 9/10
600/600 [==============================] - 14s - loss: 0.0860 - acc: 0.9767    
Epoch 10/10
600/600 [==============================] - 14s - loss: 0.0726 - acc: 0.9767    
<keras.callbacks.History at 0x7f48536bb4e0>



请注意,如果fit()再次运行,model将继续使用已经学习的参数进行训练,而不是重新初始化它们。

练习:实施步骤4,即测试/评估模型。

### START CODE HERE ### (1 line)
preds = happyModel.evaluate(X_test, Y_test)
### END CODE HERE ###
print()
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))

150/150 [==============================] - 1s     

Loss = 0.254035257101
Test Accuracy = 0.933333337307


如果您的happyModel()功能有效,您应该观察到比列车和测试集上的随机猜测(50%)准确性要好得多。

为了给您一个比较点,我们的模型在40个时期(和99%的列车精度)中获得大约95%的测试精度,其中迷你批量大小为16,“adam”优化器。但是我们的模型在2-5个时代之后获得了不错的精确度,所以如果你要比较不同的模型,你也可以在几个时期训练各种模型,看看它们如何比较。

如果你还没有达到非常好的准确度(比方说超过80%),这里有一些你可以尝试实现它的东西:

尝试使用CONV-> BATCHNORM-> RELU块,例如:

X = Conv2D(32, (3, 3), strides = (1, 1), name = 'conv0')(X)
X = BatchNormalization(axis = 3, name = 'bn0')(X)
X = Activation('relu')(X)



直到您的高度和宽度尺寸非常小并且通道数量非常大(例如≈32)。您在具有大量通道的卷中编码有用信息。然后,您可以展平音量并使用完全连接的图层。
- 在这些块之后你可以使用MAXPOOL。它将帮助您降低高度和宽度的尺寸。
- 更改优化程序。我们发现亚当运作良好。 
- 如果模型难以运行并且您遇到内存问题,请降低batch_size(12通常是一个很好的折衷方案)
- 运行更多的纪元,直到您看到列车精度达到稳定水平。

即使您已经达到了良好的准确度,也请随时继续使用您的模型以尝试获得更好的结果。

注意:如果在模型上执行超参数调整,则测试集实际上变为开发集,并且您的模型可能最终过度拟合到测试(dev)集。但只是为了这项任务的目的,我们不会在此担心。

3 - 结论
恭喜你,你已经解决了Happy House的挑战!

现在,您只需将此模型链接到您家的前门摄像头即可。遗憾的是,我们不会在这里详细介绍如何做到这一点。


我们希望您从这项任务中记住: 
- Keras是我们推荐用于快速原型制作的工具。它允许您快速尝试不同的模型体系结构。您是否希望使用Keras实现深度学习日常生活的应用? 
- 记住如何在Keras中编写模型以及在测试集上评估模型的四个步骤。Create->编译期>飞度/列列车─>评估/测试。

4 - 使用您自己的图像进行测试(可选)
恭喜你完成了这项任务。你现在可以拍一张你的脸,看看你是否可以进入快乐之家。为此:
1。单击此笔记本上方栏中的“文件”,然后单击“打开”以进入Coursera Hub。
2.将您的图像添加到此Jupyter Notebook的目录,在“images”文件夹中
3.在下面的代码中写下您的图像名称
4.运行代码并检查算法是否正确(0表示不满意,1表示满意)!

训练/测试组非常相似; 例如,所有照片都是在相同的背景下拍摄的(因为前门摄像头总是安装在相同的位置)。这使问题更容易,但是对这些数据进行过培训的模型可能会也可能不会对您自己的数据起作用。但请随意尝试一下!

### START CODE HERE ###
img_path = 'images/my_image.jpg'
### END CODE HERE ###
img = image.load_img(img_path, target_size=(64, 64))
imshow(img)

x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)

print(happyModel.predict(x))

[[ 0.]]

5 - Keras中的其他有用功能(可选)
您会发现Keras的另外两个基本功能是:
- model.summary():在表格中打印图层的详细信息,其中包含输入/输出的大小
- plot_model():以精美的布局绘制图形。如果你想在社交媒体上分享它,你甚至可以使用SVG()将其保存为“.png”;)。它保存在笔记本上方栏中的“文件”和“打开...”中。

运行以下代码。

happyModel.summary()
1
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
input_4 (InputLayer)         (None, 64, 64, 3)         0         
_________________________________________________________________
zero_padding2d_4 (ZeroPaddin (None, 70, 70, 3)         0         
_________________________________________________________________
conv0 (Conv2D)               (None, 64, 64, 32)        4736      
_________________________________________________________________
bn0 (BatchNormalization)     (None, 64, 64, 32)        128       
_________________________________________________________________
activation_4 (Activation)    (None, 64, 64, 32)        0         
_________________________________________________________________
max_pool (MaxPooling2D)      (None, 32, 32, 32)        0         
_________________________________________________________________
flatten_4 (Flatten)          (None, 32768)             0         
_________________________________________________________________
fc (Dense)                   (None, 1)                 32769     
=================================================================
Total params: 37,633
Trainable params: 37,569
Non-trainable params: 64
_________________________________________________________________

plot_model(happyModel, to_file='HappyModel.png')
SVG(model_to_dot(happyModel).create(prog='dot', format='svg'))


 

第2部分:残差网络
欢迎来到本周的第二次作业!您将学习如何使用残余网络(ResNets)构建非常深的卷积网络。从理论上讲,非常深的网络可以代表非常复杂的功能; 但在实践中,他们很难训练。由He等人介绍的剩余网络。,允许您训练比以前实际可行的更深的网络。

在此作业中,您将: 
- 实施ResNets的基本构建块。 
- 将这些构建块放在一起,以实现和训练最先进的神经网络进行图像分类。

这项任务将在Keras完成。

在讨论问题之前,让我们运行下面的单元格来加载所需的包。

import numpy as np
from keras import layers
from keras.layers import Input, Add, Dense, Activation, ZeroPadding2D, BatchNormalization, Flatten, Conv2D, AveragePooling2D, MaxPooling2D, GlobalMaxPooling2D
from keras.models import Model, load_model
from keras.preprocessing import image
from keras.utils import layer_utils
from keras.utils.data_utils import get_file
from keras.applications.imagenet_utils import preprocess_input
import pydot
from IPython.display import SVG
from keras.utils.vis_utils import model_to_dot
from keras.utils import plot_model
from resnets_utils import *
from keras.initializers import glorot_uniform
import scipy.misc
from matplotlib.pyplot import imshow
%matplotlib inline

import keras.backend as K
K.set_image_data_format('channels_last')
K.set_learning_phase(1)



您可以从此处获取支持代码和数据集。

1 - 非常深的神经网络问题
上周,您构建了第一个卷积神经网络。近年来,神经网络已经变得更加深入,最先进的网络从几层(例如,AlexNet)变为超过一百层。

非常深的网络的主要好处是它可以代表非常复杂的功能。它还可以学习许多不同抽象层次的特征,从边缘(在较低层)到非常复杂的特征(在较深层)。但是,使用更深入的网络并不总是有帮助。训练它们的巨大障碍是逐渐消失的梯度:非常深的网络通常具有快速变为零的梯度信号,从而使得梯度下降难以忍受地缓慢。更具体地说,在梯度下降期间,当您从最后一层向后推进到第一层时,您将乘以每一步的权重矩阵,因此梯度可以指数快速地减小到零(或者,在极少数情况下,指数增长快速并“爆炸”以获取非常大的值)。

因此,在训练过程中,您可能会看到随着训练的进行,早期图层的梯度幅度(或范数)会迅速下降到零:


图1 :消失梯度 
随着网络训练,早期层的学习速度会迅速下降
您现在将通过构建剩余网络来解决此问题!

2 - 建立剩余网络
在ResNets中,“快捷方式”或“跳过连接”允许渐变直接反向传播到较早的层:


图2 :显示跳过连接的 ResNet块 
左侧的图像显示了通过网络的“主要路径”。右侧的图像为主路径添加了快捷方式。通过将这些ResNet块堆叠在一起,您可以形成一个非常深的网络。

我们还在讲座中看到,使用带有快捷方式的ResNet块也可以让其中一个块很容易学习身份功能。这意味着您可以堆叠其他ResNet块,几乎不会有损害训练集性能的风险。(还有一些证据表明,学习身份功能的简易性 - 甚至超过帮助消除梯度的连接 - 解决了ResNets的卓越表现。)

ResNet中使用两种主要类型的块,主要取决于输入/输出尺寸是相同还是不同。您将实现它们。

2.1 - 身份块
标识块是ResNets中使用的标准块,对应于输入激活的情况(例如a[ l ]一个[升])具有与输出激活相同的维度(例如a[ l + 2 ]一个[升+2])。为了充实ResNet标识块中发生的不同步骤,下面是另一个显示各个步骤的图表:


图3 :身份块。跳过连接“跳过”2层。
上部路径是“快捷路径”。下部路径是“主路径”。在此图中,我们还明确了每层中的CONV2D和ReLU步骤。为了加快培训速度,我们还添加了BatchNorm步骤。不要担心实现起来很复杂 - 你会发现BatchNorm只是Keras中的一行代码!

在本练习中,您将实际实现此标识块的稍微强大的版本,其中跳过连接“跳过”3个隐藏层而不是2层。它看起来像这样:


图4 :身份块。跳过连接“跳过”3层。
这是个别步骤。

主路径
的第一个组成部分: - 第一个CONV2D有F1F1形状(1,1)的滤波器和(1,1)的步幅。它的填充是“有效的”,它的名字应该是conv_name_base + '2a'。使用0作为随机初始化的种子。 
- 第一个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2a'。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

主路径的第二个组成部分:
- 第二个CONV2D有F2F2形状过滤器(f,f)(F,F)和(1,1)的步幅。它的填充是“相同的”,它的名字应该是conv_name_base + '2b'。使用0作为随机初始化的种子。 
- 第二个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2b'。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

主路径的第三个组成部分:
- 第三个CONV2D有F.3F3形状(1,1)的滤波器和(1,1)的步幅。它的填充是“有效的”,它的名字应该是conv_name_base + '2c'。使用0作为随机初始化的种子。 
- 第三个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2c'。请注意,此组件中没有ReLU激活功能。

最后一步: 
- 将快捷方式和输入添加到一起。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

练习:实现ResNet标识块。我们已经实现了主路径的第一个组件。请仔细阅读,以确保您了解它在做什么。你应该实现其余的。 
- 要实现Conv2D步骤:请参阅参考 
- 实现BatchNorm:请参阅参考(轴:整数,应规范化的轴(通常是通道轴))
- 对于激活,使用: Activation('relu')(X) 
- 添加由前面传递的值快捷方式:见参考

# GRADED FUNCTION: identity_block

def identity_block(X, f, filters, stage, block):
    """
    Implementation of the identity block as defined in Figure 3

    Arguments:
    X -- input tensor of shape (m, n_H_prev, n_W_prev, n_C_prev)
    f -- integer, specifying the shape of the middle CONV's window for the main path
    filters -- python list of integers, defining the number of filters in the CONV layers of the main path
    stage -- integer, used to name the layers, depending on their position in the network
    block -- string/character, used to name the layers, depending on their position in the network

    Returns:
    X -- output of the identity block, tensor of shape (n_H, n_W, n_C)
    """

    # defining name basis
    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    # Retrieve Filters
    F1, F2, F3 = filters

    # Save the input value. You'll need this later to add back to the main path. 
    X_shortcut = X

    # First component of main path
    X = Conv2D(filters = F1, kernel_size = (1, 1), strides = (1,1), padding = 'valid', name = conv_name_base + '2a', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2a')(X)
    X = Activation('relu')(X)

    ### START CODE HERE ###

    # Second component of main path (≈3 lines)
    X = Conv2D(filters = F2, kernel_size = (f, f), strides = (1,1), padding = 'same', name = conv_name_base + '2b', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2b')(X)
    X = Activation('relu')(X)

    # Third component of main path (≈2 lines)
    X = Conv2D(filters = F3, kernel_size = (1, 1), strides = (1,1), padding = 'valid', name = conv_name_base + '2c', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2c')(X)

    # Final step: Add shortcut value to main path, and pass it through a RELU activation (≈2 lines)
    X = Add()([X, X_shortcut])
    X = Activation('relu')(X)

    ### END CODE HERE ###

    return X


 

tf.reset_default_graph()

with tf.Session() as test:
    np.random.seed(1)
    A_prev = tf.placeholder("float", [3, 4, 4, 6])
    X = np.random.randn(3, 4, 4, 6)
    A = identity_block(A_prev, f = 2, filters = [2, 4, 6], stage = 1, block = 'a')
    test.run(tf.global_variables_initializer())
    out = test.run([A], feed_dict={A_prev: X, K.learning_phase(): 0})
    print("out = " + str(out[0][1][1][0]))
out = [ 0.94822985  0.          1.16101444  2.747859    0.          1.36677003]
1




2.2 - 卷积块
您已实现ResNet标识块。接下来,ResNet“卷积块”是另一种类型的块。当输入和输出尺寸不匹配时,可以使用此类型的块。与标识块的区别在于快捷方式路径中存在CONV2D层:


图4 :卷积块
快捷方式路径中的CONV2D层用于调整输入x的大小X到另一个维度,以便在最后添加时维度​​匹配,以将快捷方式值添加回主路径。(这与矩阵W起着类似的作用小号该小号在演讲中讨论过。)例如,要将激活尺寸的高度和宽度减少2倍,可以使用步长为2的1x1卷积。快捷方式路径上的CONV2D图层不使用任何非线性激活函数。它的主要作用是仅应用一个(学习的)线性函数来减少输入的维数,以便尺寸与后面的添加步骤相匹配。

卷积块的细节如下。

主路径
的第一个组成部分:- 第一个CONV2D有F1F1形状(1,1)的滤波器和(s,s)的步幅。它的填充是“有效的”,它的名字应该是conv_name_base + '2a'。 
- 第一个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2a'。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

主路径的第二个组成部分:
- 第二个CONV2D有F2F2(f,f)的滤波器和(1,1)的步幅。它的填充是“相同的”,它的名字应该是conv_name_base + '2b'。
- 第二个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2b'。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

主路径的第三个组成部分:
- 第三个CONV2D有F.3F3(1,1)的滤波器和(1,1)的步幅。它的填充是“有效的”,它的名字应该是conv_name_base + '2c'。
- 第三个BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '2c'。请注意,此组件中没有ReLU激活功能。

快捷方式:
- CONV2D有F.3F3形状(1,1)的滤波器和(s,s)的步幅。它的填充是“有效的”,它的名字应该是conv_name_base + '1'。
- BatchNorm正在规范通道轴。它的名字应该是bn_name_base + '1'。

最后一步: 
- 将快捷方式和主路径值相加。
- 然后应用ReLU激活功能。这没有名称,也没有超参数。

练习:实现卷积块。我们已经实现了主要路径的第一个组成部分; 你应该实现其余的。和以前一样,总是使用0作为随机初始化的种子,以确保与我们的评分者保持一致。
- Conv Hint 
- BatchNorm提示(轴:整数,应该规范化的轴(通常是特征轴))
- 对于激活,使用: Activation('relu')(X) 
- 加法提示

# GRADED FUNCTION: convolutional_block

def convolutional_block(X, f, filters, stage, block, s = 2):
    """
    Implementation of the convolutional block as defined in Figure 4

    Arguments:
    X -- input tensor of shape (m, n_H_prev, n_W_prev, n_C_prev)
    f -- integer, specifying the shape of the middle CONV's window for the main path
    filters -- python list of integers, defining the number of filters in the CONV layers of the main path
    stage -- integer, used to name the layers, depending on their position in the network
    block -- string/character, used to name the layers, depending on their position in the network
    s -- Integer, specifying the stride to be used

    Returns:
    X -- output of the convolutional block, tensor of shape (n_H, n_W, n_C)
    """

    # defining name basis
    conv_name_base = 'res' + str(stage) + block + '_branch'
    bn_name_base = 'bn' + str(stage) + block + '_branch'

    # Retrieve Filters
    F1, F2, F3 = filters

    # Save the input value
    X_shortcut = X


    ##### MAIN PATH #####
    # First component of main path 
    X = Conv2D(F1, (1, 1), strides = (s,s), name = conv_name_base + '2a', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2a')(X)
    X = Activation('relu')(X)

    ### START CODE HERE ###

    # Second component of main path (≈3 lines)
    X = Conv2D(F2, (f, f), strides = (1,1), name = conv_name_base + '2b', padding = 'same', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2b')(X)
    X = Activation('relu')(X)

    # Third component of main path (≈2 lines)
    X = Conv2D(F3, (1, 1), strides = (1,1), name = conv_name_base + '2c', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = bn_name_base + '2c')(X)

    ##### SHORTCUT PATH #### (≈2 lines)
    X_shortcut = Conv2D(F3, (1, 1), strides = (s,s), name = conv_name_base + '1', kernel_initializer = glorot_uniform(seed=0))(X_shortcut)
    X_shortcut = BatchNormalization(axis = 3, name = bn_name_base + '1')(X_shortcut)

    # Final step: Add shortcut value to main path, and pass it through a RELU activation (≈2 lines)
    X = Add()([X, X_shortcut])
    X = Activation('relu')(X)

    ### END CODE HERE ###

    return X


 

tf.reset_default_graph()

with tf.Session() as test:
    np.random.seed(1)
    A_prev = tf.placeholder("float", [3, 4, 4, 6])
    X = np.random.randn(3, 4, 4, 6)
    A = convolutional_block(A_prev, f = 2, filters = [2, 4, 6], stage = 1, block = 'a')
    test.run(tf.global_variables_initializer())
    out = test.run([A], feed_dict={A_prev: X, K.learning_phase(): 0})
    print("out = " + str(out[0][1][1][0]))

out = [ 0.09018463  1.23489773  0.46822017  0.0367176   0.          0.65516603]
1


3 - 构建您的第一个ResNet模型(50层)
您现在拥有构建非常深的ResNet所需的块。下图详细描述了该神经网络的架构。图中的“ID BLOCK”代表“Identity block”,“ID BLOCK x3”表示您应该将3个标识块堆叠在一起。


图5 : ResNet-50模型
这个ResNet-50型号的细节是:
- 使用(3,3)的垫填充输入的零填充
- 第1阶段:
- 2D卷积具有64个形状的滤波器(7,7)并且使用大步( 2,2)。它的名字是“conv1”。
- BatchNorm应用于输入的通道轴。
- MaxPooling使用(3,3)窗口和(2,2)步幅。
- 阶段2:
- 卷积块使用三组大小为[64,64,256]的过滤器,“f”为3,“s”为1,块为“a”。
- 2个标识块使用三组大小为[64,64,256]的过滤器,“f”为3,块为“b”和“c”。
- 阶段3:
- 卷积块使用三组大小为[128,128,512]的过滤器,“f”为3,“s”为2,块为“a”。
- 3个标识块使用三组大小为[128,128,512]的过滤器,“f”为3,块为“b”,“c”和“d”。
- 阶段4:
- 卷积块使用三组大小为[256,256,1024]的滤波器,“f”为3,“s”为2且块为“a”。
- 5个标识块使用三组大小为[256,256,1024]的过滤器,“f”为3,块为“b”,“c”,“d”,“e”和“f”。
- 阶段5:
- 卷积块使用三组大小为[512,512,2048]的滤波器,“f”为3,“s”为2且块为“a”。
- 2个标识块使用三组大小为[512,512,2048]的过滤器,“f”为3,块为“b”和“c”。
- 2D平均池使用形状窗口(2,2),其名称为“avg_pool”。
- 展平没有任何超参数或名称。
- 完全连接(密集)层使用softmax激活将其输入减少到类的数量。它的名字应该是'fc' + str(classes)。

练习:使用上图中描述的50层实施ResNet。我们已经实施了第1阶段和第2阶段。请完成剩下的工作。(实现阶段3-5的语法应该与阶段2的语法非常相似。)确保遵循上面文本中的命名约定。

您需要使用此功能: 
- 平均池化参见参考

以下是我们在下面的代码中使用的一些其他函数:
- Conv2D:请参阅参考 
- BatchNorm:请参阅参考(轴:整数,应归一化的轴(通常是特征轴))
- 零填充:请参阅参考 
- 最大池:参见参考 
- 完全连接的层:参见参考 
- 增加:参见参考

# GRADED FUNCTION: ResNet50

def ResNet50(input_shape = (64, 64, 3), classes = 6):
    """
    Implementation of the popular ResNet50 the following architecture:
    CONV2D -> BATCHNORM -> RELU -> MAXPOOL -> CONVBLOCK -> IDBLOCK*2 -> CONVBLOCK -> IDBLOCK*3
    -> CONVBLOCK -> IDBLOCK*5 -> CONVBLOCK -> IDBLOCK*2 -> AVGPOOL -> TOPLAYER

    Arguments:
    input_shape -- shape of the images of the dataset
    classes -- integer, number of classes

    Returns:
    model -- a Model() instance in Keras
    """

    # Define the input as a tensor with shape input_shape
    X_input = Input(input_shape)


    # Zero-Padding
    X = ZeroPadding2D((3, 3))(X_input)

    # Stage 1
    X = Conv2D(64, (7, 7), strides = (2, 2), name = 'conv1', kernel_initializer = glorot_uniform(seed=0))(X)
    X = BatchNormalization(axis = 3, name = 'bn_conv1')(X)
    X = Activation('relu')(X)
    X = MaxPooling2D((3, 3), strides=(2, 2))(X)

    # Stage 2
    X = convolutional_block(X, f = 3, filters = [64, 64, 256], stage = 2, block='a', s = 1)
    X = identity_block(X, 3, [64, 64, 256], stage=2, block='b')
    X = identity_block(X, 3, [64, 64, 256], stage=2, block='c')

    ### START CODE HERE ###

    # Stage 3 (≈4 lines)
    X = convolutional_block(X, f = 3, filters = [128, 128, 512], stage = 3, block='a', s = 2)
    X = identity_block(X, 3, [128, 128, 512], stage=3, block='b')
    X = identity_block(X, 3, [128, 128, 512], stage=3, block='c')
    X = identity_block(X, 3, [128, 128, 512], stage=3, block='d')

    # Stage 4 (≈6 lines)
    X = convolutional_block(X, f = 3, filters = [256, 256, 1024], stage = 4, block='a', s = 2)
    X = identity_block(X, 3, [256, 256, 1024], stage=4, block='b')
    X = identity_block(X, 3, [256, 256, 1024], stage=4, block='c')
    X = identity_block(X, 3, [256, 256, 1024], stage=4, block='d')
    X = identity_block(X, 3, [256, 256, 1024], stage=4, block='e')
    X = identity_block(X, 3, [256, 256, 1024], stage=4, block='f')

    # Stage 5 (≈3 lines)
    X = convolutional_block(X, f = 3, filters = [512, 512, 2048], stage = 5, block='a', s = 2)
    X = identity_block(X, 3, [512, 512, 2048], stage=5, block='b')
    X = identity_block(X, 3, [512, 512, 2048], stage=5, block='c')

    # AVGPOOL (≈1 line). Use "X = AveragePooling2D(...)(X)"
    X = AveragePooling2D((2, 2), name='avg_pool')(X)

    ### END CODE HERE ###

    # output layer
    X = Flatten()(X)
    X = Dense(classes, activation='softmax', name='fc' + str(classes), kernel_initializer = glorot_uniform(seed=0))(X)


    # Create model
    model = Model(inputs = X_input, outputs = X, name='ResNet50')

    return model


运行以下代码以构建模型的图形。如果您的实施不正确,您将通过在model.fit(...)下面运行时检查您的准确性来了解它。

model = ResNet50(input_shape = (64, 64, 3), classes = 6)


如Keras Tutorial Notebook中所述,在训练模型之前,您需要通过编译模型来配置学习过程。

model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])


该模型现已准备好接受培训。您唯一需要的是数据集。

让我们加载SIGNS数据集。
图6 : SIGNS数据集

X_train_orig, Y_train_orig, X_test_orig, Y_test_orig, classes = load_dataset()

# Normalize image vectors
X_train = X_train_orig/255.
X_test = X_test_orig/255.

# Convert training and test labels to one hot matrices
Y_train = convert_to_one_hot(Y_train_orig, 6).T
Y_test = convert_to_one_hot(Y_test_orig, 6).T

print ("number of training examples = " + str(X_train.shape[0]))
print ("number of test examples = " + str(X_test.shape[0]))
print ("X_train shape: " + str(X_train.shape))
print ("Y_train shape: " + str(Y_train.shape))
print ("X_test shape: " + str(X_test.shape))
print ("Y_test shape: " + str(Y_test.shape))

 


number of training examples = 1080
number of test examples = 120
X_train shape: (1080, 64, 64, 3)
Y_train shape: (1080, 6)
X_test shape: (120, 64, 64, 3)
Y_test shape: (120, 6)



运行以下单元格以批量大小为32的2个时期训练模型。在CPU上,每个时期大约需要5分钟。

model.fit(X_train, Y_train, epochs = 2, batch_size = 32)
1
Epoch 1/2
1080/1080 [==============================] - 260s - loss: 2.9406 - acc: 0.2713   
Epoch 2/2
1080/1080 [==============================] - 239s - loss: 2.4578 - acc: 0.3083   

<keras.callbacks.History at 0x7fc9ac1c1cc0>



预期产出:

**大纪元1/2 **    损失:介于1和5之间,acc:介于0.2和0.5之间,尽管您的结果可能与我们的不同。
**大纪元2/2 **    损失:介于1和5之间,acc:介于0.2和0.5之间,您应该看到损失减少且准确度增加。
让我们看看这个模型(仅在两个时期训练)如何在测试集上执行。

preds = model.evaluate(X_test, Y_test)
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
120/120 [==============================] - 9s     
Loss = 2.14532471498
Test Accuracy = 0.166666666667





预期产出:

**测试准确度**    介于0.16和0.25之间
为了完成这项任务,我们要求您仅为两个时期训练模型。你可以看到它表现不佳。请继续并提交您的作业; 为了检查正确性,在线评分员也将仅为少量时期运行您的代码。

完成此任务的官方(评级)部分后,如果需要,您还可以选择培训ResNet以进行更多迭代。当我们训练约20个时期时,我们获得了更好的性能,但是在训练CPU时需要一个多小时。

使用GPU,我们在SIGNS数据集上训练了我们自己的ResNet50模型的权重。您可以在下面的单元格中的测试集上加载和运行我们训练过的模型。加载模型可能需要≈1分钟。

model = load_model('ResNet50.h5') 
preds = model.evaluate(X_test, Y_test)
print ("Loss = " + str(preds[0]))
print ("Test Accuracy = " + str(preds[1]))
120/120 [==============================] - 9s     
Loss = 0.530178320408
Test Accuracy = 0.866666662693


ResNet50是一种功能强大的图像分类模型,经过适当的迭代训练。我们希望您可以使用您学到的知识并将其应用于您自己的分类问题,以执行最先进的准确性。

恭喜你完成这项任务!您现在已经实施了最先进的图像分类系统!

4 - 测试您自己的图像(可选/未评分)
如果您愿意,您也可以自己拍照并查看模型的输出。要执行此操作:
1。单击此笔记本上方栏中的“文件”,然后单击“打开”以进入Coursera Hub。
2.将您的图像添加到此Jupyter Notebook的目录,在“images”文件夹中
3.在下面的代码中写下您的图像名称
4.运行代码并检查算法是否正确!

img_path = 'images/my_image.jpg'
img = image.load_img(img_path, target_size=(64, 64))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)
x = preprocess_input(x)
print('Input image shape:', x.shape)
my_image = scipy.misc.imread(img_path)
imshow(my_image)
print("class prediction vector [p(0), p(1), p(2), p(3), p(4), p(5)] = ")
print(model.predict(x))
Input image shape: (1, 64, 64, 3)
class prediction vector [p(0), p(1), p(2), p(3), p(4), p(5)] = 
[[ 1.  0.  0.  0.  0.  0.]]


 

您还可以通过运行以下代码来打印模型的摘要。

model.summary()
____________________________________________________________________________________________________
Layer (type)                     Output Shape          Param #     Connected to                     
====================================================================================================
input_1 (InputLayer)             (None, 64, 64, 3)     0                                            
____________________________________________________________________________________________________
zero_padding2d_1 (ZeroPadding2D) (None, 70, 70, 3)     0           input_1[0][0]                    
____________________________________________________________________________________________________
conv1 (Conv2D)                   (None, 32, 32, 64)    9472        zero_padding2d_1[0][0]           
____________________________________________________________________________________________________
bn_conv1 (BatchNormalization)    (None, 32, 32, 64)    256         conv1[0][0]                      
____________________________________________________________________________________________________
activation_4 (Activation)        (None, 32, 32, 64)    0           bn_conv1[0][0]                   
____________________________________________________________________________________________________
max_pooling2d_1 (MaxPooling2D)   (None, 15, 15, 64)    0           activation_4[0][0]               
____________________________________________________________________________________________________
res2a_branch2a (Conv2D)          (None, 15, 15, 64)    4160        max_pooling2d_1[0][0]            
____________________________________________________________________________________________________
bn2a_branch2a (BatchNormalizatio (None, 15, 15, 64)    256         res2a_branch2a[0][0]             
____________________________________________________________________________________________________
activation_5 (Activation)        (None, 15, 15, 64)    0           bn2a_branch2a[0][0]              
____________________________________________________________________________________________________
res2a_branch2b (Conv2D)          (None, 15, 15, 64)    36928       activation_5[0][0]               
____________________________________________________________________________________________________
bn2a_branch2b (BatchNormalizatio (None, 15, 15, 64)    256         res2a_branch2b[0][0]             
____________________________________________________________________________________________________
activation_6 (Activation)        (None, 15, 15, 64)    0           bn2a_branch2b[0][0]              
____________________________________________________________________________________________________
res2a_branch2c (Conv2D)          (None, 15, 15, 256)   16640       activation_6[0][0]               
____________________________________________________________________________________________________
res2a_branch1 (Conv2D)           (None, 15, 15, 256)   16640       max_pooling2d_1[0][0]            
____________________________________________________________________________________________________
bn2a_branch2c (BatchNormalizatio (None, 15, 15, 256)   1024        res2a_branch2c[0][0]             
____________________________________________________________________________________________________
bn2a_branch1 (BatchNormalization (None, 15, 15, 256)   1024        res2a_branch1[0][0]              
____________________________________________________________________________________________________
add_2 (Add)                      (None, 15, 15, 256)   0           bn2a_branch2c[0][0]              
                                                                   bn2a_branch1[0][0]               
____________________________________________________________________________________________________
activation_7 (Activation)        (None, 15, 15, 256)   0           add_2[0][0]                      
____________________________________________________________________________________________________
res2b_branch2a (Conv2D)          (None, 15, 15, 64)    16448       activation_7[0][0]               
____________________________________________________________________________________________________
bn2b_branch2a (BatchNormalizatio (None, 15, 15, 64)    256         res2b_branch2a[0][0]             
____________________________________________________________________________________________________
activation_8 (Activation)        (None, 15, 15, 64)    0           bn2b_branch2a[0][0]              
____________________________________________________________________________________________________
res2b_branch2b (Conv2D)          (None, 15, 15, 64)    36928       activation_8[0][0]               
____________________________________________________________________________________________________
bn2b_branch2b (BatchNormalizatio (None, 15, 15, 64)    256         res2b_branch2b[0][0]             
____________________________________________________________________________________________________
activation_9 (Activation)        (None, 15, 15, 64)    0           bn2b_branch2b[0][0]              
____________________________________________________________________________________________________
res2b_branch2c (Conv2D)          (None, 15, 15, 256)   16640       activation_9[0][0]               
____________________________________________________________________________________________________
bn2b_branch2c (BatchNormalizatio (None, 15, 15, 256)   1024        res2b_branch2c[0][0]             
____________________________________________________________________________________________________
add_3 (Add)                      (None, 15, 15, 256)   0           bn2b_branch2c[0][0]              
                                                                   activation_7[0][0]               
____________________________________________________________________________________________________
activation_10 (Activation)       (None, 15, 15, 256)   0           add_3[0][0]                      
____________________________________________________________________________________________________
res2c_branch2a (Conv2D)          (None, 15, 15, 64)    16448       activation_10[0][0]              
____________________________________________________________________________________________________
bn2c_branch2a (BatchNormalizatio (None, 15, 15, 64)    256         res2c_branch2a[0][0]             
____________________________________________________________________________________________________
activation_11 (Activation)       (None, 15, 15, 64)    0           bn2c_branch2a[0][0]              
____________________________________________________________________________________________________
res2c_branch2b (Conv2D)          (None, 15, 15, 64)    36928       activation_11[0][0]              
____________________________________________________________________________________________________
bn2c_branch2b (BatchNormalizatio (None, 15, 15, 64)    256         res2c_branch2b[0][0]             
____________________________________________________________________________________________________
activation_12 (Activation)       (None, 15, 15, 64)    0           bn2c_branch2b[0][0]              
____________________________________________________________________________________________________
res2c_branch2c (Conv2D)          (None, 15, 15, 256)   16640       activation_12[0][0]              
____________________________________________________________________________________________________
bn2c_branch2c (BatchNormalizatio (None, 15, 15, 256)   1024        res2c_branch2c[0][0]             
____________________________________________________________________________________________________
add_4 (Add)                      (None, 15, 15, 256)   0           bn2c_branch2c[0][0]              
                                                                   activation_10[0][0]              
____________________________________________________________________________________________________
activation_13 (Activation)       (None, 15, 15, 256)   0           add_4[0][0]                      
____________________________________________________________________________________________________
res3a_branch2a (Conv2D)          (None, 8, 8, 128)     32896       activation_13[0][0]              
____________________________________________________________________________________________________
bn3a_branch2a (BatchNormalizatio (None, 8, 8, 128)     512         res3a_branch2a[0][0]             
____________________________________________________________________________________________________
activation_14 (Activation)       (None, 8, 8, 128)     0           bn3a_branch2a[0][0]              
____________________________________________________________________________________________________
res3a_branch2b (Conv2D)          (None, 8, 8, 128)     147584      activation_14[0][0]              
____________________________________________________________________________________________________
bn3a_branch2b (BatchNormalizatio (None, 8, 8, 128)     512         res3a_branch2b[0][0]             
____________________________________________________________________________________________________
activation_15 (Activation)       (None, 8, 8, 128)     0           bn3a_branch2b[0][0]              
____________________________________________________________________________________________________
res3a_branch2c (Conv2D)          (None, 8, 8, 512)     66048       activation_15[0][0]              
____________________________________________________________________________________________________
res3a_branch1 (Conv2D)           (None, 8, 8, 512)     131584      activation_13[0][0]              
____________________________________________________________________________________________________
bn3a_branch2c (BatchNormalizatio (None, 8, 8, 512)     2048        res3a_branch2c[0][0]             
____________________________________________________________________________________________________
bn3a_branch1 (BatchNormalization (None, 8, 8, 512)     2048        res3a_branch1[0][0]              
____________________________________________________________________________________________________
add_5 (Add)                      (None, 8, 8, 512)     0           bn3a_branch2c[0][0]              
                                                                   bn3a_branch1[0][0]               
____________________________________________________________________________________________________
activation_16 (Activation)       (None, 8, 8, 512)     0           add_5[0][0]                      
____________________________________________________________________________________________________
res3b_branch2a (Conv2D)          (None, 8, 8, 128)     65664       activation_16[0][0]              
____________________________________________________________________________________________________
bn3b_branch2a (BatchNormalizatio (None, 8, 8, 128)     512         res3b_branch2a[0][0]             
____________________________________________________________________________________________________
activation_17 (Activation)       (None, 8, 8, 128)     0           bn3b_branch2a[0][0]              
____________________________________________________________________________________________________
res3b_branch2b (Conv2D)          (None, 8, 8, 128)     147584      activation_17[0][0]              
____________________________________________________________________________________________________
bn3b_branch2b (BatchNormalizatio (None, 8, 8, 128)     512         res3b_branch2b[0][0]             
____________________________________________________________________________________________________
activation_18 (Activation)       (None, 8, 8, 128)     0           bn3b_branch2b[0][0]              
____________________________________________________________________________________________________
res3b_branch2c (Conv2D)          (None, 8, 8, 512)     66048       activation_18[0][0]              
____________________________________________________________________________________________________
bn3b_branch2c (BatchNormalizatio (None, 8, 8, 512)     2048        res3b_branch2c[0][0]             
____________________________________________________________________________________________________
add_6 (Add)                      (None, 8, 8, 512)     0           bn3b_branch2c[0][0]              
                                                                   activation_16[0][0]              
____________________________________________________________________________________________________
activation_19 (Activation)       (None, 8, 8, 512)     0           add_6[0][0]                      
____________________________________________________________________________________________________
res3c_branch2a (Conv2D)          (None, 8, 8, 128)     65664       activation_19[0][0]              
____________________________________________________________________________________________________
bn3c_branch2a (BatchNormalizatio (None, 8, 8, 128)     512         res3c_branch2a[0][0]             
____________________________________________________________________________________________________
activation_20 (Activation)       (None, 8, 8, 128)     0           bn3c_branch2a[0][0]              
____________________________________________________________________________________________________
res3c_branch2b (Conv2D)          (None, 8, 8, 128)     147584      activation_20[0][0]              
____________________________________________________________________________________________________
bn3c_branch2b (BatchNormalizatio (None, 8, 8, 128)     512         res3c_branch2b[0][0]             
____________________________________________________________________________________________________
activation_21 (Activation)       (None, 8, 8, 128)     0           bn3c_branch2b[0][0]              
____________________________________________________________________________________________________
res3c_branch2c (Conv2D)          (None, 8, 8, 512)     66048       activation_21[0][0]              
____________________________________________________________________________________________________
bn3c_branch2c (BatchNormalizatio (None, 8, 8, 512)     2048        res3c_branch2c[0][0]             
____________________________________________________________________________________________________
add_7 (Add)                      (None, 8, 8, 512)     0           bn3c_branch2c[0][0]              
                                                                   activation_19[0][0]              
____________________________________________________________________________________________________
activation_22 (Activation)       (None, 8, 8, 512)     0           add_7[0][0]                      
____________________________________________________________________________________________________
res3d_branch2a (Conv2D)          (None, 8, 8, 128)     65664       activation_22[0][0]              
____________________________________________________________________________________________________
bn3d_branch2a (BatchNormalizatio (None, 8, 8, 128)     512         res3d_branch2a[0][0]             
____________________________________________________________________________________________________
activation_23 (Activation)       (None, 8, 8, 128)     0           bn3d_branch2a[0][0]              
____________________________________________________________________________________________________
res3d_branch2b (Conv2D)          (None, 8, 8, 128)     147584      activation_23[0][0]              
____________________________________________________________________________________________________
bn3d_branch2b (BatchNormalizatio (None, 8, 8, 128)     512         res3d_branch2b[0][0]             
____________________________________________________________________________________________________
activation_24 (Activation)       (None, 8, 8, 128)     0           bn3d_branch2b[0][0]              
____________________________________________________________________________________________________
res3d_branch2c (Conv2D)          (None, 8, 8, 512)     66048       activation_24[0][0]              
____________________________________________________________________________________________________
bn3d_branch2c (BatchNormalizatio (None, 8, 8, 512)     2048        res3d_branch2c[0][0]             
____________________________________________________________________________________________________
add_8 (Add)                      (None, 8, 8, 512)     0           bn3d_branch2c[0][0]              
                                                                   activation_22[0][0]              
____________________________________________________________________________________________________
activation_25 (Activation)       (None, 8, 8, 512)     0           add_8[0][0]                      
____________________________________________________________________________________________________
res4a_branch2a (Conv2D)          (None, 4, 4, 256)     131328      activation_25[0][0]              
____________________________________________________________________________________________________
bn4a_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4a_branch2a[0][0]             
____________________________________________________________________________________________________
activation_26 (Activation)       (None, 4, 4, 256)     0           bn4a_branch2a[0][0]              
____________________________________________________________________________________________________
res4a_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_26[0][0]              
____________________________________________________________________________________________________
bn4a_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4a_branch2b[0][0]             
____________________________________________________________________________________________________
activation_27 (Activation)       (None, 4, 4, 256)     0           bn4a_branch2b[0][0]              
____________________________________________________________________________________________________
res4a_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_27[0][0]              
____________________________________________________________________________________________________
res4a_branch1 (Conv2D)           (None, 4, 4, 1024)    525312      activation_25[0][0]              
____________________________________________________________________________________________________
bn4a_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4a_branch2c[0][0]             
____________________________________________________________________________________________________
bn4a_branch1 (BatchNormalization (None, 4, 4, 1024)    4096        res4a_branch1[0][0]              
____________________________________________________________________________________________________
add_9 (Add)                      (None, 4, 4, 1024)    0           bn4a_branch2c[0][0]              
                                                                   bn4a_branch1[0][0]               
____________________________________________________________________________________________________
activation_28 (Activation)       (None, 4, 4, 1024)    0           add_9[0][0]                      
____________________________________________________________________________________________________
res4b_branch2a (Conv2D)          (None, 4, 4, 256)     262400      activation_28[0][0]              
____________________________________________________________________________________________________
bn4b_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4b_branch2a[0][0]             
____________________________________________________________________________________________________
activation_29 (Activation)       (None, 4, 4, 256)     0           bn4b_branch2a[0][0]              
____________________________________________________________________________________________________
res4b_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_29[0][0]              
____________________________________________________________________________________________________
bn4b_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4b_branch2b[0][0]             
____________________________________________________________________________________________________
activation_30 (Activation)       (None, 4, 4, 256)     0           bn4b_branch2b[0][0]              
____________________________________________________________________________________________________
res4b_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_30[0][0]              
____________________________________________________________________________________________________
bn4b_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4b_branch2c[0][0]             
____________________________________________________________________________________________________
add_10 (Add)                     (None, 4, 4, 1024)    0           bn4b_branch2c[0][0]              
                                                                   activation_28[0][0]              
____________________________________________________________________________________________________
activation_31 (Activation)       (None, 4, 4, 1024)    0           add_10[0][0]                     
____________________________________________________________________________________________________
res4c_branch2a (Conv2D)          (None, 4, 4, 256)     262400      activation_31[0][0]              
____________________________________________________________________________________________________
bn4c_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4c_branch2a[0][0]             
____________________________________________________________________________________________________
activation_32 (Activation)       (None, 4, 4, 256)     0           bn4c_branch2a[0][0]              
____________________________________________________________________________________________________
res4c_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_32[0][0]              
____________________________________________________________________________________________________
bn4c_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4c_branch2b[0][0]             
____________________________________________________________________________________________________
activation_33 (Activation)       (None, 4, 4, 256)     0           bn4c_branch2b[0][0]              
____________________________________________________________________________________________________
res4c_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_33[0][0]              
____________________________________________________________________________________________________
bn4c_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4c_branch2c[0][0]             
____________________________________________________________________________________________________
add_11 (Add)                     (None, 4, 4, 1024)    0           bn4c_branch2c[0][0]              
                                                                   activation_31[0][0]              
____________________________________________________________________________________________________
activation_34 (Activation)       (None, 4, 4, 1024)    0           add_11[0][0]                     
____________________________________________________________________________________________________
res4d_branch2a (Conv2D)          (None, 4, 4, 256)     262400      activation_34[0][0]              
____________________________________________________________________________________________________
bn4d_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4d_branch2a[0][0]             
____________________________________________________________________________________________________
activation_35 (Activation)       (None, 4, 4, 256)     0           bn4d_branch2a[0][0]              
____________________________________________________________________________________________________
res4d_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_35[0][0]              
____________________________________________________________________________________________________
bn4d_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4d_branch2b[0][0]             
____________________________________________________________________________________________________
activation_36 (Activation)       (None, 4, 4, 256)     0           bn4d_branch2b[0][0]              
____________________________________________________________________________________________________
res4d_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_36[0][0]              
____________________________________________________________________________________________________
bn4d_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4d_branch2c[0][0]             
____________________________________________________________________________________________________
add_12 (Add)                     (None, 4, 4, 1024)    0           bn4d_branch2c[0][0]              
                                                                   activation_34[0][0]              
____________________________________________________________________________________________________
activation_37 (Activation)       (None, 4, 4, 1024)    0           add_12[0][0]                     
____________________________________________________________________________________________________
res4e_branch2a (Conv2D)          (None, 4, 4, 256)     262400      activation_37[0][0]              
____________________________________________________________________________________________________
bn4e_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4e_branch2a[0][0]             
____________________________________________________________________________________________________
activation_38 (Activation)       (None, 4, 4, 256)     0           bn4e_branch2a[0][0]              
____________________________________________________________________________________________________
res4e_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_38[0][0]              
____________________________________________________________________________________________________
bn4e_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4e_branch2b[0][0]             
____________________________________________________________________________________________________
activation_39 (Activation)       (None, 4, 4, 256)     0           bn4e_branch2b[0][0]              
____________________________________________________________________________________________________
res4e_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_39[0][0]              
____________________________________________________________________________________________________
bn4e_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4e_branch2c[0][0]             
____________________________________________________________________________________________________
add_13 (Add)                     (None, 4, 4, 1024)    0           bn4e_branch2c[0][0]              
                                                                   activation_37[0][0]              
____________________________________________________________________________________________________
activation_40 (Activation)       (None, 4, 4, 1024)    0           add_13[0][0]                     
____________________________________________________________________________________________________
res4f_branch2a (Conv2D)          (None, 4, 4, 256)     262400      activation_40[0][0]              
____________________________________________________________________________________________________
bn4f_branch2a (BatchNormalizatio (None, 4, 4, 256)     1024        res4f_branch2a[0][0]             
____________________________________________________________________________________________________
activation_41 (Activation)       (None, 4, 4, 256)     0           bn4f_branch2a[0][0]              
____________________________________________________________________________________________________
res4f_branch2b (Conv2D)          (None, 4, 4, 256)     590080      activation_41[0][0]              
____________________________________________________________________________________________________
bn4f_branch2b (BatchNormalizatio (None, 4, 4, 256)     1024        res4f_branch2b[0][0]             
____________________________________________________________________________________________________
activation_42 (Activation)       (None, 4, 4, 256)     0           bn4f_branch2b[0][0]              
____________________________________________________________________________________________________
res4f_branch2c (Conv2D)          (None, 4, 4, 1024)    263168      activation_42[0][0]              
____________________________________________________________________________________________________
bn4f_branch2c (BatchNormalizatio (None, 4, 4, 1024)    4096        res4f_branch2c[0][0]             
____________________________________________________________________________________________________
add_14 (Add)                     (None, 4, 4, 1024)    0           bn4f_branch2c[0][0]              
                                                                   activation_40[0][0]              
____________________________________________________________________________________________________
activation_43 (Activation)       (None, 4, 4, 1024)    0           add_14[0][0]                     
____________________________________________________________________________________________________
res5a_branch2a (Conv2D)          (None, 2, 2, 512)     524800      activation_43[0][0]              
____________________________________________________________________________________________________
bn5a_branch2a (BatchNormalizatio (None, 2, 2, 512)     2048        res5a_branch2a[0][0]             
____________________________________________________________________________________________________
activation_44 (Activation)       (None, 2, 2, 512)     0           bn5a_branch2a[0][0]              
____________________________________________________________________________________________________
res5a_branch2b (Conv2D)          (None, 2, 2, 512)     2359808     activation_44[0][0]              
____________________________________________________________________________________________________
bn5a_branch2b (BatchNormalizatio (None, 2, 2, 512)     2048        res5a_branch2b[0][0]             
____________________________________________________________________________________________________
activation_45 (Activation)       (None, 2, 2, 512)     0           bn5a_branch2b[0][0]              
____________________________________________________________________________________________________
res5a_branch2c (Conv2D)          (None, 2, 2, 2048)    1050624     activation_45[0][0]              
____________________________________________________________________________________________________
res5a_branch1 (Conv2D)           (None, 2, 2, 2048)    2099200     activation_43[0][0]              
____________________________________________________________________________________________________
bn5a_branch2c (BatchNormalizatio (None, 2, 2, 2048)    8192        res5a_branch2c[0][0]             
____________________________________________________________________________________________________
bn5a_branch1 (BatchNormalization (None, 2, 2, 2048)    8192        res5a_branch1[0][0]              
____________________________________________________________________________________________________
add_15 (Add)                     (None, 2, 2, 2048)    0           bn5a_branch2c[0][0]              
                                                                   bn5a_branch1[0][0]               
____________________________________________________________________________________________________
activation_46 (Activation)       (None, 2, 2, 2048)    0           add_15[0][0]                     
____________________________________________________________________________________________________
res5b_branch2a (Conv2D)          (None, 2, 2, 512)     1049088     activation_46[0][0]              
____________________________________________________________________________________________________
bn5b_branch2a (BatchNormalizatio (None, 2, 2, 512)     2048        res5b_branch2a[0][0]             
____________________________________________________________________________________________________
activation_47 (Activation)       (None, 2, 2, 512)     0           bn5b_branch2a[0][0]              
____________________________________________________________________________________________________
res5b_branch2b (Conv2D)          (None, 2, 2, 512)     2359808     activation_47[0][0]              
____________________________________________________________________________________________________
bn5b_branch2b (BatchNormalizatio (None, 2, 2, 512)     2048        res5b_branch2b[0][0]             
____________________________________________________________________________________________________
activation_48 (Activation)       (None, 2, 2, 512)     0           bn5b_branch2b[0][0]              
____________________________________________________________________________________________________
res5b_branch2c (Conv2D)          (None, 2, 2, 2048)    1050624     activation_48[0][0]              
____________________________________________________________________________________________________
bn5b_branch2c (BatchNormalizatio (None, 2, 2, 2048)    8192        res5b_branch2c[0][0]             
____________________________________________________________________________________________________
add_16 (Add)                     (None, 2, 2, 2048)    0           bn5b_branch2c[0][0]              
                                                                   activation_46[0][0]              
____________________________________________________________________________________________________
activation_49 (Activation)       (None, 2, 2, 2048)    0           add_16[0][0]                     
____________________________________________________________________________________________________
res5c_branch2a (Conv2D)          (None, 2, 2, 512)     1049088     activation_49[0][0]              
____________________________________________________________________________________________________
bn5c_branch2a (BatchNormalizatio (None, 2, 2, 512)     2048        res5c_branch2a[0][0]             
____________________________________________________________________________________________________
activation_50 (Activation)       (None, 2, 2, 512)     0           bn5c_branch2a[0][0]              
____________________________________________________________________________________________________
res5c_branch2b (Conv2D)          (None, 2, 2, 512)     2359808     activation_50[0][0]              
____________________________________________________________________________________________________
bn5c_branch2b (BatchNormalizatio (None, 2, 2, 512)     2048        res5c_branch2b[0][0]             
____________________________________________________________________________________________________
activation_51 (Activation)       (None, 2, 2, 512)     0           bn5c_branch2b[0][0]              
____________________________________________________________________________________________________
res5c_branch2c (Conv2D)          (None, 2, 2, 2048)    1050624     activation_51[0][0]              
____________________________________________________________________________________________________
bn5c_branch2c (BatchNormalizatio (None, 2, 2, 2048)    8192        res5c_branch2c[0][0]             
____________________________________________________________________________________________________
add_17 (Add)                     (None, 2, 2, 2048)    0           bn5c_branch2c[0][0]              
                                                                   activation_49[0][0]              
____________________________________________________________________________________________________
activation_52 (Activation)       (None, 2, 2, 2048)    0           add_17[0][0]                     
____________________________________________________________________________________________________
avg_pool (AveragePooling2D)      (None, 1, 1, 2048)    0           activation_52[0][0]              
____________________________________________________________________________________________________
flatten_1 (Flatten)              (None, 2048)          0           avg_pool[0][0]                   
____________________________________________________________________________________________________
fc6 (Dense)                      (None, 6)             12294       flatten_1[0][0]                  
====================================================================================================
Total params: 23,600,006
Trainable params: 23,546,886
Non-trainable params: 53,120
____________________________________________________________________________________________________


最后,运行下面的代码以可视化您的ResNet50。您也可以通过转到“文件 - >打开... - > model.png”下载模型的.png图片。

plot_model(model, to_file='model.png')
SVG(model_to_dot(model).create(prog='dot', format='svg'))

您应该记住的: 
- 非常深的“普通”网络在实践中不起作用,因为它们由于渐变消失而难以训练。
- 跳过连接有助于解决消失梯度问题。它们还使ResNet块可以轻松学习身份功能。 
- 有两种主要类型的块:标识块和卷积块。 
- 通过将这些块堆叠在一起来构建非常深的剩余网络。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值