神经网络实现FizzBuzz

作者: 风中逍锋 | 来源:发表于2020-10-07 15:58 被阅读0次

此神经网络的代码是在python语言环境下实现的,同时使用pytorch深度学习框架
FizzBuzz是一个简单的小游戏。游戏规则如下:从1开始往上数数,当遇到3的倍数的时候,说fizz,当遇到5的倍数,说buzz,当遇到15的倍数,就说fizzbuzz,其他情况下则正常数数。

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

1.不使用神经网络方式实现此小游戏

# One-hot encode the desired outputs: [number, "fizz", "buzz", "fizzbuzz"]
def fizz_buzz_encode(i):
    if   i % 15 == 0: return 3
    elif i % 5  == 0: return 2
    elif i % 3  == 0: return 1
    else:             return 0
    
def fizz_buzz_decode(i, prediction):
    return [str(i), "fizz", "buzz", "fizzbuzz"][prediction]

print(fizz_buzz_decode(1, fizz_buzz_encode(1)))
print(fizz_buzz_decode(2, fizz_buzz_encode(2)))
print(fizz_buzz_decode(5, fizz_buzz_encode(5)))
print(fizz_buzz_decode(12, fizz_buzz_encode(12)))
print(fizz_buzz_decode(15, fizz_buzz_encode(15)))

2.使用神经网络方式训练此小游戏

#定义模型的输入与输出(训练数据)
import numpy as np
import torch

NUM_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)])


# Define the model  用PyTorch定义模型
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_SIZE
        batchX = trX[start:end]
        batchY = trY[start:end]

        y_pred = model(batchX)
        loss = loss_fn(y_pred, batchY)

        optimizer.zero_grad()
        loss.backward()
        optimizer.step()

    # Find loss on training data
    loss = loss_fn(model(trX), trY).item()
    print('Epoch:', epoch, 'Loss:', loss)


# 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])
print(np.sum(testY.max(1)[1].numpy() == np.array([fizz_buzz_encode(i) for i in range(1,101)])))
testY.max(1)[1].numpy() == np.array([fizz_buzz_encode(i) for i in range(1,101)])

相关文章

  • 神经网络实现FizzBuzz

    此神经网络的代码是在python语言环境下实现的,同时使用pytorch深度学习框架FizzBuzz是一个简单的小...

  • TDD和重构练习-FizzBuzz Sprint 3 - 集成测

    FizzBuzz Sprint 3 Product backlog集成测试 步骤分解 实现主程序 创建Main类和...

  • 记录一些遇到不会的算法题

    一.题目描述 实现 fizzBuzz 函数,参数 num 与返回值的关系如下:1、如果 num 能同时被 3 和 ...

  • FizzBuzz

    题目: 写一个程序打印1到100这些数字。但是遇到数字为3的倍数的时候,打印“Fizz”替代数字,5的倍数用“Bu...

  • FizzBuzz

    在学习ruby的过程中,我们有一道作业题https://leetcode.com/problems/fizz-bu...

  • FizzBuzz

    问题 你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是: ...

  • Rust 实例

    Writing an (Overly) Idiomatic Fizzbuzz with Rust[https://...

  • TDD FizzBuzz

    FizzBuzz 说明 Write a program that prints the numbers from ...

  • 编码kata,再探FizzBuzz

    上一期kata,我们以责任链模式重构了FizzBuzz,相比原有代码,采用设计模式后,实际上将FizzBuzz中的...

  • 测试技术培训-TDD-FizzBuzz

    1 什么是FizzBuzz FizzBuzz是一个非常适合各种场景使用的编程题目,也被各路大佬推荐用于TDD的教学...

网友评论

    本文标题:神经网络实现FizzBuzz

    本文链接:https://www.haomeiwen.com/subject/jmifpktx.html