• 学习日记(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还是学会了一点东西,

  • 相关阅读:
    OSX中zsh新增环境变量
    新的开始 春光明媚
    tmux
    继承
    6
    Object类
    网页收藏
    画王八
    ES6 语法之import export
    ES6 语法 之 destructuring
  • 原文地址:https://www.cnblogs.com/Eldq/p/12430954.html
Copyright © 2020-2023  润新知