誰も教えてくれないblog

お絵描きとかグラブルとか

Kohya_ssでLoRA学習させようとしてエラーを吐く

Kohya_ssを用いてLoRAの学習をさせようとしていたら次のようなエラーを吐いた。

 

File "■\module.py", line 1671, in load_state_dict
    raise RuntimeError('Error(s) in loading state_dict for {}:\n\t{}'.format(
RuntimeError: Error(s) in loading state_dict for UNet2DConditionModel:
        size mismatch for down_blocks.0.attentions.0.transformer_blocks.0.attn2.to_k.weight: copying a param with shape torch.Size([320, 768]) from checkpoint, the shape in current model is torch.Size([320, 1024]).
 ~
Traceback (most recent call last):
  File "■\runpy.py", line 196, in _run_module_as_main

    raise subprocess.CalledProcessError(returncode=process.returncode, cmd=cmd)

 

結論はソースモデルにv2のチェックが入っていたことだった。えぇ…

ちなみに、たぶんこれを見に来た人は次でまた止まると思うので…

note.com

このページを参考に…

dreamboothのPlease configure some concepts.エラーについて

stable diffusionでdreamboothのWebUIを使って学習させようとしたら「Please configure some concepts.」と出るが解決方法が調べても分からなかったので記載。

 

結論から言えば自分はDataset Directoryのパス指定で\を/にしたら動いた。あーそういう。

あとパス指定を絶対パスではなく相対パスにする必要があった。(Windowsではこのstable-diffusion-webuiフォルダはLinux内のフォルダ奥深くに眠っているのでstable-diffusion-webuiで検索をかけて探し出す)

 

というのもModel SelectionのところのLoaded Modelを見ると

/stable-diffusion-webui/models/dreambooth/

と書いてあるので、要するにここに表記を合わせれば行けるんじゃね?と思ったら案の定行けた感じだ。

絶対パス指定する方法を知っていたら教えて欲しい

CustomBlockerでTwitterのトレンド欄を消す

CustomBlockerとはなんぞや

Twitterを見ていて、「トレンド欄」や「おすすめユーザー」の欄を要らないと思ったことはないだろうか?

トレンド欄の方はブロックしている人の記事すら貫通して載せてくるし、おすすめユーザーはもう動いてないアカウントを平気でおすすめしてくる。正直、要らないのにTwitter側で消すことは出来ない。

 

そこで便利なのはChrome拡張機能であるCustomBlockerである。

chrome.google.com

これはwebページの条件に合った要素を強制的に排除できる。ただし、使い方がやや難しい。

 

CustomBlockerを設定する

①入れ終わったら、Twitterのトレンド欄など消したい欄で右クリックし、検証を押す。②消したい要素がブルーアウトするElements欄を右クリックし、Copy→Copy Xpathを押す。これで、ここを指している要素(Xpath)を抽出できた。

拡張機能のボタンを押し、新しいルールを作成を押す。

④隠す要素をXpathにチェックを入れ、欄に先ほどコピーしたXpathを貼り付け。(Ctrl+v)

このままだとホームでしか隠せなくなってしまうので、URL欄をhttps://twitter.com/*」に変更し、正規表現で指定にチェックを入れる。無条件で隠すを押す。

⑤同様のことをおすすめユーザー欄でも行う。

f:id:GinMei182:20220213151355p:plain

①検証を押す

f:id:GinMei182:20220213151647p:plain

②Copy Xpathを押す様子

f:id:GinMei182:20220213152104j:plain

③新しいルールを作成する様子

f:id:GinMei182:20220213152440j:plain

Xpathを指定する様子

f:id:GinMei182:20220213153004j:plain

⑤すっきりした様子

これで、ウザったいトレンド欄ともおさらば。

応用すれば、「○○さんがいいねしました」のような出さなくていいツイートも排除できる。

Minecraftウィザーリアクター① 実験炉を作ろう!

Minecraftでトップクラスに危険な建物とは何だろう?

 

答えはウィザーを利用した建造物。

ウィザーの利用価値としては、あらゆるブロックの破壊が可能なこと。例えばMinecraftバニラで、理論上唯一の全自動木材回収装置が作れる存在である(もっとも植えるのは手動だろうが)。

 

そんなロマン建造物の原型を作ってみよう。

f:id:GinMei182:20200611225255p:plain

 

まずはウィザーについて知ろう

 ウィザーはあまりの危険さ故にその特性があまり知られていない。

 実はウィザーはかなりおとなしい生物なのだ。激しく動くイメージがあるかもしれないが、ヤバい状態はモブと敵対状態になった時に限られる

 しかもウィザーの探知範囲はかなり狭く、およそ16マス程度。安全を考慮するなら20マス離れていれば、ウィザーに探知されることはない。また、視界をブロックで遮られていれば非常に近くまで行っても敵対することはない。

 つまり、敵対状態にさえしなければ、このような2段の内側に向かう水流でウィザーを固定できる。

f:id:GinMei182:20200611230440p:plain

しかし、ウィザーの立つ部分は必要なので、そこは自動再生壁で作る必要がある。

実験炉作り

f:id:GinMei182:20200611231148p:plain

どのような型でも構わないからこのような2×2の縦型の全自動再生壁を作る必要がある。

例えば次のように溶岩を配置し、水を流した上で、溶岩に蓋をする。

f:id:GinMei182:20200611231526p:plain

f:id:GinMei182:20200611231353p:plain

ピストンを横から見て、下のように回路を作ると2×2のピストンが同時に動く。

f:id:GinMei182:20200611231715p:plain

後は適当なクロック回路を作りオンオフする信号を入れてやる。

f:id:GinMei182:20200611232011p:plain

あとは全自動壁の上に水流を作った後、ブロックを破壊すれば完成だ。

 

このように下からウィザーを眺めていても襲われることはない。

 

f:id:GinMei182:20200611232339p:plain

 

攻撃範囲と検知範囲の差からウィザーローズの採取も可能だ。

次はこの建造物を生かしていこう。

 

 

 

 

 

えもふりでVtuberの真似事をする⑦ キー入力で表情を変える2

前回までの状態だとウィンドウが非アクティブになると表情が動かせなくなってしまう。

今回は改善を行っていこう。

f:id:GinMei182:20200522182347p:plain

https://github.com/Elringus/UnityRawInput

からUnityRawInputを落としてAsets内へ入れる。

これで準備が整った。

 

あとはtest3内をこう書き換える。

 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityRawInput;

public class Test3 : MonoBehaviour
{
public EmotePlayer targetPlayer;
public float time;

 


// Start is called before the first frame update
void Start()
{
if (targetPlayer == null)
targetPlayer = this.GetComponent(typeof(EmotePlayer)) as EmotePlayer;
time=600;

}

private void OnEnable()
{
//バックグラウンドの時もキー入力を受け付ける
RawKeyInput.Start( true );
RawKeyInput.OnKeyUp += OnKeyUp ;
RawKeyInput.OnKeyDown += OnKeyDown;
}


// キーが離された時の動作
private void OnKeyUp( RawKey key )
{
Debug.Log( "OnKeyUp: " + key );

}

// キーが押された時の動作
private void OnKeyDown( RawKey key )
{
Debug.Log( "OnKeyDown: " + key );

if (RawKeyInput.IsKeyDown(RawKey.A)) {targetPlayer.mainTimelineLabel="sample_驚00";
time=240;
}
if (RawKeyInput.IsKeyDown(RawKey.S)) {targetPlayer.mainTimelineLabel="sample_楽00";
time=240;
}
if (RawKeyInput.IsKeyDown(RawKey.D)) {targetPlayer.mainTimelineLabel="微笑";
time=240;
}
if (RawKeyInput.IsKeyDown(RawKey.W)) {targetPlayer.mainTimelineLabel="考える";
time=240;
}

}

// Update is called once per frame
void Update()
{
if (time>1) time--;
else targetPlayer.mainTimelineLabel="動作リセット";

}
}

 

動いたからこれでよし。なんか色々変な気はするけど。