学习日记(3.6)

Part1.教会模型玩一个叫做 fizz buzz的游戏

我们的小游戏

游戏规则:两个人一起数数,如果遇到可以被3整除的数 不说这个数字说fizz,而遇到可以被5整除的数字说buzz,遇到既可以被3又可以被5整除的数字说fizzbuzz
编程代码如下:

def fizz_buzz_encode(i):
    if i%15==0: return 3
    if i%5==0: return 2   
    if i%3==0: return 1
    else: return 0

def fizz_buzz_decode(i,prediction):
    return [str(i),"fizz","buzz","fizzbuzz"][prediction]
    #根据预测值返回其在list中检索得到的值入prediction=0返回该数字,为1返回fizz。

def helper(i):
    print(fizz_buzz_decode(i,fizz_buzz_encode(i)))
for i in range(1,16):
    
    helper(i)

在这里插入图片描述

教模型玩小游戏

我们搭建这个模型的时候依旧是昨天的五步走原则
1.define input and output
2,define a model
3.define loss function
4.optimize this model
5train the model
现在我们来搭建一下这个模型:

import numpy as np
import torch
NUM_DIGITS=10
#函数的功能是把一个10进制数字
def binary_encode(i,num_digits):
    #把一个10进制数转成2进制数,并且将答案逆序输出
    return np.array([i >> d& 1 for d in range(num_digits)[::-1]])
#define input and output
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)])
NUM_HIDDEN=100
#define a model
model=torch.nn.Sequential(
    torch.nn.Linear(NUM_DIGITS,NUM_HIDDEN),
    torch.nn.ReLU(),
    torch.nn.Linear(NUM_HIDDEN,4)
)
#define a loss function
loss_fn=torch.nn.CrossEntropyLoss()#4分类问题
#optim the model
optimizer=torch.optim.Adam(model.parameters(),lr=0.01)

#train the model
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]
        #Forward pass
        y_pred=model(batchX)
        loss=loss_fn(y_pred,batchY)
        print("Epoch",epoch,loss.item())
        
        optimizer.zero_grad()
        #Backward pass
        loss.backward()
        optimizer.step()
#define test date 把(1,100)作为我们的测试数据
testX=torch.Tensor([binary_encode(i,NUM_DIGITS) for i in range(1,101)])
with torch.no_grad():
    testY=model(testX)
#取出数值最大也就是训练效果最好的作为结果
predictions=zip(range(0,101),testY.max(1)[1])
#让我们的模型来玩这个游戏打印出他的结果
print([fizz_buzz_decode(i,x)for i ,x in predictions])

结果如下:
在这里插入图片描述
原计划训练10000轮的,每次训练一次其实要计算4次,因为一开始输出层的维度是4电脑一共要跑四万次,跑了9907轮停下来了,难为了我的CUP了.我们看看model玩的怎么样:
在这里插入图片描述
emmm情况不是太好,model还是会出错,可能是网络深度不够,就当是我这个初学者跟着网课做的一个小实验。
下面代码的一些解读展示:
用binary_encode 打印出32和1023二进制数的逆序答案
在这里插入图片描述
展示一下测试集数据X的shape,我们把1024个数据的前一百作为test集,所以测试集是 92310维度的tensor
在这里插入图片描述
展示一下测试集数据Y的shape,我们把1024个数据的前一百作为test集,所以测试集是 923
1维度的tensor,毕竟y是标签,只有一个。
在这里插入图片描述
尽管效果不是太好,但是我们的model还是学会了一点东西,

posted on 2020-03-06 21:17  那我先走了  阅读(206)  评论(0编辑  收藏  举报

导航