めもぶろぐ

勉強したこととかめもめも

機械学習 参考資料まとめ

大学の研究テーマを決めるために、参考資料をまとめておきます。よかったらどうぞ
個人的にAIを使って生成をしてみたいので、それ関係の資料が多いです。
以下、参考資料になります。(後日追加予定)

深層学習について

qiita.com
深層学習で使いそうなライブラリとかそれに関連したものが集まってるサイト
書いてない部分もあるけど、とりあえず深層学習するときに見たら何か思いついたりするかもしれない。こういう手法とかあるのかーという感じに見てる

mathetake.hatenablog.com
論文リスト。今どのくらいディープラーニングって進んでるの?とかがわかるサイトです。

qiita.com
ディープラーニングの研究2016のまとめです。
分野別に書かれているので、かなり助かりました。

gagbot.net
深層学習で使われる手法が主に書かれています。図もあってとても分かりやすい。CNN,RNN,GANについて書かれています。

カプセルネットワーク

axion.zone
最近ニュースになり、AIにさらなる進化ともなった?カプセルネットワークについて描かれています。CNNの強化版みたいな感じらしいです。

medium.com
CNNの欠点を述べながらとても分かりやすく書いてあるサイトです。翻訳して読んでますがかなりわかりやすいです。というか翻訳も進化しましたね()

qiita.com
こちらは実際に実装してみて、どれほどのものなのか検証しているサイトです。
CapsNetについてもしっかり書かれています。

shunk031.me
こちらもCNNで何ができないのかを示されていて、CapsNetがどのようなものか書かれています。

www.slideshare.net

qiita.com
wired.jp

最近発表されたCapsNetについてまとめているサイトです。数少ない日本語なので貴重です。

