2019-12-18 (We)
_ PyTorch で RNN
やっとできた。ついでに GPU に載せた。
#!/usr/bin/env python
import torch
import numpy as np
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
import math
import random
import matplotlib.pyplot as plt
hidden_size = 8
seqlen = 8
batch_size = 128
n_epoch = 1000
N_PIE = 128
N_ROUND = 16
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.rnn = nn.RNN(input_size=2, hidden_size=hidden_size, batch_first=True)
self.fc1 = nn.Linear(hidden_size, 2)
def forward(self, x):
h0 = torch.zeros(1, x.size(0), hidden_size).to('cuda')
output, hn = self.rnn(x, h0)
x = self.fc1(output[:,x.size(1) - 1,:])
return x
net = Net().to('cuda')
criterion = nn.MSELoss()
optimizer = optim.SGD(net.parameters(), lr=0.1, momentum=0.9)
def calc_point(no, noisy):
theta = math.pi * 2 / N_PIE * no
x = math.cos(theta)
y = math.sin(theta)
if noisy:
x += random.random() * 0.4 - 0.2
y += random.random() * 0.4 - 0.2
return (x, y)
def make_seq(beg, size, noisy=False):
seq = [ calc_point(no, noisy) for no in range(beg, beg + size) ]
return (seq, calc_point(beg + size, noisy))
inputs = []
expecteds = []
for i in range(N_PIE * N_ROUND):
seq, expected = make_seq(i, seqlen, True)
expecteds.append(expected)
inputs.append(seq)
inputs = torch.tensor(inputs).to('cuda')
expecteds = torch.tensor(expecteds).to('cuda')
for epoch in range(n_epoch):
perm = torch.randperm(inputs.size(0)).to('cuda')
beg = 0
while beg + batch_size < inputs.size(0):
batch = perm[beg:beg+batch_size]
# zero the parameter gradients
optimizer.zero_grad()
# forward + backward + optimize
outputs = net(inputs[batch])
loss = criterion(outputs, expecteds[batch])
loss.backward()
optimizer.step()
beg += batch_size
print(epoch, loss.item())
print('Training finished.')
seq, _ = make_seq(0, seqlen)
xs = []
ys = []
for n in range(1024):
outputs = net(torch.tensor([seq]).to('cuda'))
x = outputs[0][0].item()
y = outputs[0][1].item()
print('%.4f %.4f' % (x, y))
xs.append(x)
ys.append(y)
seq = seq[1:]
seq.append([x, y])
plt.plot(xs, ys)
plt.savefig('test.png')
円周を N_PIE
個に分割し、seqlen
個の連続した点から次の点を予測する。
古い点を捨てながら新しい点を追加しながらこれを連続してやれば、
綺麗な円が描けるはず。
というプログラム。結果は↓これ。
若干歪んでるけど、できた。 むしろ、何周もしてるはずなのに線が多重に見えないのが不思議なくらい。 何か間違ってるのか?
GPU 使用率は 25% くらい。低すぎる。
で、これではまだ私のやりたいことができてないので、更に続く。
↓次回用メモ。
_ TE-D01g 快調
昨日書いた、TE-D01g の問題。
類似機種の症例報告の中で、妙なものがあった。
白点滅になってるやつを、充電器の左右反対側に一旦置くと、治ったという。
えー? なんだそりゃ… と思いつつ、昨夜、私も試してみた。
それ以来、快調。
意味わからん…
[ツッコミを入れる]
2022-12-18 (Su)
_ 原神
「伽藍に落ちて」クリア。
名前付けイベント、この中にあったのね。なるほど。
っつっても、名前なんてそう簡単に思いつかないので、 手持ちの中から付けておいた。
アイテムがあるので、1回は変更できる、ってことかな。 親切設計やな。
[ツッコミを入れる]
2023-12-18 (Mo)
_ 原神
水曜から綾華ガチャが始まるわけだが…
天井80として、綾華ガチャ始まるまでに、天井4回分にちょっと足りない。 十数連くらい足りない。ガチャ期間の間に貯まりそうな感じ。 そもそも、80 行くまでに一人出てくれることを祈りたいが…
[ツッコミを入れる]
2024-12-18 (We)
_ 鳴潮 - 音骸収集
星の少なかった音骸を集中的に収集しなおし。
新しい音骸を吸収しても、星が変わらないことがあった。 成功率パラメータがあるので、失敗したのか?
datadock Lv11。 星4が吸収できるようになったみたい? いや、データドックは英語では Data Bank なのか。ほえー
アンドリアスみたいなのが倒せない…
[ツッコミを入れる]