用paddle实现一个CNN神经网络

 

问题:实现在MNIST数据集上,对数字的识别。

 

分析:

(1)输入:MNIST手写的数字图片,它是一个28*28的二维图片,为了计算,我们将其转为784维的一个向量。

(2)输出:分类器的输出是0-9的数字的概率。

(3)分类器的设计:5层的卷积神经网络。即:conv->pool->conv->pool->FC->softmax



 

 

代码如下:

"""
    定义卷积神经网络分类器:
        输入的二维图像,经过两个卷积-池化层,使用以softmax为激活函数的全连接层作为输出层
    Args:
        img -- 输入的原始图像数据
    Return:
        predict -- 分类的结果
    """
    # Your Code Begin:
    # 第一个卷积-池化层
    conv_pool_1=paddle.networks.simple_img_conv_pool(
        input=img,
        filter_size=5,
        num_filters=20,
        num_channel=1,
        pool_size=2,
        pool_stride=2,
        act=paddle.activation.Relu()
    )
    # 第二个卷积-池化层
    conv_pool_2=paddle.networks.simple_img_conv_pool(
        input=conv_pool_1,
        filter_size=5,
        num_filters=50,
        num_channel=20,
        pool_size=2,
        pool_stride=2,
        act=paddle.activation.Relu()
    )
    # 全连接层
    predict = paddle.layer.fc(
        input=conv_pool_2,
        size=10,
        act=paddle.activation.Softmax()
    )
    # Your Code End:
    return predict

 

下面是完整代码:

 

#!/usr/bin/env python
# -*- coding:utf-8 -*-

"""
    Authors: xiake(kedou1993@163.com)
    Date:    2017/11/29

    使用paddle框架实现逻辑数字识别案例,关键步骤如下:
    1.定义分类器网络结构
    2.初始化
    3.配置网络结构
    4.定义成本函数cost
    5.定义优化器optimizer
    6.定义事件处理函数
    7.进行训练
    8.利用训练好的模型进行预测
"""

import os
import numpy as np
from PIL import Image

import matplotlib
matplotlib.use('Agg')

import paddle.v2 as paddle
from paddle.v2.plot import Ploter

LEARNING_STEP = 0

# 绘图相关标注
TRAIN_TITLE_COST = "Train cost"
TEST_TITLE_COST = "Test cost"

TRAIN_TITLE_ERROR = "Train error rate"
TEST_TITLE_ERROR = "Test error rate"
  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,以下是一个使用PaddlePaddle框架构建的卷积神经网络的代码: ``` import paddle # 定义卷积神经网络 class CNN(paddle.nn.Layer): def __init__(self): super(CNN, self).__init__() # 定义卷积层和池化层 self.conv1 = paddle.nn.Conv2D(in_channels=1, out_channels=16, kernel_size=5, stride=1, padding=2) self.pool1 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) self.conv2 = paddle.nn.Conv2D(in_channels=16, out_channels=32, kernel_size=5, stride=1, padding=2) self.pool2 = paddle.nn.MaxPool2D(kernel_size=2, stride=2) # 定义全连接层 self.fc1 = paddle.nn.Linear(in_features=32*7*7, out_features=128) self.fc2 = paddle.nn.Linear(in_features=128, out_features=10) def forward(self, x): x = self.conv1(x) x = paddle.nn.functional.relu(x) x = self.pool1(x) x = self.conv2(x) x = paddle.nn.functional.relu(x) x = self.pool2(x) x = paddle.flatten(x, start_axis=1, stop_axis=-1) x = self.fc1(x) x = paddle.nn.functional.relu(x) x = self.fc2(x) return x # 定义训练过程 def train(model): # 定义数据集和数据加载器 train_dataset = paddle.vision.datasets.MNIST(mode='train') val_dataset = paddle.vision.datasets.MNIST(mode='test') train_loader = paddle.io.DataLoader(train_dataset, batch_size=64, shuffle=True) val_loader = paddle.io.DataLoader(val_dataset, batch_size=64, shuffle=False) # 定义优化器和损失函数 optimizer = paddle.optimizer.Adam(learning_rate=0.001, parameters=model.parameters()) criterion = paddle.nn.CrossEntropyLoss() # 训练模型 epochs = 10 for epoch in range(epochs): for i, (inputs, labels) in enumerate(train_loader): # 前向传播 outputs = model(inputs) loss = criterion(outputs, labels) # 反向传播和更新参数 optimizer.clear_grad() loss.backward() optimizer.step() # 打印训练信息 if (i+1) % 100 == 0: print("Epoch [{}/{}], Step [{}/{}], Loss: {:.4f}" .format(epoch+1, epochs, i+1, len(train_loader), loss.numpy()[0])) # 在验证集上测试模型 correct = 0 total = 0 for inputs, labels in val_loader: outputs = model(inputs) _, predicted = paddle.max(outputs, axis=1) total += labels.shape[0] correct += (predicted == labels).sum().numpy()[0] accuracy = 100 * correct / total print("Epoch [{}/{}], Val Accuracy: {:.2f}%".format(epoch+1, epochs, accuracy)) # 创建模型并进行训练 model = CNN() train(model) ``` 以上代码实现一个简单的卷积神经网络,用于手写数字识别任务。您可以根据自己的需求进行修改和调整。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值