COSUMIのサーバを3台から2台に減らします

かなり長い期間、COSUMIは専用サーバ3台で運用してきたのですが、これを7月末までに2台に減らします。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

3台目のサーバというのは、実質的にアクセスの多い時間帯の9路盤~13路盤のレベルの高い対局のためだけにあるようなものだったのですが、さすがにそのためだけに年40万+はちょっと辛いので、解約することにしました。本当はもう少し早い時期に行う予定だったのですが、コロナの影響でアクセスがかなり多くなっていたので、ここまで延期することになってしまいました。未だにアクセスは高止まりしたままなので、解約するのは正直かなり怖いのですが、もしもどうにもならないようなら、Amazon EC2辺りを特定の時間帯だけ使おうかなと考えています。今回解約するサーバは6年間以上借りてたみたいで、確かに初期費用も小さくはなかったですが、それでもそろそろ割高になってきそうなのも理由のひとつで、実はまだちゃんと調べてはいないのですが、以前ほどはEC2などに価格の優位性はないはずです。

ただ、一番理想的なのは、9路盤~13路盤はwhite shadeがごっそり受け持ってくれることで、これをなんとかしたいのですが、中途半端な誘導ではみなさんほとんど打ってくれないんですよね…(泣) 私の環境からだとほぼ問題ないのですが、動作しないことも多いのでしょうか? 月末までにいろいろよく考えてみます。

あと、これはかなり今更ですが、サーバのリソースがたっぷり余る時間帯は、逆にそれを贅沢に使ったなにかをやってみたい気もしています。

ナニゴケをアップデートしました (Ver. 1.4.0)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別するWEBアプリ
https://www.nanigoke.net/

今回は、判別可能な種に、「アカイチイゴケ」、「コモチフタマタゴケ」、「ジャバウルシゴケ」、「トサカホウオウゴケ」、「ナガサキホウオウゴケ」、「ナメリチョウチンゴケ」が追加されました。また、16400枚だったTrainのデータ数は、19600枚になっています。ネットワークの構造は、微調整程度の変更。TensorFlow.jsのバージョンは、最新の2系にしました(どう変わったのかはぜんぜん知らん(笑))。それから、学習データの水増しにおいての左右フリップを、20%だけ行うようにしました。これ、今まで私は絶対絶対絶対絶対やりたくなかったのですが、あまり自己満足だけを追い求めるのは、使ってくださる方たちに悪い気がして、今回少し妥協しました。でも、今後は少しずつ割合を減らしていって、いつかはまた0%に戻したいと思います(「じゃないとダメ」って苔が言ってるような気がする…)。ちなみに、詳しく調べたわけではありませんが、今回ロスがぐっと減ってて少しムカついています(笑)。

その他、今回はさまざまな細かい修正をいれているのですが、主なものだけ列挙しておくと、まず、iOSからファイルを読み込んだ時に画像が回転することがもともとあって、これは一応すでに対応済みだったのですが、最新のiOS(バージョン13.4から?)ではなにか変わったのでしょうか、また再発していたので、使っていたJavaScript Load Imageっていうライブラリを最新のものにして直しました(ただ、ちゃんと調べていないので、なにか勘違いしているかもしれません)。それから、判別結果に表示される種名はGoogleの検索ページへのリンクにしておきました。それから、PCやスマホの横向き画面では、5位まで表示していた判別結果を7位までとしました。さらにその表示形式の場合のみ、判別に掛かった時間を下に小さく表示するようにもしましたので、ちょっとしたベンチマークとしてお使いください。

1年ほど前ナニゴケを初めてリリースした時に、1年後の目標を「判別できる種の数120・Trainに使用したデータ20,000枚」と書きました。今回のバージョンがその課題の提出期限だと思い、ちょうど苔シーズンでもあるのでそれにも間に合わせたいと結構がんばったつもりです(ばたばたしていて、少し遅れましたが…)。でも、「Trainに使用したデータ20,000枚」はだいたい達成しましたが、「判別できる種の数120」にはぜんぜん届きませんでしたね。ごめんなさい。まあ少しだけ言い訳させてもらうと、やっぱり終盤のコロナが痛かった… 一番最後にバスに乗って苔の写真を撮りに行ったのは、去年の年末だったようで、その後は行動範囲が大幅に制限されてしまいました。今年に入ってから、私はまだ一度もタマゴケを見ていないのですが(!)、そんな春を過ごすことになるとは年始の頃には想像もできなかった… ただ、そのかわり徒歩圏内の身近な苔たちと向き合う良い時間になったのも事実です。半年前の自分が聞いたらびっくりしそうな、いくつもの発見がありました。探せばあるんですよ。ほんとにね…

