在BSV上运行深度神经网络

news2025/4/12 6:20:37

我们已经实现了一个用于手写数字分类的深度神经网络。已经训练好的模型完全在链上运行。它使用手写数字的 MNIST 数据集进行离线训练。该模型采用 28x28 灰度像素的图像并输出 09 的数字。

在这里插入图片描述

深度神经网络简介

人工神经网络是受生物神经网络启发而构建的。网络通过接触大量带标签的数据示例来学习。这个过程也称为监督学习。

该网络由几个组件组成:神经元/节点、连接、偏差和激活函数。这些组件被连续分组到层中。第一层称为“输入层”,数据通过该层传入网络,最后一层称为“输出层”,网络通过该层返回其输出。一个非常简单的神经网络只包含这两层。为了提高性能,我们可以在两者之间添加一个或多个“隐藏层”。具有隐藏层的网络称为“深度神经网络”(DNN)。

在这里插入图片描述

深度神经网络的图示

网络中神经元之间的每个连接都用特定值加权。每个神经元还有一个称为“偏差”的值,该值会添加到其输入的总和中。学习是找到一组这些权重和偏差的过程,这样网络将在给定一些输入的情况下返回有意义的输出。

为了直观地了解深层神经网络的工作原理,我们建议您观看有关该主题的短视频系列。

网络架构

MNIST 手写数字的 DNN 由 784 (28 x 28) 个节点的输入层、64 个节点的隐藏层和 10 个节点的输出层(可能的类/数字的数量)组成。这些层都是全连接的,这使得网络总共包含 501760 (784 * 64 * 10) 个连接。

在这里插入图片描述

隐藏层中的节点使用 ReLU 激活函数。 Argmax 用于输出节点以获得正确的值,即分类的数字。

训练模型

DNN 使用 Keras 进行训练。通过我们概述的网络架构并使用 RMSprop 优化器进行训练,该模型能够在 50 个时期后达到 98% 的分类准确率。


import numpy as np
from tensorflow import keras
from tensorflow.keras import layers


# Model / data parameters
num_pixels = 28 * 28
num_nodes_hl = 64
num_classes = 10

batch_size = 469
epochs = 50

