当前位置:   article > 正文

FizzBuzz(二)

fizzbuzz

FizzBuzz

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

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

  1. # One-hot encode the desired outputs: [number, "fizz", "buzz", "fizzbuzz"]
  2. def fizz_buzz_encode(i):
  3.     if   i % 15 == 0: return 3
  4.     elif i % 5  == 0: return 2
  5.     elif i % 3  == 0: return 1
  6.     else:             return 0
  7.     
  8. def fizz_buzz_decode(i, prediction):
  9.     
  10.     #[str(i), "fizz", "buzz", "fizzbuzz"]为一个列表,里面有4个元素,对应为四类,可用索引来访问
  11.     return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]
  12. for i in range(1,16):
  13. print(fizz_buzz_decode(i, fizz_buzz_encode(i)))

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

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

pyTorch定义模型

  1. # Define the model
  2. NUM_HIDDEN = 100
  3. model = torch.nn.Sequential(
  4. torch.nn.Linear(NUM_DIGITS, NUM_HIDDEN),
  5. torch.nn.ReLU(),
  6. torch.nn.Linear(NUM_HIDDEN, 4)
  7. )

 定义损失函数和优化器

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

 模型训练代码

  1. # Start training it
  2. BATCH_SIZE = 128
  3. for epoch in range(10000):
  4. for start in range(0, len(trX), BATCH_SIZE):
  5. end = start + BATCH_SIZE
  6. batchX = trX[start:end]
  7. batchY = trY[start:end]
  8. #predict
  9. y_pred = model(batchX) #forward pass
  10. loss = loss_fn(y_pred, batchY)
  11. #optimizer,3 steps
  12. optimizer.zero_grad() #clear grad
  13. loss.backward() #backward pass
  14. optimizer.step() #gradient descent
  15. # Find loss on training data
  16. loss = loss_fn(model(trX), trY).item()
  17. print('Epoch:', epoch, 'Loss:', loss)

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

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

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

  1. # Output now
  2. testX = torch.Tensor([binary_encode(i, NUM_DIGITS) for i in range(1, 101)])
  3. with torch.no_grad():
  4. testY = model(testX)
  5. predictions = zip(range(1, 101), list(testY.max(1)[1].data.tolist()))
  6. 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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/162803
推荐阅读
相关标签
  

闽ICP备14008679号