热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

02简单的两层神经网络FizzBuzz小游戏

FizzBuzz是一个简单的小游戏。游戏规则如下︰从1开始往上数数,当遇到3的倍数的时候,说fizz,当遇到5的倍数,说bu

FizzBuzz是一个简单的小游戏。游戏规则如下︰从1开始往上数数,当遇到3的倍数的时候,说fizz,当遇到5的倍数,说buzz,当遇到15的倍数,就说fizzbuzz,其他情况下则正常数数。



我们可以写一个简单的小程序来决定要返回正常数值还是fizz, buzz或者fizzbuzz。 


def fizz_buzz_encode(i):if i%15==0:return 3elif i%5==0:return 2elif i%3==0:return 1else:return 0def fizz_buzz_decode(i,prediction):return [str(i),'fizz','buzz','fizzbuzz'][prediction]def helper(i):print(fizz_buzz_decode(i,fizz_buzz_encode(i)))for i in range(1,10):helper(i)#输出结果
1
2
fizz
4
buzz
fizz
7
8
fizz

 但现在我们想机器自己学会玩这个游戏,所以定义一个神经网络。


我们首先定义模型的输入与输出(训练数据):
 

然后我们用PyTorch定义模型:


  • 为了让我们的模型学会FizzBuzz这个游戏,我们需要定义一个损失函数,和一个优化算法。
  • 这个优化算法会不断优化(降低)损失函数,使得模型的在该任务上取得尽可能低的损失值。
  • 损失值低往往表示我们的模型表现好,损失值高表示我们的模型表现差。
  • 由于FizzBuzz游戏本质上是一个分类问题,我们选用Cross Entropyy Loss函数。
  • 优化函数我们选用Stochastic Gradient Descent。

以下是模型的训练代码:

import numpy as np
import torchdef fizz_buzz_encode(i):if i % 15 == 0:return 3elif i % 5 == 0:return 2elif i % 3 == 0:return 1else:return 0def fizz_buzz_decode(i, prediction):return [str(i), 'fizz', 'buzz', 'fizzbuzz'][prediction]def helper(i):print(fizz_buzz_decode(i, fizz_buzz_encode(i)))#准备数据
NUM_DIGITS=10
def binary_encode(i,num_digits):#将数字转成二进制return np.array([i>>d & 1 for d in range(num_digits)][::-1])trX=torch.Tensor([binary_encode(i,NUM_DIGITS) for i in range(101,2**NUM_DIGITS)])#输入数据是一堆二进制串
trY=torch.Tensor([fizz_buzz_encode(i) for i in range(101,2**NUM_DIGITS)])#输出数据是对应的结果 0 1 2 3#然后用PyTorch定义模型
NUM_HIDDEN=100
model=torch.nn.Sequential(torch.nn.Linear(NUM_DIGITS,NUM_HIDDEN),torch.nn.ReLU(),torch.nn.Linear(NUM_HIDDEN,4)
)#该问题相当于四分类问题,常用的损失函数如下CrossEntropyLoss
loss_fn=torch.nn.CrossEntropyLoss()#交叉熵损失函数
optimizer=torch.optim.SGD(model.parameters(),lr=0.05)BATCH_SIZE = 128 # 一批数据
for epoch in range(10000):for start in range(0, len(trX), BATCH_SIZE):end = start + BATCH_SIZEbatchX = trX[start:end]batchY = trY[start:end]y_pred = model(batchX)loss = loss_fn(y_pred, batchY)print("Epoch", epoch, loss.item(), sep='\t')optimizer.zero_grad()loss.backward() # 后向传递optimizer.step() # 梯度下降#最后我们用训练好的模型尝试在1-100这些数字上玩FizzBuzz游戏
testX=torch.Tensor([binary_encode(i,NUM_DIGITS) for i in range(1,101)])
with torch.no_grad():#注意:在测试时候必须no_gradtestY=model(testX)
predictiOns=zip(range(1,101),list(testY.max(1)[1]))#因为拿到的是一行中是四个数据的可能性,所以拿出最大值
print([fizz_buzz_decode(i,x)for i,x in predictions])

推荐阅读
  • 颜色迁移(reinhard VS welsh)
    不要谈什么天分,运气,你需要的是一个截稿日,以及一个不交稿就能打爆你狗头的人,然后你就会被自己的才华吓到。------ ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 【论文】ICLR 2020 九篇满分论文!!!
    点击上方,选择星标或置顶,每天给你送干货!阅读大概需要11分钟跟随小博主,每天进步一丢丢来自:深度学习技术前沿 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 本文讨论了在使用pytorch进行二分类问题的模型预测时,为什么会出现概率大于1或小于0的情况,给出了相关代码和解决方法。同时,还介绍了使用pytorch进行模型训练和优化的步骤。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • 欢乐的票圈重构之旅——RecyclerView的头尾布局增加
    项目重构的Git地址:https:github.comrazerdpFriendCircletreemain-dev项目同步更新的文集:http:www.jianshu.comno ... [详细]
  • Learning to Paint with Model-based Deep Reinforcement Learning
    本文介绍了一种基于模型的深度强化学习方法,通过结合神经渲染器,教机器像人类画家一样进行绘画。该方法能够生成笔画的坐标点、半径、透明度、颜色值等,以生成类似于给定目标图像的绘画。文章还讨论了该方法面临的挑战,包括绘制纹理丰富的图像等。通过对比实验的结果,作者证明了基于模型的深度强化学习方法相对于基于模型的DDPG和模型无关的DDPG方法的优势。该研究对于深度强化学习在绘画领域的应用具有重要意义。 ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 关于如何快速定义自己的数据集,可以参考我的前一篇文章PyTorch中快速加载自定义数据(入门)_晨曦473的博客-CSDN博客刚开始学习P ... [详细]
  • 如何搭建服务器环境php(2023年最新解答)
    导读:本篇文章编程笔记来给大家介绍有关如何搭建服务器环境php的相关内容,希望对大家有所帮助,一起来看看吧。本文目录一览:1、怎么搭建p ... [详细]
author-avatar
天地菲人间_984
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有