TensorFlow Specialization Course 1学习笔记 Week 3

本篇笔记介绍使用卷积神经网络(CNN)实现服饰分类器的过程,通过添加卷积层和池化层,提高了分类器的准确率。演示了如何在TensorFlow中构建CNN模型,包括卷积层、池化层、全连接层的设置,以及模型训练和评估。同时,展示了卷积层和池化层的输出结果,解释了卷积层的优势:参数共享和稀疏连接。

TensorFlow Specialization Course 1学习笔记 Week 3

卷积神经网络实现服饰分类器

在上一个课程中,我们使用深度神经网络实现了一个服饰分类器。深度神经网络包含输入层、输出层和隐藏层。如何让我们的分类器准确率更高呢?这一次,我们使用卷积神经网络来实现我们的分类器,来看看效果如何。

我们在全连接层之前添加几个卷积层和池化层。卷积层用来提取图像中的特征,将提取到的特征信息传入全连接层相比直接将图像像素值传入全连接层,可以显著提高分类器的准确率。池化层用来压缩图像,同时保留图像的特征内容。

import tensorflow as tf
print(tf.__version__)
mnist = tf.keras.datasets.fashion_mnist
(training_images, training_labels), (test_images, test_labels) = mnist.load_data()

# 因为卷积层的输入需为一个张量,所以这样训练集和测试卷都需要reshape为一个四维的张量
# reshape前training_images为60000个28x28x1的元素在一个列表中,reshape后training_images为一个四维列表60000x28x28x1。
training_images=training_images.reshape(60000, 28, 28, 1)

