学习日记(3.6)
Posted eldq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学习日记(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集,所以测试集是 9231维度的tensor,毕竟y是标签,只有一个。
尽管效果不是太好,但是我们的model还是学会了一点东西,
以上是关于学习日记(3.6)的主要内容,如果未能解决你的问题,请参考以下文章