# Load the data and split it between train and test sets.
(x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data()

# Reshape images to [784, 1] and scale them to the [0, 1] range.
x_train = x_train.reshape(x_train.shape[0], num_pixels).astype("float32") / 255
x_test = x_test.reshape(x_test.shape[0], num_pixels).astype("float32") / 255

# Model
model = keras.Sequential([layers.Dense(num_nodes_hl, activation="relu"),
                          layers.Dense(num_classes, activation="softmax")
                         ]) 

model.compile(loss="sparse_categorical_crossentropy", optimizer="rmsprop", metrics=["accuracy"])

model.fit(x_train, y_train, batch_size=batch_size, epochs=epochs, validation_split=0.1)

训练模型后,必须以我们可以在 sCrypt 智能合约中使用的格式来导出权重和偏差。出于性能原因,我们将这些值编码为 bytes 字节,而不是数组。

实现

我们已经实现了上面的 DNN,类似于我们之前实现的单层神经网络(又名感知器)。完整的代码可以在 GitHub 上找到。

import "../train/modelParams.scrypt";


library Model {

    static function applyWeights0(int[ModelParams.N_INPUTS] in) : int[ModelParams.N_NODES_HL] {
        int[ModelParams.N_NODES_HL] res = repeat(0, ModelParams.N_NODES_HL);

        loop (ModelParams.N_NODES_HL) : i {
	        int sum = 0;
            loop (ModelParams.N_INPUTS) : j {
		        sum += (ModelParams.getWeight0(i, j) * in[j]) / 100000000;
            }
	        res[i] = sum;
        }

        return res;
    }

    static function applyWeights1(int[ModelParams.N_NODES_HL] in) : int[ModelParams.N_NODES_OUT] {
        int[ModelParams.N_NODES_OUT] res = repeat(0, ModelParams.N_NODES_OUT); 

        loop (ModelParams.N_NODES_OUT) : i {
            int sum = 0;
            loop (ModelParams.N_NODES_HL) : j {
                sum += (ModelParams.getWeight1(i, j) * in[j]) / 100000000;
            }
            res[i] = sum;
        }

        return res;
    }

    static function addBiases0(int[ModelParams.N_NODES_HL] in) : int[ModelParams.N_NODES_HL] {
        int[ModelParams.N_NODES_HL] res = repeat(0, ModelParams.N_NODES_HL); 

        loop (ModelParams.N_NODES_HL) : i {
            res[i] = in[i] + ModelParams.getBias0(i);
        }

        return res;
    }

    static function addBiases1(int[ModelParams.N_NODES_OUT] in) : int[ModelParams.N_NODES_OUT] {
        int[ModelParams.N_NODES_OUT] res = repeat(0, ModelParams.N_NODES_OUT); 

        loop (ModelParams.N_NODES_OUT) : i {
            res[i] = in[i] + ModelParams.getBias1(i);
        }

        return res;
    }

    static function applyReLU(int[ModelParams.N_NODES_HL] in) : int[ModelParams.N_NODES_HL] {
        int[ModelParams.N_NODES_HL] res = repeat(0, ModelParams.N_NODES_HL); 

        loop (ModelParams.N_NODES_HL) : i {
            int inVal = in[i];
            if (inVal > 0) {
                res[i] = inVal;
            }
        }

        return res;
    }

    static function predict(int[ModelParams.N_INPUTS] inputs) : int {
        int[ModelParams.N_NODES_HL] step0 = applyWeights0(inputs);
        int[ModelParams.N_NODES_HL] step1 = addBiases0(step0);
        int[ModelParams.N_NODES_HL] step2 = applyReLU(step1);
        int[ModelParams.N_NODES_OUT] step3 = applyWeights1(step2);
        int[ModelParams.N_NODES_OUT] step4 = addBiases1(step3);

        int idxMaxVal = 0;
        int maxVal = step4[0];
        loop (ModelParams.N_NODES_OUT) : i {
            int outVal = step4[i];
            if (outVal > maxVal) {
                idxMaxVal = i;
                maxVal = outVal;
            }
        }

        return idxMaxVal;
    }

}

函数 predict() 接受输入层的初始值。在我们的例子中,这是手写图像的序列化值。它返回一个代表分类结果的整数,即图像上的数字。

因为 sCrypt 不支持原生浮点数,所以我们通过简单地将值缩放 10⁸ 来使用定点表示。例如,0.86758491 变成整数 86758491。当将两个值相乘时,我们重新缩放结果,即除以 10⁸。

潜在用例

像这样的 DNN 可以在智能合约中以多种方式使用。例如,您可以训练模型以一定的准确度识别图像中是否包含热狗。鼓励用户在互联网上搜索此类照片,并自动通过提交这些照片获得比特币小额支付。可以收集这些照片来训练模型并提高其准确性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100342.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[附源码]计算机毕业设计Python的小说阅读系统(程序+源码+LW文档)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等…

智云通CRM:如何正确的提出报价?(一)

智云通CRM认为完成销售包括三个步骤:提出报价,解决最后问题,讨论下一步方案。 第一步是提出报价,首先我们讨论如何将提出报价。 在与客户讨论费用问题时,我们应当向客户提出两个不同报价,一个销售方案对应…

前缀和与差分算法

目录 一 前缀和 算法定义 算法分类 算法作用 一维前缀和 问题引入 暴力法: 前缀和法: 算法原理 问题解答 算法实践 江山白日梦 题目描述 题目解答 二维前缀和 问题引入 算法原理 问题解答 二 差分 算法定义 算法分类 算法作用 一…

torch.chunk与nn.Conv2d groups

torch.chunk 切分 假如特征x大小为:32x64x224x224 (BxCxHxW) q torch.chunk(x, 8, dim1) x是要切分的特征,8是要切分成几块,dim是指定切分的维度,这里等于1,就是按通道切分 就会将其按照通道,切分为8块&a…

【服务器数据恢复】服务器双循环riad5数据恢复案例

服务器数据恢复环境: 一台使用NTFS文件系统的服务器; 7块硬盘组成了一组raid5磁盘阵列。 服务器故障&初检: raid5磁盘阵列磁盘故障离线导致服务器瘫痪。用户在处理掉线磁盘时只添加新的硬盘rebuild,并没有将掉线的3块硬盘从阵…

CARLA在Windows上的安装与运行

0.写在前面 其实官方文档写的很详细,所有细节都有涉及,不过暂时没有中文版。本文写作目的,一个是作为自己的操作笔记,二个是帮助一些更习惯看中文版本的一些朋友 https://carla.readthedocs.io/en/latest/start_quickstart/ 这是…

Sentinel-1产品定义与产品格式(CSDN_0001_20220904)

(文章编号:CSDN_0001_20220904) 目录 1. 概述 1.1 地球物理测量 1.2 极化 1.3 干涉 2. 产品级别和产品类型 2.1 Level-0 2.2 Level-1 2.1.1 SLC 2.1.2 GRD 2.2 Level-2 3. 产品文件 3.1 组织结构 3.1.1 Annotation measuremen…

MySQL(十二):阿里巴巴 MySQL binlog 增量订阅消费Canal组件

https://github.com/alibaba/canal 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备Canal 服务器准备Canal Client测试 基于 Binlog实现跨系统实时数据同步 更换数据库实现比对和补偿程序 安全地实现数据备份和恢复 使用 Binlog 实时更新Redis缓存 Mysql 服务器准备 查看当…

毫米波电路的PCB设计和加工(第一部分)

毫米波应用要点——相位精度受许多变量影响 从自动驾驶车辆上使用的防碰雷达系统到第五代(5G)高数据速率新无线(NR)网络技术,毫米波(mmWave)电路的应用领域正在快速增长。许多应用正在促进工作…

锐浪报表 Grid++Report 导出其它格式文件

锐浪报表 GridReport 导出其它格式文件 GridReport控件设计的报表,不仅可以打印,还可以导出8种格式的报表文件。 在GridReport的打印浏览中,有指定导出文件的对话框: 但是,软件的设计中,往往需要设计出&am…

黑*头条_第5章_延迟任务精准发布文章(新版)

黑*头条_第5章_延迟任务精准发布文章(新版) 文章目录黑*头条_第5章_延迟任务精准发布文章(新版)1)文章定时发布2)延迟任务概述2.1)什么是延迟任务2.2)技术对比2.2.1)DelayQueue2.2.2)RabbitMQ实现延迟任务2.2.3)redis实现3)redis实现延迟任务4)延迟任务服务实现4.1)搭建heima-l…