一応、今回のアップデートで、いろいろ気になっていた細かい部分は作り終えました。気分的には、一段落です。ここから先は、もうただひたすらに学習データを増やしていくだけだと思っているので、やらないといけないことがはっきりしてずいぶんと気が楽になりました。

ナニゴケにはかなりの時間を割いてしまい、もうすでにCOSUMIに掛けた時間を超えちゃったんじゃないかと思っているのですが、なんか、やればやるほどゴールが遠くなるような感覚があって、じゃあなぜそうなるのかというと、自分で勝手にゴールを遠ざけているからなんですよね。一番最初に苔をやってみようと思いついた時(本当に遠い昔のことみたい…)に考えていたゴールは、もうとっくに通り過ぎているような気がします。別に自分が後ろに後退しているわけじゃない。まあ、いつか納得いくものができるんでしょうが、どうせならできるだけ早めのほうがいいなとは思います。

white shadeをアップデートしました(2020年4月)

white shadeに7路盤が新しく追加され、9路盤~13路盤では強さをレベル6まで選択できるようになりました。

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

ここ最近、COSUMIへのアクセスが本当にかなり多い状態が続いていて(昨日なんか36,010敗…)、なんとか早急に手を打たないと不味いので、実はまだいくつか問題点が残っているのですが、とりあえずwhite shadeをここで一度アップデートして、できるだけそちらへ誘導していきたいと思います。

その問題点としてはまず、7路盤で対局結果を1目間違えることがよくあります。できるだけ早く直したいと思いますが、きちんとやるには学習やり直さないといけないので、少なくとも2週間でしょうか? その次に、アップデート直前に自分の少し非力なiPadで動かすまで気づいていなかったのですが、今回の設定では動作がちょっと重すぎるみたいなので(そのせいで少し不安定かも?)、これも今後修正したいと思います。今は、white shadeもかなり強くなって、特に大きな碁盤サイズでは、今回のレベル6程度の強さなら、そんなにリソース使わなくてもいけるようになっているのですが、もろもろ事情があって、ここを直すのは、全部やり直さないと無理なので、だいぶ先のことになります。あと、レベルが低い時の手の汚さも気になります。white shadeが強くなるにしたがって、弱い設定にするのがかなり難しくなってきました。今回こんなにアップデートに時間が掛かったのも、かなりの部分、そのせいです。良い方法がどうしても見つからなければ、どうせ置き石もたくさん置けることですし、レベル1は今後無くすかもしれません。

white shadeは、一応COSUMI史上最強だと思いますし、もう少しブラッシュアップできたら、メインコンテンツのひとつに昇格かな? もうちょっとだけ頑張ってみます。

前回のwhite shadeのアップデートはちょうど一年前だったみたいですが、この一年間、私は一体何をしていたのでしょうか?(笑) ほんとに心配なるわ…

[追記 2020/5/10]
原因が思っていたのと違っていたのでだいぶ頭抱えましたが、7路盤でスコアをよく間違える理由がようやく判明しました。分かってしまうと、よくこれで7路盤を普通に打っていたなって感じだし、それ以外の碁盤サイズにもだいぶ悪影響があった気がします… このえげつないバグを見た後に、このまま7路盤を公開したままにするのは、ちょっと気が引けるので、一度、7路盤は削除しました。再度公開できるのは、一回学習を回さないといけないので早くて10日後ぐらいですね。ついでに、少し軽く動くようにもします。たぶん、全体的に手もきれいになるでしょう。レベル調整は狂ってきそうですが、それはまたおいおい修正していきます。あと、7路盤では互先はこのままずっと削除したままにするつもりです。やるならまた別の場所に用意します。

[追記 2020/5/21]
スコアをよく間違えるのが直ったので、互先以外は7路盤を元に戻しました。全碁盤サイズで少し軽くなって、おそらく手が自然になってもいるはずです。9路盤以上の碁盤サイズでは、同じレベルで比較した場合、少しだけ弱くなっているとも思いますが(ただ、元々がたぶん少し強すぎたと思う)、ここを調整するのが一番リソースを食うので、細かい修正を全部終わらせた後に行う予定です。もう少し全体的に軽くするために、できるだけ早くPNも学習し直したいのですが、一回先にやります。