CNN(畳み込みニューラルネットワーク

zellij.hatenablog.com
本当に畳み込みってどういうものなのかというのがわかりやすかったです。何のために使うのかというのが書いてあったので助かりました。ニューラルネットワーク要素はありません。

qiita.com
CNNって何なのかについてそのままですが書いてあります。
応用例についても書いてあるので、どういうことができるのかについても参考になります。

www.slideshare.net

GAN

mizti.hatenablog.com
画像生成する際に一番使用されるGANですが、DCGANとの違いについても書いてあり参考になります。

研究?

idarts.co.jp
2次元画像から3次元画像に変換するAIシステム
SurfNetと呼ばれる技術で、機械学習と深層学習を使用してるみたいです。
2017/8/1ぐらいなので、もしかしたらまだ発展途上かもしれない。論文あり。

shiropen.com
theorangeduck.com
www.4gamer.net


正直一番やりたかった研究。3Dモーションを生成してくれる深層学習あったらなって思って検索したらすでに実現されていました。
使っているのは深層強化学習で、モーションを学習させて動かしています。
この研究のミソは人間の歩行を周期関数を用いて学習モデルを変えてる?ようです。
いや、学習して固定化された値を周期関数を使って変えてる?とにかくすごい・・・。
4足歩行とかけんけんぱが難しいのと、モーションキャプチャと地形モデルを合わせるのは力業っぽいですね。
ジャンプとかもできるのかな・・・?難しいよね?

gigazine.net
静止画から動画を生成するのにAIを使用している研究。あんまりうまくいっていない??
2016年なので、もしかしたらもっといいのができてるかもしれませんね。

ニュース?

roboteer-tokyo.com
人工知能のニュースが結構置いてあるので、最新の情報が手に入ると思います。

News – Preferred Networks

【横スクロール2Dアクションゲーム】ステージ生成とカメラワーク追従【4】

新しいPCでUnityするとめっちゃ快適すぎて、なんでもっと早く買い替えなかったのかと・・・動作も遅かったし時間もったいないなって感じました。

で、本題ですが・・・毎回敵キャラ実装するとか言ってる気がするけど、もっと自由にキャラを動かしてみたかったのでステージ生成とカメラ移動を作成してみました。

ステージ生成は
・キャラが一定の場所まで到達したらステージを生成する。

というのを実装してみました。

カメラ移動は
・キャラに追従移動するように移動してくれるカメラ

を実装しました。

まずカメラの実装

が、カメラ移動に関してはキャラの子に設定してあげればいいのかなって思ってメインカメラを取り付けたのですが、
左入力してみるとどうやらカメラが自分から見て奥に回り込んでしまうみたいで、見えなくなってしまうという事態に・・・。

そこで、カメラ移動に関してはスクリプトを用意して制御してみようと思います。
・x軸はキャラの移動を使用する。
・y軸は画面の一番下にステージが来るように設定する。
・z軸は常にー1とかにする。

多分こうすることで常にキャラを映しながら移動してくれるかなと思います。x軸に関して使うのはtransform.positionで、カメラにアタッチメントして位置情報を常に取得していく感じです。

スクリプトは以下の通り。

	void Update () {
        transform.position = new Vector3(Unichan.transform.position.x+5, y, -1);
	}

UnichanはGameObjectです。外側でpublic宣言してあります。ここで学んだのは2DだけどVector3というクラスを使用することがあるんだなってことでした。
やっていることは上記3つ。yも外側でpublic宣言していじれるようにしてあります。

次にステージ生成

これに関してはキャラがある場所までいったらステージを生成するというスクリプトを用意してみます。ステージ生成に関しては以下のサイトを参考にしました。
hiyotama.hatenablog.com

public class CreateStage: MonoBehaviour
{
    public GameObject Stage1;
    public GameObject Stage2;

    //Stageの長さは15
    int border = 15;

    // Update is called once per frame
    void Update()
    {
        //maincameraがx = 10より上のときステージを作成する。
        if (transform.position.x > border - 5)
        {
            CreateMap();
        }
    }

    void CreateMap()
    {
        //Stage1の位置xが10より下の場合
        if (Stage1.transform.position.x < border -5)
        {
            border += 15;
            Vector2 tmp = new Vector2(border, 0);
            //位置をtmpの位置にする
            Stage1.transform.position = tmp;
        }
        //Stage2の位置xが10より下の場合
        else if (Stage2.transform.position.x < border - 5)
        {
            border += 15;
            Vector2 tmp = new Vector2(border, 0);
            Stage2.transform.position = tmp;
        }
    }
}


このスクリプトをプレイヤーにアタッチしてみると、Update()でプレイヤーが10(border=10にすればいい気もした)進んだらステージを生成するという感じです。
ただ、このままだとborderは一定の値なので最初のほうしか生成しません。よって呼び出した関数でborderの値を変える必要があります。(border+=15の部分)

とまあ最終的に以下のようになりました。
f:id:gen-193:20171126175934g:plain


全体図を見るとカメラもちゃんとプレイヤーを追従しているし、ステージもしっかりと生成してくれています(移動?)
無限にステージ作るならランゲーになりそうかなぁ・・・。では

パソコンを買いました。めっちゃ快適・・・。

2週間ぶりかもしれないです、3年生なのでレポートとか研究テーマを決定するためにひたすら参考資料とか読み漁っていてなかなかゲーム作成に取り掛かれませんでした。
タイトル通り、最近パソコン買いました!前使ってた家庭用ノートパソコンはもう7年目に突入していてさすがにきつかった・・・。
よくあのパソコンでUnity動かそうと思ったなぁ・・・。これでやっと3Dのゲームも作成することが叶いそうです。

ちなみにスペックは以下の通り

CPU:Corei7 7700K
GPU:GTX1080
メモリ:16GB
マザボ:H270
SSD:240GB
HDD:2TB

ざっとこんな感じ。さすがに過剰にスペック高めすぎましたが、19万ぐらいでした。ツクモのG-GEARです。5000円引かれてて、最初GTX1070だったのが+5000円で1080にできるってなってたので思わずこのスペックになってしまいましたw

用途としてはUnityの開発とかお絵描き、ゲームはもしかしたらやるかなってことでこのスペックです。
将来はLive2Dとかブレンダー使って3Dモデル作りたいなって思ってます。


さっそくやってみたかった動く壁紙をSteamから購入して試しているのですがもうなんか感動しましたwこういう動く壁紙を自分の絵でやってみたいなって思いましたね・・・。
画力あげたい()

【横スクロール2Dアクションゲーム】キャラクターのジャンプと走りモーション実装【3】

こんばんわ、ちょっと最近不幸なことがありまして・・・長年飼っていた犬とお別れしてきました。
2匹飼っていたのですが、どっちも今年でお別れしちゃって悲しみが半端ないです。
1匹は寿命で17?ぐらい生きてて、もう1匹は13ぐらいで子宮がんで最後苦しんで逝っちゃったのでそれだけ心残りです。
物心つくときから犬と生活してきたので、犬がいない生活って寂しいなって感じてます。

しばらくしたらこの生活にも慣れるとは思うけれど、これから頑張りたいと思います。長い間ありがとう。


と、まあいきなり悲しみから入ってしまいましたが、書かないと気が済まなかったので申し訳ありませんw

今日はキャラクターの操作、ジャンプと走りモーションを実装してみました。

        //move
        float _x = Input.GetAxis("Horizontal");

        if (_x > 0f)
        {
            _Rigidbody2D.velocity = new Vector2(_Speed * _x, _Rigidbody2D.velocity.y);
            animator.SetFloat("_Speed", _x);
            animator.SetBool("isWait", false);
        }
        else if(_x < 0f)
        {
            _Rigidbody2D.velocity = new Vector2(_Speed * _x, _Rigidbody2D.velocity.y);
            animator.SetFloat("__Speed", -_x);
            animator.SetBool("isWait", false);
        }
        else
        {
            _Rigidbody2D.velocity = new Vector2(0, _Rigidbody2D.velocity.y);
            animator.SetBool("isWait", true);
            animator.SetFloat("_Speed", _x);
        }

一部分だけ置いときます。
右向きのときと左向きとで実装するのに手こずりましたが、走ってるかどうかを管理する変数を2つ用意して無理やり実装しましたw
_Speed変数と__Speed変数とで2つ用意して、→のときは一つ目のifで動かして、←のときはelse ifで動かして、止まるときは最後のelseで処理を行っています。
elseifの-_xの部分は別に必要ないかなーと思ってますが・・・。

今回はサイトとかいろんなところ見ないで自分で作ったのでいろいろと無駄が多そうですが、とりあえず実装できたので良しとしますw

このスクリプトを用意した後Unity側でアニメーションを上手いこと設定すれば以下のようになります(説明めんどくなってしまった)
f:id:gen-193:20171112235403g:plain

void Startの中にanimator = GetComponent();
と書いてUnitychanコンポーネントを取得しています。これを使うことでUnityのアニメーション側で認識?されるようになって後は変位の条件を適切に設定すればモーション変更ができるようになります。

とりあえず実装できたので・・・次はどうしようかなぁ・・・動きは一通りできるようになったので一旦どういうゲームにするか考えなおしてから次何するか決めようと思います。
では

【横スクロール2Dアクションゲーム】2D キャラを入力方向に向ける【2】

こんばんわ!193です。大学3年も後半になり研究とか始まっちゃったり、よく寝ちゃったりして全然作成に取り掛かれないのですが、少しでも進めたいと思います。。

前回はキャラのジャンプとか移動をしたのですが、右向いたまま左に入力すると後ろに向かないので、不自然だから変えます。

こういうオブジェクトを弄ったりできるクラスがUnityにはちゃんと用意されてるみたいですね。今回は画像の移動とか回転ではなく反転するということなので、Transform.localScaleクラスを使っていきたいと思います。

Transform.localScaleクラスは以下の通り

using UnityEngine;
using System.Collections;

public class ExampleClass : MonoBehaviour {
void Example() {
// Widen the object by 0.1
transform.localScale += new Vector3(0.1F, 0, 0);
}
}

今回は2DなのでたぶんVector2クラスを使用するんだと思いますが、これが行っているのはオブジェクトをx方向に0.1ずつ広げている・・・という処理を行っているんだと思います。多分。
画像を縮小拡大ということは-にすれば反転するし、+にすれば元に戻ると・・・


ほとんどこのサイトを参考にしています。ありがとうございました。
raharu0425.hatenablog.com

やること

・右向いているかどうかをisRight変数として管理します。
・最初キャラクターは右を向いているので初期値はTrue。
・右に入力されて動けば右向きにするのでTrueにし、左に入力されたら左向きにするのでFalseを格納します。
これをC#で記述すれば問題ないはず・・・!

というわけで以下コードです。(一部のみ)

private bool isRight = true; //右向き


        //左向きで右入力もしくは右向きで左入力の場合
        if((_x > 0 && !isRight) || (_x < 0 && isRight))
        {
            //右を向いているかどうかを、入力方向をみて決める(ここでTrueFalseに変わる。)
            isRight = (_x > 0);
            //右を向いているかどうかで更新する
            transform.localScale = new Vector2((isRight ? 1 : -1), 1);
        }

isRightの初期値設定はクラスの外側で宣言してます。
左向き~からの処理はUpdateクラスで行っています。

Cは今までやってきて、C#勉強したてで条件演算式というのを今まで使ってこなかったんですけど、if文よりもかなり簡潔に書けるみたいですね。
?: 演算子 (C# リファレンス) | Microsoft Docs

isRightがtrueならば1になり、falseなら-1になるんですね。画像が反転するかしないかはここで行っています。
この書き方は便利で分かりやすかったので覚えて使っていこうと思いました。
ちなみに大きい数字にすると大きくなるので、巨大化するようなときにも使用できそうですね。逆もしかり。

てなわけで動かしてみました。

f:id:gen-193:20171105203003g:plain


よし!とりあえず向きに関しては不自然さはなくなったし、次は待機モーションと歩きモーション、ジャンプモーションとかを変更してみようかな・・・。というかこのUnityちゃん2Dに用意されてたかな・・・。あったら実装します。なければ敵キャラ実装します。では

パーセプトロンについて学習したよ

ANDORNANDXORを用いてパーセプトロンについて勉強した。

どうやらディープラーニングに行くまでに、パーセプトロンを学んで、そのあとニューラルネットワークについて勉強しないといけないみたいですね。

パーセプトロンとは
ニューラルネットワークというもののアルゴリズム、元になったものらしいです。ニューラルネットワークについてはまだ勉強してないのですけどね()
とにかく元ということなのでこれを知らないと無理ってことです。ディープラーニングって大変だ・・・。

パーセプロトンっていうのは信号を入力として受け取ってそれを何かに変換(しないのかもしれないけど)して出力するもの。
パーセプトロンの信号は1か0ポッキリ。ということはAND、OR、NAND、XORみたいな電気素子?と相性がいいのかもしれないですね。

ただし、XORはちょっとパーセプトロンで表現するのは難しい。図で表すと非線形なグラフになるので、こういう特性を持つようなものにはパーセプトロンはちょっと相性が悪いっぽい。

だけど、このパーセプトロンを2つ組み合わせたりすると実はこれらも表現できちゃいます。
XORをAND、OR、NANDで表現できるからという説明はとてもわかりやすかった。


要するに、パーセプトロンは層を重ねれば重ねるほど柔軟な動きを発揮すると。折り紙で言えばそのまま使うこともできるけど、どんどん折っていけばより複雑な作品ができるのと同じみたいな感じがしますね。
あ、だからアルゴリズムって表現ができるのか・・・。複雑なものも分解して見てみることが大事なんですね。

と、なんかまとまりがないけれど、次はニューラルネットワークの基礎について勉強していきたいと思います。

文字コードを変換すれば治るエラー :メモ

File "NAND.py", line 5
SyntaxError: Non-UTF-8 code starting with '\x8f' in file NAND.py on line 5, but no encoding declared; see http://python.org/dev/peps/pep-0263/ for details

こういう時のエラーはどうやら最初のNon-UTF-8をみる限り、メモ帳の文字を全てUTF-8に変換すれば治ったので多分そういうことなのだろう・・・。

とりあえずこういう対処法もメモメモ・・・。