༺ཌ༈学编程到底学那种语言呢?༈ད༻

说到底,编程语言只是工具,就像螺丝刀一样。在需要使用圆头螺丝刀的时候,你就不能一意孤行使用一字螺丝刀。你需要根据实际的情况做决定。没有任何一种编程语言能够取代一切,成为终极编程语言。你需要根据当前岗位的要求&#xff0…

分布式数据库中间件Mycat介绍

从Cobar到Mycat,从闭源到开源,作为一个开源的分布式数据库中间件,Mycat已经被众多开源项目使用。本文简要介绍下Mycat的特性、基本架构以及分库分表和读写分离的配置。 1、Mycat基本介绍 Mycat是一个开源的分布式数据库中间件,前…

nodejs+vue044高校学生信息管理系统

大学生信息综合管理系统分三个身份登录,一个学生,一个管理员。学生只能修改密码,而管理员可以修改任何信息。老师可以查看自己的课表和校园活动. 管理员模块主要有老师管理,添加老师,班级管理,班级添加&…

[附源码]Python计算机毕业设计Django文具商城购物系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

Educational Codeforces Round 140

C. Count Binary Strings 大意: 要求满足条件的01串的个数 要求如下 给定一个上三角矩阵,对于矩阵的元素i,j,a[i][j]有一下三个取值: 1:i-j之间只能有一种元素 2:i-j之间只能有两种元素 0: i-j之间无所谓 思路…

(Week 7)动态规划(C++)

目录[NOIP2005 普及组] 采药(C,动态规划)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示解题思路:最长上升子序列(C,Dilworth,贪心)题目描述输入格式输出格式样例 #1样…

一文盘点Zebec生态的收益模型

随着加密市场逐渐陷入低谷,曾经火热的NFT、GameFi等赛道都陷入了沉寂。投资者目前很难在加密市场中获得可观的收益,而在整体加密市场发展局势不明朗的情况下,行业目前缺乏发展动力。 目前,以流支付为主要定位的Zebec生态&#xff…

Java 基础语法

一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作。下面简要介绍下类、对象、方法和实例变量的概念。 对象:对象是类的一个实例,有状态和行为。例如,一条狗是一个对象,它的状态有&a…

Tomcat 9.0 安装及配置教程(win10系统)

一、前言 Tomcat 服务器是一个开源的轻量级Web应用服务器,在中小型系统和并发量小的场合下被普遍使用,是开发和调试Servlet、JSP 程序的首选。 二、安装前准备 1.确保安装过jdk,安装过可跳过。 如果没有安装可以先安装一下win10下JDK 官方中…