[追記 2020/6/5]
今現在、2種類のPNを使用しているのですが、その内のひとつを大幅に小さくしました。少しだけ弱くなっていますが、だいぶリソースを食わなくなっているはずです。手は自然になっているかもしれません。あと、tensorflowjs_converterの--quantization_bytesというオプションを設定して、すべてのNNのウェイトを4byteから2byteに丸めました。半分になった今現在でファイルサイズが全部合わせて3MB弱ぐらいあって、今まではいくらなんでもちょっと大きすぎだったんですよね… 1byteとかだと、予めそういう学習の仕方をしておかないとだめだと思いますが、2byteだと、出力はたぶんあんまり変わらないんじゃないかと思います(以前調べた気がするのですが、詳しいことは忘れた)。それから、話がちょっと変わりますが、クリック/タップ周りも少し手を入れました。本当はこれもっと早くやらなければいけなかったのですが、こういうところを触るのは本当に怖くて、ずっと見て見ぬふりをしてました。なにかまずそうなら、出来るだけすぐに直します。問題無さそうなら、通常版などCOSUMI全体を書き換えたいと思います。

white shadeが動きにくいことはだいぶ減ったと思うので、ぜひ一度遊んでみてください。

COSUMIのプレイ実況動画

COSUMIを始めた頃だったでしょうか、「アメリカでは若者世代のYouTube視聴時間がテレビ視聴時間を抜いた」というニュースを見て、本当にひっくり返りそうなぐらいびっくりしたのを、今でもよく覚えているのですが、気がつけば、私の家にはテレビは無く、暇があったらYouTubeをずっと観ている毎日になってしまいました。そんなみんな大好きYouTubeに、COSUMIとの対局のプレイ実況動画を上げてくださる方が少しずつ増えてきて、すごくうれしく思っています。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

今回はその中からいくつか紹介していきたいと思います。

まず最初はVTuber。オドロキノシロサ(笑)。 それにしてもこの子、将棋する人だからでしょうか? 入門者にしては異常にセンスが良いですね…

もう一人VTuber。最後は熱いですねえ。ほんとCOSUMIはクソザコやろーです(笑)。

強い方も打ってくださいました。当然COSUMIは勝てないのですが、この2局はレベルの割に上手できれいに打てていると思うので、正直うれしいです。

政光さんも、純碁の紹介にCOSUMIを使ってくださいました。

上の5つの動画はすべて、今現在、視聴回数がものすごく少なくてなんだか悲しいので、試しに、COSUMIの対局ページにパソコンからアクセスした時、ランダムに選択して右下の空いているスペースに埋め込むことにしました。ささやかですが、COSUMIからの恩返しです。でも、意外と視聴回数伸びるかもしれませんよ。ちなみに、今現時点では上から順に、36回、44回、377回、403回、233回です。

私は、自分の目の前で誰かがCOSUMIと対局しているのを見たことが、今の今までただの一度も無く(もっと言うと、リアルな間柄で私のことを中の人だと知っている人も一人もいない…)、昔、こういうプレイ実況動画を初めて見た時に、「ああ、本当に対局しているユーザがいるんだ」と変に感動した覚えがあります。あと、COSUMIの話をしている人もリアルでは見たことがなく、「COSUMIって声に出して読むとそういうイントネーションなんだ」とかは、今でもよく思ったりします(笑)。

COVID-19とCOSUMI

ここ最近、COSUMIへのアクセスがかなり多い状態が続いています。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

説得力のあるデータは出せませんし、私も決して断言する訳ではありませんが、これは新型コロナウイルス感染症の流行のみでほぼ説明できると、自分の中では確信しています。

今年に入ってからのCOSUMIが一日に負けた数の推移です。寒さの厳しい時期の話でもありますので、比較対象として前々年と前年もグラフに加えました。

以前からここでも何度か書いていますが、COSUMIは雨や雪が降ると、アクセスが増える傾向があります(これは、他のオンラインゲームなどでも同じようです)。COSUMIへのアクセスの約1/4は海外からで、さらにその内訳に韓国や中国など東アジアが占める割合が多いというのが計算を難しくしますが、とりあえず直近見られる28,000+という数字は、仮に日本全国で大雨が降ったとしても、特別な他の要因が無ければなかなかいくことのない、非常に大きな値です。新型肺炎による健康被害が最終的にどれぐらいのものになるのかは、現時点では私にはよくわかりませんが、もしも実際に、それほどまでに人の外出が抑えられているのならば、経済的な影響についてはすでに甚大なものなのではないでしょうか?

中国でオンラインゲームや動画アプリの利用急増、新型肺炎で – ロイター
https://jp.reuters.com/article/china-health-online-idJPKBN1ZY109

