FizzBuzz

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

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

# One-hot encode the desired outputs: [number, "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):#[str(i), "fizz", "buzz", "fizzbuzz"]为一个列表,里面有4个元素,对应为四类,可用索引来访问return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]for i in range(1,16):print(fizz_buzz_decode(i, fizz_buzz_encode(i)))

定义模型的输入与输出(训练数据)

import numpy as np
import torchNUM_DIGITS = 10# Represent each input by an array of its binary digits.
def binary_encode(i, num_digits):return np.array([i >> d & 1 for d in range(num_digits)])trX = torch.Tensor([binary_encode(i, NUM_DIGITS) for i in range(101, 2 ** NUM_DIGITS)])
trY = torch.LongTensor([fizz_buzz_encode(i) for i in range(101, 2 ** NUM_DIGITS)])

用pyTorch定义模型

# Define the model
NUM_HIDDEN = 100
model = torch.nn.Sequential(torch.nn.Linear(NUM_DIGITS, NUM_HIDDEN),torch.nn.ReLU(),torch.nn.Linear(NUM_HIDDEN, 4)
)

定义损失函数和优化器

loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(), lr = 0.05)

模型训练代码

# Start training it
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]#predicty_pred = model(batchX) #forward passloss = loss_fn(y_pred, batchY)#optimizer,3 stepsoptimizer.zero_grad()  #clear gradloss.backward()  #backward passoptimizer.step()  #gradient descent# Find loss on training dataloss = loss_fn(model(trX), trY).item()print('Epoch:', epoch, 'Loss:', loss)

用cpu跑的损失函数值还行,一般

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

用训练好的模型尝试在1到100这些数字上玩FizzBuzz游戏

# Output now
testX = torch.Tensor([binary_encode(i, NUM_DIGITS) for i in range(1, 101)])
with torch.no_grad():testY = model(testX)
predictions = zip(range(1, 101), list(testY.max(1)[1].data.tolist()))print([fizz_buzz_decode(i, x) for (i, x) in predictions])

tips:with torch.no_grad(),测试时每个tensor都带有grad,为了优化参数,测试时不需要grad;否则徒占memory,还易爆。

1到10个错3个,11到20全对……

参考https://blog.csdn.net/u013075024/article/details/104365933

FizzBuzz(二)相关推荐

  1. 2019-1-25-Python-Exercise

    layout: post date: 2019-01-25 00:00:00 author: "Katsu" title: python小练习 PythonExercises 一些 ...

  2. FizzBuzz与写代码的“一万”个细节

    摘要: 技术是由一万个细节组成的,哪怕一个这么简单的题目,也有如此多的点.我也不敢说自己是什么高手,起码写了许多年代码,也就把自己写代码的思维展示给大家,希望对有心人有所帮助. 非初学者向,虽然题是个 ...

  3. JavaScript 编程精解 中文第三版 二、程序结构

    二.程序结构 原文:Program Structure 译者:飞龙 协议:CC BY-NC-SA 4.0 自豪地采用谷歌翻译 部分参考了<JavaScript 编程精解(第 2 版)> A ...

  4. 条形码?二维码?生成、解析都在这里!

    二维码生成与解析 一.生成二维码 二.解析二维码 三.生成一维码 四.全部的代码 五.pom依赖 直接上代码: 一.生成二维码 public class demo {private static fi ...

  5. 【ReactiveX】基于Golang pmlpml/RxGo程序包的二次开发

    基于Golang pmlpml/RxGo程序包的二次开发[阅读时间:约20分钟] 一.ReactiveX & RxGo介绍 1.ReactiveX 2.RxGo 二.系统环境&项目介绍 ...

  6. 2022-2028年中国二次供水产业发展动态及投资战略规划报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水行业市场行业相关概述.中国二次供 ...

  7. 2022-2028年中国二次供水设备行业研究及前瞻分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国二次供水设备行业市场行业相关概述.中国二 ...

  8. OpenCV 笔记(08)— 二维点、三维点、基于 Mat 的 std::vector 等常用数据结构的定义和输出

    1. 定义和输出二维点 Point2f p2(3, 4);cout << "[二维点] is "<< endl << p2 << e ...

  9. python内置库之学习ctypes库(二)

    ctypes库踩坑日记2 一.自己实现一个dll文件,再用python的ctypes库调用思路1更清晰 二.生成dll文件 三.ctypes库调用 一.自己实现一个dll文件,再用python的cty ...

最新文章

  1. 1组合逻辑电路--多路选择器与多路分解器
  2. 【深度学习】模型训练教程之Focal Loss调参和Dice实现
  3. 旋转动画 rotate
  4. linux efi不要boot目录,LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项-Go语言中文社区...
  5. Spring MVC在参数绑定前通过Filter过滤器改变请求参数的值
  6. java序列化异常_Java|序列化异常StreamCorruptedException的解决方法
  7. easyexcel 导出设置标题_GitHub - niaobulashi/easy-excel: excel实现导入导出配置型通用方法项目...
  8. nginx源码阅读 ---- Event模块和配置的初始化
  9. Silverlight中Shape,Geometry
  10. 计算机将图像数字化的原理,图像数字化
  11. vue echarts在中国地图让某个省份凸起
  12. Meshlab的基本使用
  13. workgroup无法访问.您可能没有权限 完美问答解
  14. Python:求列表的最大数以及下标
  15. 疯了!一个rm-rf把公司整个数据库删没了...
  16. 云收呗api接口免费开放
  17. 计算机网络TCP拥塞控制窗口大小变化、重传、滑动窗口、流量控制等
  18. Mingw + msys编译libmono.so
  19. 云端课堂未能连接到服务器,云端课堂如何登录?详细步骤、流程介绍
  20. 2021年中山大学计算机专业学硕复试线,2021中山大学研究生分数线一览表(含2019-2020历年复试)...

热门文章

  1. eclipse的桌面图标怎么设置。
  2. 【Android自动化测试】Ui Automator技术(以对QQ软件自动发说说为例)
  3. Cocos2d-x之3D
  4. CSRF(Cross-site request forgery)跨站请求伪造详解(好文章,美团技术团队)
  5. iOS入门-27图片墙
  6. Qt 文件按时间先后排序 删除
  7. 流数据分析技术笔记1 流数据简介
  8. python三维图俯视图,python opencv 前视图转化为鸟瞰图
  9. 子群-抽象代数【密码学数学基础】
  10. 识别车牌号码demo php,Android车牌识别 Demo 源码 能识别蓝色和黄色车牌的OCR android版本...