training_images=training_images / 255.0
test_images = test_images.reshape(10000, 28, 28, 1)
test_images=test_images/255.0
model = tf.keras.models.Sequential([
  
  # 定义卷积层。64为需要生成的卷积数(卷积核的数量),(3,3)为卷积核的大小,激活函数使用relu
  # 每一个卷积核都会与输入卷积计算得到一个结果。输入为28x28x1,这里64个卷积核,则输出为26x26x64。
  tf.keras.layers.Conv2D(64, (3,3), activation='relu', input_shape=(28, 28, 1)),
  
  # MaxPooling层用来压缩图像,同时保留图像的特征内容
  # 尺度为(2,2)的池化层将图像大小压缩为原来的一半,上一层卷积层的输出为26x26x64
  # 经过这个池化层后,输出为13x13x64
  tf.keras.layers.MaxPooling2D(2, 2),
    
  tf.keras.layers.Conv2D(64, (3,3), activation='relu'),
  tf.keras.layers.MaxPooling2D(2,2),
  tf.keras.layers.Flatten(),
  tf.keras.layers.Dense(128, activation='relu'),
  tf.keras.layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
# 调用model.summary()方法,得到整个网络的基本信息,具体看下面输出
model.summary()
model.fit(training_images, training_labels, epochs=5)
test_loss = model.evaluate(test_images, test_labels)

model.summary()的输出如下

Model: "sequential_3"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv2d_6 (Conv2D)            (None, 26, 26, 64)        640       
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 13, 13, 64)        0         
_________________________________________________________________
conv2d_7 (Conv2D)            (None, 11, 11, 64)        36928     
_________________________________________________________________
max_pooling2d_5 (MaxPooling2 (None, 5, 5, 64)          0         
_________________________________________________________________
flatten_3 (Flatten)          (None, 1600)              0         
_________________________________________________________________
dense_6 (Dense)              (None, 128)               204928    
_________________________________________________________________
dense_7 (Dense)              (None, 10)                1290      
=================================================================
Total params: 243,786
Trainable params: 243,786
Non-trainable params: 0

使用了卷积神经网络的服饰分类器在训练11次迭代后,就可以在训练集上得到99.8%的准确率,在测试集上得到的99.1%准确率。

可视化卷积层和池化层的输出结果

输入测试集中前100个图像的标签。

print(test_labels[:100])

在上面的输出中,我们找到第0、23和28个的标签都是9,9代表鞋子。在下面的代码中,我们选择这三个都是鞋子的图像。

import matplotlib.pyplot as plt
f, axarr = plt.subplots(3,4)
FIRST_IMAGE=0
SECOND_IMAGE=23
THIRD_IMAGE=28
CONVOLUTION_NUMBER = 63
from tensorflow.keras import models
layer_outputs = [layer.output for layer in model.layers]
activation_model = tf.keras.models.Model(inputs = model.input, outputs = layer_outputs)
for x in range(0,4):
  f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[0,x].grid(False)
  f2 = activation_model.predict(test_images[SECOND_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[1,x].imshow(f2[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[1,x].grid(False)
  f3 = activation_model.predict(test_images[THIRD_IMAGE].reshape(1, 28, 28, 1))[x]
  axarr[2,x].imshow(f3[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')
  axarr[2,x].grid(False)

activation_model.predict()得到的结果是一个列表,包含神经网络的每一层输出结果。这里的for循环取得是第一个卷积层、第一个池化层、第二个卷积层和第二个池化层的结果,当x=0时,取第一个卷积层的输出结果。卷积或池化的结果都是有64个深度的,因为我们使用了64个卷积核。CONVOLUTION_NUMBER代表我们想要哪一个深度的结果。

举个例子,看for循环中这两行代码

f1 = activation_model.predict(test_images[FIRST_IMAGE].reshape(1, 28, 28, 1))[x]
axarr[0,x].imshow(f1[0, : , :, CONVOLUTION_NUMBER], cmap='inferno')

当x=0,CONVOLUTION_NUMBER=63,我们取第一个卷积层的输出结果:1x26x26x64,从中取出最后一个卷积核计算的结果1x26x26x1,并将它展示出来。

自己运行上面的代码,并不断修改参数来观察有趣的输出吧。

为什么使用卷积?

和只使用全连接层相比,卷积层的两个主要优势在于参数共享和稀疏连接。

直接使用全连接层的话,需要的参数会非常多。

参数共享:观察发现,特征检测入垂直边缘检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。整张图片共享特征检测器。

稀疏连接:第二个方法是使用稀疏连接,我来解释下。这个 0 是通过 3×3 的卷积计算得到的,它只 依赖于这个 3×3 的输入的单元格,右边这个输出单元(元素 0)仅与 36 个输入特征中 9 个 相连接。而且其它像素值都不会对输出产生任影响,这就是稀疏连接的概念。
WhyConv
神经网络可以通过这两种机制减少参数,以便我们用更小的训练集来训练它,从而预防过度拟合。你们也可能听过,卷积神经网络善于捕捉平移不变。通过观察可以发现,向右移动两个像素,图片中的猫依然清晰可见,因为神经网络的卷积结构使得即使移动几个像素,这张图片依然具有非常相似的特征,应该属于同样的输出标记。实际上,我们用同一个过滤器生成各层中,图片的所有像素值,希望网络通过自动学习变得更加健壮,以便更好地取得所期望的平移不变属性。


关于卷积神经网络的详细内容请看:https://blog.youkuaiyun.com/JSerenity/article/details/89330545

本笔记详细内容请看:https://github.com/lmoroney/dlaicourse/blob/master/Course 1 - Part 6 - Lesson 2 - Notebook.ipynb

课程地址:https://www.coursera.org/learn/introduction-tensorflow/

<think>我们正在查找吴恩达课程中关于浅层神经网络的代码实现,特别是GitHub或教程资源。根据用户提供的引用,我们知道课程中涉及浅层神经网络,并且引用[2]和引用[4]中提到了代码实战和具体代码解释。步骤:1.回顾引用内容:引用[2]提到了吴恩达《深度学习专项》笔记+代码实战(三):“浅度”神经网络,其中包含神经网络的定义、参数表示、计算方式、激活函数以及代码实战。引用[4]则给出了具体的代码解释,计算逻辑回归模型的损失函数。2.由于用户需要代码实现,我们可以从这些引用中提取信息,特别是引用[4]中给出的代码片段是关于损失函数计算的,但这只是神经网络的一部分。3.我们需要更完整的代码实现。通常,吴恩达的课程作业会包含完整的神经网络实现,包括前向传播、反向传播等。4.由于用户要求GitHub或教程,我们可以根据课程信息推荐GitHub上流行的吴恩达课程作业仓库,以及相关的教程博客。5.根据引用[1]和[3],课程是Coursera上的《MachineLearning》和《深度学习专项》(DeepLearningSpecialization)。浅层神经网络属于《深度学习专项》第一门课《神经网络和深度学习》的第三周内容。解决方案:我们可以提供以下资源:-官方课程链接(但用户需要注册,可能不是直接代码)-GitHub上热门的课程作业实现仓库-一些详细的教程博客,其中包含代码解析具体推荐:1.GitHub仓库:搜索“deeplearning.ai”或者“deeplearningspecialization”会出现很多作业实现的仓库。例如:-官方仓库:https://github.com/amanchadha/coursera-deep-learning-specialization(注意:官方可能不直接提供代码,但有很多学生分享)-一个非常流行的非官方仓库:https://github.com/Kulbear/deep-learning-coursera这个仓库包含了深度学习专项的作业代码。2.在Kulbear的仓库中,第一门课“NeuralNetworksandDeepLearning”的Week3作业就是浅层神经网络的实现。代码使用Python和numpy编写。3.教程方面,引用[2]和[4]就是来自博客的教程,我们可以提供类似的博客链接。但注意,引用[2]和[4]是用户已经提供的参考,我们可以推荐更多。4.另外,引用[3]是一个深度学习入门指南,也可能包含相关资源。因此,我们可以这样回答:根据您的要求,吴恩达深度学习专项课程中浅层神经网络的代码实现可以在以下资源中找到:1.**GitHub仓库推荐**:-[Kulbear/deep-learning-coursera](https://github.com/Kulbear/deep-learning-coursera):该仓库包含了深度学习专项课程的所有编程作业,其中第一门课第3周(Course1Week3)的作业就是浅层神经网络的实现,包括使用numpy构建一个单隐藏层的神经网络,用于二分类任务。-另一个仓库:[amanchadha/coursera-deep-learning-specialization](https://github.com/amanchadha/coursera-deep-learning-specialization)也包含了作业代码。2.**教程博客推荐**:-引用[2]提到的博客(可能是知乎、优快云等平台)详细解析了浅层神经网络的代码实现,包括前向传播、反向传播以及激活函数的选择等。-引用[4]的博客中给出了损失函数计算的代码片段,并进行了详细解释。由于引用[2]和[4]是用户已经提供的参考,我们可以直接建议用户查看这些引用中的博客,同时提供其他博客资源:-知乎专栏:有很多关于吴恩达课程的笔记和代码实现,例如搜索“吴恩达浅层神经网络代码”。-优快云博客:同样有很多详细的代码解析,例如搜索“吴恩达深度学习course1week3”。3.**官方资源**:-课程本身在Coursera平台(https://www.coursera.org/specializations/deep-learning)上,但需要购买才能访问编程作业。作业中会提供初始代码,学生需要完成关键部分。代码实现的主要部分通常包括:-初始化参数(随机初始化权重,零初始化偏置)-前向传播:计算线性部分和激活函数部分-计算成本函数-反向传播:计算梯度-更新参数(梯度下降)下面是一个简化的代码框架(基于Course1Week3作业),展示浅层神经网络的关键部分:```pythonimportnumpyasnpdefinitialize_parameters(n_x,n_h,n_y):#初始化权重和偏置W1=np.random.randn(n_h,n_x)*0.01b1=np.zeros((n_h,1))W2=np.random.randn(n_y,n_h)*0.01b2=np.zeros((n_y,1))parameters={"W1":W1,"b1":b1,"W2":W2,"b2":b2}returnparametersdefforward_propagation(X,parameters):#前向传播W1=parameters[&#39;W1&#39;]b1=parameters[&#39;b1&#39;]W2=parameters[&#39;W2&#39;]b2=parameters[&#39;b2&#39;]Z1=np.dot(W1,X)+b1A1=np.tanh(Z1)#隐藏层使用tanh激活函数Z2=np.dot(W2,A1)+b2A2=sigmoid(Z2)#输出层使用sigmoid激活函数cache={"Z1":Z1,"A1":A1,"Z2":Z2,"A2":A2}returnA2,cachedefcompute_cost(A2,Y):#计算成本函数m=Y.shape[1]logprobs=np.multiply(np.log(A2),Y)+np.multiply(np.log(1-A2),(1-Y))cost=-(1.0/m)*np.sum(logprobs)cost=np.squeeze(cost)#确保cost是标量returncostdefbackward_propagation(parameters,cache,X,Y):#反向传播m=X.shape[1]W1=parameters[&#39;W1&#39;]W2=parameters[&#39;W2&#39;]A1=cache[&#39;A1&#39;]A2=cache[&#39;A2&#39;]dZ2=A2-YdW2=(1.0/m)*np.dot(dZ2,A1.T)db2=(1.0/m)*np.sum(dZ2,axis=1,keepdims=True)dZ1=np.dot(W2.T,dZ2)*(1-np.power(A1,2))#因为tanh的导数为1-A1^2dW1=(1.0/m)*np.dot(dZ1,X.T)db1=(1.0/m)*np.sum(dZ1,axis=1,keepdims=True)grads={"dW1":dW1,"db1":db1,"dW2":dW2,"db2":db2}returngradsdefupdate_parameters(parameters,grads,learning_rate=0.01):#更新参数W1=parameters[&#39;W1&#39;]b1=parameters[&#39;b1&#39;]W2=parameters[&#39;W2&#39;]b2=parameters[&#39;b2&#39;]dW1=grads[&#39;dW1&#39;]db1=grads[&#39;db1&#39;]dW2=grads[&#39;dW2&#39;]db2=grads[&#39;db2&#39;]W1=W1-learning_rate*dW1b1=b1-learning_rate*db1W2=W2-learning_rate*dW2b2=b2-learning_rate*db2parameters={"W1":W1,"b1":b1,"W2":W2,"b2":b2}returnparameters```注意:上面的代码只是一个框架,实际作业中会有更详细的结构,比如将多个样本的向量化实现、迭代训练循环等。因此,我们推荐用户直接访问上述GitHub仓库获取完整代码,或者参考相关博客教程。相关问题:1.浅层神经网络中激活函数的选择有哪些?为什么隐藏层使用tanh而输出层使用sigmoid?2.如何调试神经网络的梯度(例如梯度检查)?3.浅层神经网络与逻辑回归模型的主要区别是什么?</think>以下是关于吴恩达课程中浅层神经网络代码实现的详细解答: ### 1. 官方课程资源 吴恩达《深度学习专项》第一课第三周"浅层神经网络"的完整代码实现可在以下资源获取: - **Coursera课程平台**:官方作业包含完整实现[^1][^3] ```python # 示例代码结构(参数初始化部分) def initialize_parameters(n_x, n_h, n_y): W1 = np.random.randn(n_h, n_x) * 0.01 b1 = np.zeros((n_h, 1)) W2 = np.random.randn(n_y, n_h) * 0.01 b2 = np.zeros((n_y, 1)) return {"W1": W1, "b1": b1, "W2": W2, "b2": b2} ``` - **课程笔记参考**:[神经网络概述](https://www.coursera.org/learn/neural-networks-deep-learning) 包含前向/反向传播实现细节[^1] ### 2. GitHub代码仓库 推荐以下高质量实现: 1. **[Kulbear/deep-learning-coursera](https://github.com/Kulbear/deep-learning-coursera)** - 包含完整课程作业(Course1 Week3) - 关键实现: ```python # 前向传播实现 Z1 = np.dot(W1, X) + b1 A1 = np.tanh(Z1) # 隐藏层激活函数 Z2 = np.dot(W2, A1) + b2 A2 = sigmoid(Z2) # 输出层激活函数 ``` 2. **[amanchadha/coursera-deep-learning-specialization](https://github.com/amanchadha/coursera-deep-learning-specialization)** - 带详细注释的Jupyter Notebook - 包含梯度检验和向量化实现 ### 3. 教程资源 1. **代码实战教程**:[吴恩达《深度学习》笔记(三) - 浅层神经网络](https://zhuanlan.zhihu.com/p/44391095) - 包含激活函数对比:`$ \sigma(z) = \frac{1}{1+e^{-z}} $` vs `$ \tanh(z) $` - 反向传播推导:`$ \frac{\partial \mathcal{L}}{\partial W^{[2]}} = \frac{1}{m} dZ^{[2]} A^{[1]T} $` 2. **可视化教程**:[浅层神经网络原理+代码详解](https://www.bilibili.com/video/BV1FT4y1E74V) - 包含参数初始化技巧演示 - 学习率影响的可视化分析 ### 4. 关键实现要点 根据引用[4]的损失函数实现: ```python def compute_cost(A2, Y): m = Y.shape[1] logprobs = np.multiply(np.log(A2), Y) + np.multiply(np.log(1-A2), 1-Y) cost = -np.sum(logprobs)/m return np.squeeze(cost) # 确保输出为标量[^4] ``` ### 注意事项 1. 激活函数选择: - 隐藏层推荐使用`tanh`或`ReLU` - 输出层二分类用`sigmoid` 2. 参数初始化: - 权重`W`需随机初始化(不可全零) - 偏置`b`可初始化为零[^2]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值