しかし、こんな時ですので、外出を控えること自体はとても良いことだと思います。実はCOSUMIでは、この春、3台あるサーバを2台に減らす予定だったのですが、これについてはとりあえず当面の間、延期します。サーバの負荷が高い時間帯が続いて申し訳ありませんが、あと一か月ほどでwhite shadeをかなり強くできそうなので、そのあたりでそちらへの誘導を強めます。しばらくお待ちください。

[追記 2020/4/1]
3月末までのデータを追加したグラフです。細い線は、7日移動平均です。

なんだかえぐみが増してきましたね… 3月中旬からの自粛ムードの中だるみも、うっすら観測できているような気もします。white shadeは、ちょっといろいろ手間取っています。申し訳ありませんが、もう少しだけお待ちください。

ナニゴケをアップデートしました (Ver. 1.3.0)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

今回は、結構大きめのアップデートになっています。まず、判別可能な種に、「エダウロコゴケモドキ」、「クビレケビラゴケ」、「ケゼニゴケ」、「スギバゴケ」、「ヒメジャゴケ」、「リボンゴケ」が追加されました。また、12600枚だったTrainのデータ数は、16400枚になっています。さらに、ネットワークの構造もいくらか改良しました。その中で、特に性能の改善が著しかったのが、通常のSENetとは別に独立して、Average Poolingで1×1ではなく2×2にするSE-blockを用意して、それも併せて両方いっしょにメインの出力と掛け合わせるというやつで、これがかなり汎化性能を上げました。で、そのあたりを頼りに、パラメータ数が増える形でネットワークを大きくもしました。さらにPredictを全体で1回だけではなく、中央を中心とした少し狭い範囲での2回目も行い、2つの結果を平均したものを、判別結果として表示するようにもしました。そして、TensorFlow.jsのバージョンも上げました。

ということで、もろもろかなり良い改善になっていると思います。判別可能な種の数は、なかなか増やしていくことができなくてちょっと辛いのですが、データ数には少し余裕が出てきました。5月6月の苔シーズンまでには、何とかある程度納得いく形にしたいと、自分で言うのもなんですが、今、結構頑張っています。

私の住む所の周りでは、コバノチョウチンゴケがすでにかなり目立つようになりました。春はすぐそこですね。

white shade使ったベンチマークテストを作ってみました

white shadeを強くしようと、時間のある時に少し手を動かしてはいたのですが、なかなかなかなか強くなりません。もう、真面目に探索しないと、レベル6は難しいですかね? で、なかなかなかなか強くならないのがつまらないので、今回はwhite shadeを利用したベンチマークテストを作ってみました。

囲碁ベンチマーク – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/benchmark.html

ひたすらwhite shadeに手を打たせて、速度を測るというやつです。もちろん、こんなのはまともなベンチマークテストではなく、ただのネタにしかすぎませんので、真面目に使おうとはしないでくださいね。

今現在は、white shadeとの対局はレベル4までしかできませんが、今回のベンチマークはレベル5相当の強さになっています。手元のPython版での計測では、13路盤でGNU Go Level 10に、勝率95.2%、平均42.6目勝つぐらいなのですが、地たくさん勝つ割には、勝率が低くて、なんか安定性がないですね。めいいっぱいの設定にしても、勝率は98%に届かない感じ。でも、この強さでも対局できるように、ここらで一度、対局ページの方も後日アップデートしておきます。

このベンチマーク、私のiPhone 8だと速くて4手/秒ぐらい、GTX 1060(ブラウザが使ってくれているみたい)が載っているPC+google chromeで速くて10手/秒ぐらいになります。それだけ速いのならば、もう少したくさん考えさせてもいいのかもしれませんが、私のクソコードで、ユーザのバッテリーを無駄に消費することになるのは、どうも気が咎めるんですよね…(笑) もうしばらく、シンプルな形で強くならないか、探ってみます。

今回のこのプロダクトを、味気ないベンチマークに飽きた囲碁クラスタに贈ります。とんでもない手も多いですが、そこも含めてお楽しみください。後、これから寒さが厳しくなっていって、スマホをカイロ代わりにしたくなった時にも便利にお使いいただけると思いますので、ぜひお試しください(笑)。

ナニゴケをアップデートしました (Ver. 1.2.0)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

今回は、判別可能な種に、「キヒシャクゴケ」、「シモフリゴケ」、「フジノマンネングサ」が追加されました。また、11100枚だったTrainのデータ数は、12600枚になっています。

先日、白駒の池にまた行ってきました。もう二度と行かなくてもいいようにと、かなり気合入れて向かったのですが、なにからなにまで、もうどこまでいっても終わりのない感じで、軽く絶望しながら戻ってきました。今更ながら、とんでもないこと始めちゃったかもしれない…(笑) まあ、ぼちぼちがんばります。

