吴恩达471机器学习入门课程2第1周——手写数字识别(0和1)

用于手写数字识别的神经网络(0和1)

使用神经网络来识别手写数字 0 和 1。

问题描述

在这个练习中,您将使用神经网络来识别手写数字“0”和“1”。这是一个二元分类任务。
自动手写数字识别在今天被广泛使用——从识别邮件信封上的邮政编码到识别银行支票上写的金额。
在未来的任务中,您将扩展此网络以识别所有10个数字(0-9)。

这个练习将向您展示如何使用您所学的方法来完成这个分类任务。

1.导入模块

import numpy as np
import tensorflow as tf
from tensorflow.python import keras
from keras.models import Sequential
from keras.layers import Dense
import matplotlib.pyplot as plt
from autils import *
%matplotlib inline

import logging
logging.getLogger("tensorflow").setLevel(logging.ERROR)
tf.autograph.set_verbosity(0)

2. 数据集

您将从加载此任务的数据集开始。

  • 下面显示的load_data()函数将数据加载到变量Xy中。
  • 该数据集包含1000个手写数字1的训练示例,仅限于0和1。
    • 每个训练示例都是数字的20像素x 20像素灰度图像。
      • 每个像素由浮点数表示,表示该位置的灰度强度。
      • 20x20像素网格被“展开”为400维向量。
      • 每个训练示例成为我们的数据矩阵X中的一行。
      • 这给了我们一个1000 x 400的矩阵X,其中每一行都是手写数字图像的训练示例。
    • 训练集的第二部分是一个1000 x 1的向量y,它包含训练集的标签。
      • 如果图像是数字0,则y = 0,如果图像是数字1,则y = 1
x,y = load_data()

2.1 数据可视化

import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)


m, n = x.shape

fig, axes = plt.subplots(8,8, figsize=(8,8))
fig.tight_layout(pad=0.1)

for i,ax in enumerate(axes.flat):
    random_index = np.random.randint(1000)
    X_random_reshaped = x[random_index].reshape((20,20)).T
    ax.imshow(X_random_reshaped, cmap='gray')
    ax.set_title(f"id:{
     
     random_index},{
     
     y[random_index,0]}")
    ax.set_axis_off()

png

3 模型展示

您将在本作业中使用的神经网络如下图所示。

  • 三个全连接层,激活函数为sigmoid
    • 回想一下,我们的输入是数字图像的像素值。
    • 由于图像的大小为 20 × 20 20\times20 20×20,这给了我们 400 400 400 的输入
  • 这些参数的维度大小适用于神经网络,第 1 层神经元为 25个 ,第 2 层神经元为 15个,第 3 层输出层为 1 个神经元。
    • 回想一下,这些参数的尺寸确定如下:
      • 如果网络在一层中有 s i n s_{in} sin 单位,在下一层中有 s o u t s_{out} sout 单位,则
        • W W W▁的维数为▁ s i n ▁ × ▁ s o u t s_{in}▁\times▁s_{out} sin×sout
        • b b b 将是一个包含 s o u t s_{out} sout 元素的向量
    • 因此,Wb的形状是
      • layer1:W1的形状是(400,25),b1的形状是(25,)
      • layer2:W2的形状是(25,15),b2的形状是:(15,)
      • layer3: W3 的形状是 (15, 1) b3 的形状是: (1,)

Note: 偏置向量b可以表示为一维(n)或二维(n,1)数组。Tensorflow使用一维表示,本实验室将保持该约定。

下面,使用Keras顺序模型和具有sigmoid激活的密集层来构建上述网络。

tf.random.set_seed(1234)
model = Sequential(
    [
        tf.keras.Input(shape=(400,)),
        Dense(25,activation="sigmoid",name="layer1"),
        Dense(15,activation="sigmoid",name="layer2"),
        Dense(1,activation="sigmoid",name="layer3")
    ]
)
model.summary()
Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 layer1 (Dense)              (None, 25)                10025     
                                                                 
 layer2 (Dense)              (None, 15)                390       
                                                                 
 layer3 (Dense)              (None, 1)                 16        
                                                                 
