bizzbuzz pytorch 这个游戏不适合机器学习

# -*- coding: utf-8 -*-
"""
Created on Sat May 22 09:55:44 2021

@author: lwf
"""

import torch
import numpy as np

#对数值进行fizzbuzz编码0,%3,%5,%15>>>0,1,2,3>>>0,fizz, buzz,fizzbuzz
def fizzbuzz_encode(i):
    if i % 15 == 0:
        return 3
    if i % 5 == 0:
        return 2
    if i % 3 == 0:
        return 1
    else:
        return 0
# 对编码数值进行解码 0,1,2,3>>>0,fizz, buzz,fizzbuzz
def fizzbuzz_decode(i):
    out = [str(i),"fizz","buzz","fizzbuzz"][i]
    return out
# 对数值转为2进制,并为np数组,长度为num_digits
def binary_encode(i,num_digits):
    a = np.array([int(d) for d in list(bin(i)[2:])])
    b = np.append(np.zeros(num_digits-len(a),dtype=np.long),a)
    return b
#训练数据 X,转换成2进制
trX = torch.tensor([binary_encode(i,10) for i in range(101,1001)],dtype=torch.float32)
#训练数据Y,转为数字编码
trY = torch.tensor([fizzbuzz_encode(i) for i in range(101,1001)],dtype=torch.long)
#建立模型
model = torch.nn.Sequential(
    torch.nn.Linear(10,100),
    torch.nn.ReLU(),
    torch.nn.Linear(100,4)
    )
#损失函数及优化器
loss_fn = torch.nn.CrossEntropyLoss()
optimizer = torch.optim.SGD(model.parameters(),lr = 0.1)
#训练
for  i in range(10000):
    preY =model(trX)
    loss =loss_fn(preY,trY)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
print("Loss",loss)


# 保存及读取
# # torch.save(model,r'C:\Users\lwf\Documents\Python Scripts\神经网络\fizzbuzz.pkl')
## model =torch.load(r'C:\Users\lwf\Documents\Python Scripts\神经网络\fizzbuzz.pkl')
# 被测数据
startnumber = 1
stopnumer = 101
testX = torch.tensor([binary_encode(i,10) for i in range(startnumber,stopnumer)],dtype=torch.float32)
# 被测数据结果,取概率最大值的位置作为结果即0,1,2,3>>>0,fizz, buzz,fizzbuzz
testY = model(testX).argmax(dim=1)
#对结果进行编码,测试原值,fizz, buzz,fizzbuzz
a = []
for i in range(stopnumer-startnumber):
    if testY.numpy()[i] == 0:
        a.append(i+startnumber)
    else:
        a.append(fizzbuzz_decode(testY.numpy()[i]))
# 计算正确率
duide = 0
for i in range(startnumber,stopnumer):
    if fizzbuzz_encode(i) == testY.numpy()[i-startnumber]:
        duide +=1
        
print (duide/(stopnumer-startnumber))
    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值