ナニゴケをアップデートしました (Ver. 1.1.0)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

今回は、判別可能な種に、「チャボヒラゴケ」と「ヒメシノブゴケ」が追加されました。また、10300枚だったTrainのデータ数は、11100枚になっています。TensorFlow.jsも最新のバージョンにアップデートしておきました。NNの構造などは、基本的に何も変えていません。

つい最近、世の中には「標本同定会」と呼ばれる、とっても素敵な催し物(笑)があることを知りました。ただ、夏休みの8月に開かれることが多いみたいで、うーん、また一年後ですね…

形勢を目数で返すNNを公開します

囲碁の局面の形勢を、目数で返すNNを公開します。ここ最近も改良しようといろいろと試していたのですが、ほとんど進歩が無かったので、今回公開するのは最新のバージョンですが、数か月前に作成した、今現在white shadeで使っているものと性能はほとんど同じです。

http://www.perfectsky.net/misc/whiteshade_vn-20190902.h5

white shade – 囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/whiteshade.html

13路盤より大きな碁盤サイズには対応していませんが、それより小さい碁盤サイズは、特になにも問題はないと思います(12路盤、10路盤、8路盤とかもOK)。公開するのは、KerasのHDF5形式のファイルですが、TensorFlow.jsのコンバータも私の環境では問題なく通ります。このNNを使っても、そんなに強い思考エンジンは作れないと思いますが、目数で形勢を返すNNは比較的珍しいと思うので、だれかが何か面白いものを作ってくれたら嬉しいです。

以下、使い方を簡単に説明していきます。わたしも本当によく分かっていないので、難しいこと聞かれても、どうせちゃんとお答えできませんので、この説明で分からなかったら、もう諦めちゃってください(笑)。

入力は「盤上」・「次の手番の石」・「相手の石」・「コウで打てない場所」の4面です。「次の手番の石」・「相手の石」は、「黒石」・「白石」ではないので注意してください。出力は「次の手番から見た目数単位での形勢(中国ルール・コミは無いとして)」です。「黒から見た目数単位での形勢」ではないので注意してください。入力は当てはまる所は1、そうでない所は0です。

例えば次の局面の形勢を知りたい場合は、

次のようなコードになります。

# score.py

from keras.models import Model, load_model
import numpy as np

MODEL = load_model('whiteshade_vn-20190902.h5')

TURN       = 'WHITE' # or 'BLACK'
BOARD_SIZE = 9