=================================================================
Total params: 10,431
Trainable params: 10,431
Non-trainable params: 0
_________________________________________________________________
w1,b1 = model.get_layer('layer1').get_weights()
w2,b2 = model.get_layer('layer2').get_weights()
w3,b3 = model.get_layer('layer3').get_weights()
model.compile(
    loss=tf.keras.losses.BinaryCrossentropy(),
    optimizer= tf.keras.optimizers.Adam(learning_rate=0.001)
)
model.fit(
    x,y,
    epochs=20
)
Epoch 1/20
32/32 [==============================] - 1s 2ms/step - loss: 0.6223
Epoch 2/20
32/32 [==============================] - 0s 2ms/step - loss: 0.4593
Epoch 3/20
32/32 [==============================] - 0s 2ms/step - loss: 0.3129
Epoch 4/20
32/32 [==============================] - 0s 2ms/step - loss: 0.2148
Epoch 5/20
32/32 [==============================] - 0s 2ms/step - loss: 0.1557
Epoch 6/20
32/32 [==============================] - 0s 2ms/step - loss: 0.1193
Epoch 7/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0956
Epoch 8/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0787
Epoch 9/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0665
Epoch 10/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0571
Epoch 11/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0499
Epoch 12/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0440
Epoch 13/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0394
Epoch 14/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0355
Epoch 15/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0323
Epoch 16/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0297
Epoch 17/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0274
Epoch 18/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0255
Epoch 19/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0238
Epoch 20/20
32/32 [==============================] - 0s 2ms/step - loss: 0.0224





<keras.callbacks.History at 0x17a7a949ca0>

输入的是1000/time400数据,也就是说每个数据是400个像素点的灰度值。那预测也是输出400个像素点的灰度值

prediction = np.zeros(x.shape[0])
yhat = np.zeros(x.shape[0])
for i in range(x.shape[0]):
    prediction[i] = model.predict(x[i].reshape(1,400))
    if prediction[i] >0.5:
        yhat[i] = 1
    else:
        yhat[i] = 0
    print(f"num:{
     
     i},prediction:{
     
     prediction[i]},yhat:{
     
     yhat[i]}")
1/1 [==============================] - 0s 30ms/step
num:0,prediction:0.017245078459382057,yhat:0.0
1/1 [==============================] - 0s 31ms/step
num:1,prediction:0.017561491578817368,yhat:0.0
1/1 [==============================] - 0s 36ms/step
num:2,prediction:0.018371105194091797,yhat:0.0
1/1 [==============================] - 0s 28ms/step
num:3,prediction:0.016776276752352715,yhat:0.0
1/1 [==============================] - 0s 33ms/step
num:4,prediction:0.016123982146382332,yhat:0.0
1/1 [==============================] - 0s 35ms/step
num:5,prediction:0.01637193374335766,yhat:0.0
1/1 [==============================] - 0s 30ms/step
num:6,prediction:0.016457650810480118,yhat:0.0
1/1 [==============================] - 0s 29ms/step
num:7,prediction:0.022780779749155045,yhat:0.0
1/1 [==============================] - 0s 30ms/step
num:8,prediction:0.01629982516169548,yhat:0.0
1/1 [==============================] - 0s 29ms/step
num:9,prediction:0.01717321388423443,yhat:0.0
1/1 [==============================] - 0s 32ms/step
num:10,prediction:0.016451770439743996,yhat:0.0
1/1 [==============================] - 0s 36ms/step
num:11,prediction:0.0167677141726017,yhat:0.0
1/1 [==============================] - 0s 30ms/step
num:12,prediction:0.016313461586833,yhat:0.0
1/1 [==============================] - 0s 29ms/step
num:13,prediction:0.01943032070994377,yhat:0.0
1/1 [==============================] - 0s 32ms/step
num:14,prediction:0.01611424796283245,yhat:0.0
1/1 [==============================] - 0s 33ms/step
num:15,prediction:0.01825297810137272,yhat:0.0
1/1 [============
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

贰拾肆画生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值