BOARD = [
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', ' '], 
    [' ', 'W', 'B', 'K', 'B', ' ', 'B', ' ', ' '], 
    [' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
]

NUM_PREDICT     =  1
MAX_BOARD_SIZE  = 13
NUM_INPUT_LAYER =  4

ON_BOARD = 0
MY_STONE = 1
YR_STONE = 2
KO       = 3


################################################################################


predict_input = np.zeros((NUM_PREDICT, MAX_BOARD_SIZE, MAX_BOARD_SIZE, NUM_INPUT_LAYER))

for i in range(BOARD_SIZE):
    for j in range(BOARD_SIZE):

        predict_input[0][i][j][ON_BOARD] = 1

        if BOARD[i][j] == 'B':
            if TURN == 'BLACK':
                predict_input[0][i][j][MY_STONE] = 1
            else:
                predict_input[0][i][j][YR_STONE] = 1
        elif BOARD[i][j] == 'W':
            if TURN == 'BLACK':
                predict_input[0][i][j][YR_STONE] = 1
            else:
                predict_input[0][i][j][MY_STONE] = 1
        elif BOARD[i][j] == 'K':
            predict_input[0][i][j][KO] = 1

predict_output = MODEL.predict(predict_input)

if TURN == 'BLACK':
    score = predict_output[0][0]
else:
    score = -(predict_output[0][0])

if score > 0:
    print('B+' + str(score))
else:
    print('W+' + str(abs(score)))

$ python ./score.py 2>/dev/null
B+18.516293

13路盤より小さい碁盤は、13×13のどこに描いても大丈夫だと思っていたのですが、四隅のどれかにぴたっとくっつけたデータでしか学習してなかったせいか、例えば9路盤を13×13のど真ん中に描いてpredictさせると、ちょっと精度が悪くなるような気がします。まあ普通に、0の0から使ってください。

このNNは、まず座標ごとにどちらの地になりそうなのかを予測し、それを集計したような構造になっています。これは、そういうふうにした方が、評価関数として性能が良かったからそうしただけなのですが、結果的にその集計前の途中の出力を、副産物として利用することも一応は可能です。ただ、本当に一応ですね。例えば9路盤をpredictさせると、盤外の座標にもスコアがしっかり付いていて(!)、でもどちらかに偏らないようになっていたりと、13×13全体で上手にバランスをとっている感じなので、まあ参考程度に見てください。例えば、次のようなコードで使えます。activation_103っていう名前のレイヤーの出力を使ってください。

# territory.py

from keras.models import Model, load_model
import numpy as np

OUTPUT_LAYER_NAME = 'activation_103'

MODEL   = load_model('whiteshade_vn-20190902.h5')
MODEL_2 = Model(inputs  = MODEL.input,
                outputs = MODEL.get_layer(OUTPUT_LAYER_NAME).output)

TURN       = 'WHITE' # or 'BLACK'
BOARD_SIZE = 9

BOARD = [
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', ' '], 
    [' ', 'W', 'B', 'K', 'B', ' ', 'B', ' ', ' '], 
    [' ', ' ', 'W', 'B', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '], 
    [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']
]

NUM_PREDICT     =  1
MAX_BOARD_SIZE  = 13
NUM_INPUT_LAYER =  4

ON_BOARD = 0
MY_STONE = 1
YR_STONE = 2
KO       = 3


################################################################################


predict_input = np.zeros((NUM_PREDICT, MAX_BOARD_SIZE, MAX_BOARD_SIZE, NUM_INPUT_LAYER))

for i in range(BOARD_SIZE):
    for j in range(BOARD_SIZE):

        predict_input[0][i][j][ON_BOARD] = 1

        if BOARD[i][j] == 'B':
            if TURN == 'BLACK':
                predict_input[0][i][j][MY_STONE] = 1
            else:
                predict_input[0][i][j][YR_STONE] = 1
        elif BOARD[i][j] == 'W':
            if TURN == 'BLACK':
                predict_input[0][i][j][YR_STONE] = 1
            else:
                predict_input[0][i][j][MY_STONE] = 1
        elif BOARD[i][j] == 'K':
            predict_input[0][i][j][KO] = 1

predict_output = MODEL_2.predict(predict_input)

for i in range(MAX_BOARD_SIZE):
    for j in range(MAX_BOARD_SIZE):

        if TURN == 'BLACK':
            darkness = predict_output[0][i][j][0]
        else:
            darkness = -(predict_output[0][i][j][0])
        
        if darkness > 0.9:
            print ('B', end='')
        elif darkness > 0.5:
            print ('b', end='')
        elif darkness > -0.5:
            print ('.', end='')
        elif darkness > -0.9:
            print ('w', end='')
        else:
            print ('W', end='')
    
    print ('\n', end='')

$ python ./territory.py 2>/dev/null
bw.bBBBBBBWBB
.WWw...wBBWWB
WWwbBBBbBBWWB
WWwbBBBBBBWWB
WWwbBBBBBBWWB
WWwbBBBBBBWWB
WWw.BBBbBBWWB
WWWw...wBBWWB
b..bBBBBBBWWB
BBBBBBBBBBWWB
WBBBBBBBBBBBB
WWWWWWWWWWWWB
WWWWWWWWWWWWW

盤上は、左上の9×9なんですけどね。盤外がなんだか凄まじいことに…(笑)

white shadeの方は、NNの入力に「ダメの数」追加するか、少し深く探索した方が良さそうです。そういったことは無しでも、レベル5までは問題なくいけるのですが、できればレベル6が作りたい…

六十秒英単語テストで六十問以上正解する人がいるらしい…

Twitterでたまたまこんなツイートを見つけました。

六十秒英単語テスト
https://www.60byo.net/

問題作った私でも、50問がかなり難しいのですが、63問って…(絶句) この1問/秒以上っていうのは、人間にはちょっと無理ではないかなと、今まで私は思っていました。どんな反射神経しているんでしょうね。本当にすごいです。しかし、さらに調べたところ(ちなみに、調べたデータは8月30日までの分)、なんと64問が1人だけおられました(!)。その次が先ほどの63問で、さらにその次は59問の1人まで結構飛びます。

いい機会なので、テスト結果が上位何パーセントに位置するのかのデータも、久しぶりにアップデートしました(使ったデータはここ1年の分にあえて限定しています)。40問正解で上位10%、43問正解で上位5%、48問正解で上位1%に入れるようです。全体的に数字が上がってきていますね。神の領域に居られる方々の励みになればと、1%より数字が小さくなる時は、小数点以下3桁まで表示するようにもしました。また少し時間を空けて、アップデートします。

あと、一昨日からアクセスがかなり多くなっています。タイミングなどから言って、先ほどの方が何度かツイートしてくださった影響のように感じられます。

ってここまで書いてから、もう一度Twitterをチェックしていたら、こんな方が…

さすがにここまで来てしまうと、特定の環境で動作がおかしいのではと、自分の書いたコードを疑い始めてしまいます(笑)。

[追記 2019/9/1]

うわーやらかしてる! できるだけ早く修正したバージョンをリリースします。

[追記 2019/9/2]
「kidney」が「肝臓」になっていたのを修正した、新しいバージョン1.1をリリースしました。このバージョンでは、テスト結果が上位何パーセントに位置するのかは、データがある程度集まるまで、表示されません。英単語と日本語訳のペアの誤りは、操作ミスや、問題作成時に使っていたいろいろなスクリプトのバグなどでも起こりうるので、最初にリリースした時は、無いわけないだろうと思ってましたが、その後、1年以上経過しても誰にも何も言われないので、大丈夫だったんだと思ったらこれです。

[追記 2019/9/12]
Ver. 1.1でも、テスト結果が上位何パーセントに位置するのかが、表示されるようにしました。まだデータが少ないので、できるだけこまめにアップデートしていくようにします(自動は危険なのでやりません)。ついでにVer. 1も、アップデートしました。こちらのバージョンは、今後アップデートすることはもうありません。

晴耕雨棋

つい先日も、台風10号がやって来るなど、今年もまさに台風シーズンを迎えた日本列島ですが、今日は雨と囲碁の関係についてです。

以前にも少し書いたことがありますが、雨や雪の日は、COSUMIへのアクセスが大幅に増えます。きちんとしたデータを出すのはあまり簡単ではないので、ここではそれは控えますが、ざっくりと言って、「日本全国でしっかりと雨が降ると、日本からのアクセスが約25%増える」という感覚を私は持っています。そしてこれはおそらく、「どこかでしっかりと雨が降ると、その場所からのアクセスが約25%増える」ということだと思っています。

囲碁ブラウザゲーム COSUMI
https://www.cosumi.net/

雨と囲碁っていうと、「笠碁」という落語の演目を思い出す方が多いかもしれません。調べてみると、元は江戸時代からある話のようですね。その時代においての雨は、仕事をできなくして対局を増やすことの方が多かったのか、それとも、碁敵の所に行くのを阻んで対局を減らすことの方が多かったのか、私にはちょっとわかりませんが、少なくとも現代では、雨が囲碁の対局を増やすものなのは、まず間違いが無さそうです。

苔とWeb

ナニゴケ作ったので、Web上の苔にまつわるもろもろを調べて、一度ブログ記事にしてみます。こういうのを書き残しておけば、何年か後に見返した時に役に立つだろうという当初の意図だったのですが、結果的には、ここにしか残らなそうな内容は特に含まれていません。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

まず、Googleで「苔」という単語を検索した時の、検索結果件数(って言うのかな?)ですが、検索する条件などにもよるのでしょうが、私の環境では「約 38,500,000 件」となります。この数字の大きさを理解するために、私は反射的に「囲碁」という単語と比較してしまうのですが(笑)、そちらは「約 40,100,000 件」となり、まあだいたい似たような規模のワードようです。そして、検索結果の上位には苔の販売業者のサイトが多く並んでいて、これはちょっと「囲碁」とは様相が違いますね(こういう比べ方もなんですが、碁盤碁石を販売するサイトが上から並ぶことはないですからね)。分かりやすいところでは、楽天が5番目に私の環境では来ます。私は苔を自分で育てるということに興味が無い人ですし、ましてや買うとか発想にも無いですが、世の中的にはそんなものみたいです。こういうの、正直、私は最近まで知りませんでした。それにしても、上の方のサイトもそんなにリンクを集めている感じはないですね。「囲碁」だと日本棋院という強敵もいるのですが(笑)、そんなのも無いし、これは意外とスカスカかな? なんとか一気にぶち抜きたいですね。そして、上位のサイト見ている限り、「苔」はけっこうしっかりと蘚苔類のことみたいです。

次に時系列で見るために、Google Trendsでも調べてみました。最初は「苔」。


まず気が付くのは、季節性があるということですね。ピークは5月6月みたいです(ナニゴケもう少し早くリリースしたかった…(笑))。そして、長いスパンで見ると、右肩上がりの傾向も見て取れます。「最近、若い女性に苔が人気で…」とか聞くと、「また言ってるよ」って正直思っていたのですが、どうやらまんざら嘘でもないようです。で、この最近の苔人気の中心は、苔テラリウムとか苔玉など、観賞用に少量の苔を屋内で育てたいという需要にある気がします。「苔 テラリウム」だとこんな感じ。


他の植物と同じく、苔を観察し愛でる人はいつの時代もどこの国にもいるし、日本だと庭など屋外で苔を積極的に育てるということは昔からあったと思いますが、「屋内」というのが新しいところでしょうか? ちなみに、Google Trendsでの「苔」が蘚苔類のことなのかどうかは、当然のことながらかなり微妙です。

私も普段から、苔についてWebで調べることが多いですが、まあ嘘が多いです。「どんな分野でもそんなもの」って声が聞こえてきそうですが、かなりはっきりと相対的に不正確な情報が多いと感じています。理由はいくつか考えられるようにも思いますが、これといった説明を一言でするのはちょっと難しいですね。Googleの画像検索で〇〇ゴケを検索した時も、コンテンツの不正確さに、ウェブサイトの論理構造のまずさと、Googleのバカさ(笑)が相まって、かなり酷いことになってるんですが(でも、今見てみると以前よりだいぶましな気も…)、これがナニゴケを作ろうとした動機のひとつだったりもします。

そんな感じで、本当に役に立つサイトが少ないなと感じている私が、いつも勉強させていただいている、おすすめサイトをひとつ紹介します。

そよ風のなかで Part2
https://soyokaze2jp.blogspot.com/

おそらく中の人はごりごりの蘚苔類の専門家ではないはずですが、根拠のない断定とかするような方ではなく内容も信頼できますし、このブログが無かったら、ナニゴケももっと酷いものにしかならなかったと本当に思います。で、このブログの中の人、 左木山祝一さんが、つい最近、「コケの国のふしぎ図鑑」という書籍を出されました。たくさんお世話になったお礼に、私もできるだけ早く購入させていただきます。おまいらも買え!

次は苔の図鑑についてのブログ記事を書くかもしれないし、書かないかもしれないし、やっぱり書くかもしれない。

[追記 2020/4/13]
「コケの国のふしぎ図鑑」はあの後すぐに購入しましたが、とても良い本でしたよ。写真がどれもとても美しく、見開き2ページ使って1枚の写真という箇所が結構あるのですが、これはなかなか斬新ですね(写真は基本すべて大き目で、ジャゴケの雄器托は6cmぐらいある(笑))。他の方にも強くおすすめできますが、とはいえ包括的な蘚苔類の図鑑ではないですし、フィールドに持ち出すにもあまり向かないと思うので、そこはご注意ください。お酒でも飲みながら、ペラペラめくっていると楽しいと思います。

「そよ風のなかで」は、2014年7月からのページビューが現時点で467,358となっているのですが、これちょっと少なすぎじゃないでしょうか?(こんな素晴らしいサイトがなんで…) ナニゴケやる以上、平凡社の図鑑は10万しようが私は買わないわけにはいかないのですが、その理屈から言ったら「そよ風のなかで」にも同じかそれ以上のお金をお支払いしてもいいくらいで、本当に感謝の言葉もありません。この時代、学術的な図鑑はデジタルでないとさすがに使い勝手が悪いと、いつも強く感じています。スマホ・タブレット用のネイティブアプリで、だれか勝負する人いないのでしょうか?

ナニゴケをアップデートしました (Ver. 1.0.2)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

9400枚だったTrainのデータ数を10300枚に増やしました。それ以外は何も手を入れていませんあと、TensorFlow.jsのバージョンを上げました。

先日、自宅のすぐそばに、ものすごい「フロウソウ」スポットを見つけてびっくりしました。灯台下暗しとはまさにこのこと…

[追記 2019/8/3]
最終的にはデータを10万枚にするのが目標なので、だとしたらここが一合目ですかね。先は長いですが、必ず登り切りたいと思います。でも、8月は本当に外に出たくないよ。こんなことを言ってて、去年もこの時期の写真ほとんど撮れなかったのですが…

ナニゴケをアップデートしました (Ver. 1.0.1)

ナニゴケのNNを新しくしました。

ナニゴケ – 苔の種類を判別します
https://www.nanigoke.net/

8400枚だったTrainのデータ数を9400枚に大急ぎで増やし、その他もろもろ細かい修正を入れて学習し直したので、精度が少し上がったと思います。

2週間後ぐらいまでにもう一度、ある程度しっかりした修正を行い、そこから先はゆっくりしたペースで、改良を続けたいと思います。使ってくれる方が少ない間に、目立つ欠点はさっさと直してしまいたい…