iizukakの作業ログ

忘れる前にメモしよう

Coursera の Deep Learning Specialization を修了した

概要

Coursera の Deep Learning Specialization 全 5 コースを修了しました。Deep Learning Specialization は 5 コースからなる専門コースで、全体を通して深層学習に関する体系的な理解を得ることが狙いです。先生は Google Brain を率いることでも有名な Andrew Ng 氏。深層学習のオンラインコースの中では最も有名なものなんじゃないでしょうか。

修了証

  1. コース全体
  2. Neural Networks and Deep Learning
  3. Improving Deep Neural Networks: Hyperparameter tuning, Regularization and Optimization
  4. Structuring Machine Learning Projects
  5. Convolutional Neural Networks
  6. Sequence Models

感想

5 コースそれぞれには、3~4週分の講義が入っていて、それぞれの週には、

  • 60 ~ 90 分の講義動画
  • 10 問くらいの試験
  • 2 ~ 3 時間かかるプログラミング演習が 2~3 個

が入っています。試験は 8 割くらいがボーダーで、何度でも受け直せます。ただ、一定時間内に失敗していい回数に制限があります。そこそこの難易度で、自分は一発でテストに通せることのほうが少なかった印象です。2 ~ 3 回トライしていました。

プログラミング演習には Jupyter Notebook がウェブ上で利用できるようになっていて、関数の中身を穴埋めで埋めていく方式です。Jupyter 上で動作確認して、 submit ボタンを押すとコードが採点サーバに送られて、採点されます。この Jupyter を使ったプログラミング演習の仕組みはけっこう良くできていているのですが、いくつか問題点もあります。まずデバッグで、基本的には pritnt デバッグになります。pdb も一応使えますが、 pdb を使うと Jyputer の再起動が必要になったりするので、あまり積極的には使いませんでした。あと import が重いことが多々あって、数分待つこともありました。数分待つとその間に Twitter を見に行ってしまい戻ってこないという…

値段は月 5000 円強でした。仕事の合間に少しづつ進めたので 5 ヶ月くらいかかり、修了まで 25000 円くらい。もとが取れるかといえば、自分としては全然とれると思います。自分がなぜこのコースを受けたかというと、去年末に転職して某 深層学習ライブラリ の開発に携わることになったので、一定頭に入れておかないと仕事にならないということでした。現在このコースの講義内容を踏まえ、社内の深層学習の研究者・実装屋に相談しにいくことができたり、プロジェクトにコントリビュートし始めることができる、くらいにはなったと思っています。

上半期で修了できてよかった。

Cloud Build で macOS/Windows アプリケーションをビルドする

環境

  • Unity 2018.2.10f1

はじめに

Unity 用の CI 環境がほしいと思って Cloud Build を試しています。まだ少し触っただけなのですが、非常に便利そう。数クリックで macOS/Windows 用のアプリケーションをビルドして、ユニットテストまで実行できる…。 今のところは基本的には有償で、月 9 ドルで 25GB のストレージがついてくるようです。Unity で CI やるにはオンプレでそれなりにコストをかけてやる (MacWindows マシンに Jenkins なり CI サービスを立てたりする) ことが多いと思うのですが、フルマネージドで 9 ドルというのはめちゃ安いと思うんですよね。

リポジトリ

こちら のテスト用リポジトリで試しています。

Cloud Build の使い方

Cloud Build の UI はそれほど複雑ではないので、直感的に操作することができました。最終的な設定結果は次のようになっています。

f:id:iizukak:20180929224709p:plain

私は普段 macOS で開発を行っているので、Git の master ブランチが更新されると、macOS 用のビルドが自動的に走るようにしています。またこの際にユニットテストも自動的に実行し、テストに失敗した場合にビルド全体が失敗するようにしています。Window については時々しか確認しないし、ディスクスペースももったいないので自動ビルドは切ってあります。

リポジトリ追加

リポジトリの追加については、Github や Bitbucket といった GIt のホスティングサービスを使うか、Git リポジトリをマニュアルで設定するか選べます。今回は Github 上にあるリポジトリをマニュアルで設定していて、次のようになってます。

f:id:iizukak:20180929225117p:plain

リポジトリを追加すると公開鍵が表示できるようになるので、これを Github リポジトリの設定で Deploy Key に追加します。これで Cloud Build からリポジトリにアクセスできるようになります。

Target 追加

macOSWindowsWebGL などを Target として追加でき、Target ごとに細かく設定ができます。

  • 自動ビルドするか
  • どのブランチをビルドするか
  • テストを実行するか
    • EditMode テスト
    • PlayMode テスト

等の設定が可能です。

Unity のバージョン

最新の Unity バージョンが利用できます。新しいバージョンの Unity がリリースされると、48 時間以内に Cloud Build でも使えるようになるようです。

Test Runner で MonoBehaviour を継承していないクラスをテストする

環境

  • Unity 2018.2.10.f1
  • macOS 10.13.6

リポジトリ

こちら にコードがあります。

概要

Unity で MonoBehaviour を継承していない素の C# クラスをユニットテストした記録です。ハマりどころとしては、スクリプトのあるディレクトリで Assembly Definition を追加し、Tests ディレクトリの Tests Import Settings の References に追加する必要があるところでした。

テストディレクトリの追加

メニューバーの Window -> General -> Test Runner から、Create EditMode Test Assembly Folder を追加します。

f:id:iizukak:20180929134708p:plain

Tests ディレクトリができるかと思います。

テスト対象スクリプト

適当なテスト対象のスクリプトを書きます。ここでは単純に 2 つの int の和を計算する静的メソッドを定義しておきました。Assets/Scripts/MyAdder.cs として、

public static class MyAdder
{
    public static int Add(int x, int y)
    {
        return x + y;
    }
}

次に、 Create -> Assembly Definition で、適当な名前で定義を追加します。ここでは ScriptsAssembly という名前で追加しておきます。

f:id:iizukak:20180929220258p:plain

テストスクリプト

テストスクリプトの追加は、Create -> Testing -> Test C# Script で追加します。

Tests/Editor/MyAdderTests.cs

using UnityEngine;
using UnityEngine.TestTools;
using NUnit.Framework;
using System.Collections;

public class MyAdderTests
{
    [Test]
    public void MyAdderTestSimple()
    {
        Assert.AreEqual(MyAdder.Add(1, 2), 3);
    }
}

Tests/Tests というファイルのインスペクタに、定義したアセンブリを追加します。 こんなかんじになります。

f:id:iizukak:20180929215604p:plain

テスト実行

Test Runner でテストを実行します。以下の画面のようになるはず。

f:id:iizukak:20180929215734p:plain

分かってしまえば難しくないですが、どうもググる力が足りず少し時間をとられました。

macOS への SDL 2 のインストール方法

環境

SDL 本体

SDL は本体と SDL_Image や SDL_ttf といった周辺ライブラリが分離されていて、必要なライブラリだけインストールできるようになっています。まずは SDL 本体から。

インストール方法

インストールには二種類あって、ドキュメントでいう "the Unix way" と "SDL.framework" があるのですが、これは Unix Way の記事です。

自分の環境では、SDL公式ドキュメント の通りでインストールできました。まず SDLダウンロード して、適当な場所に解凍したあと、

$ mkdir build
$ cd build
$ CC=../build-scripts/gcc-fat.sh ../configure
$ make
$ sudo make install

で完了です。

動作確認

コンパイル時に必要となるフラグですが、 sdl-config というコマンドが同梱されていて、このコマンドで調べることができます。便利。ビルド時に作った build ディレクトリで、

$ ./sdl2-config --cflags --libs
-I/usr/local/include/SDL2 -D_THREAD_SAFE
-L/usr/local/lib -lSDL2

です。

試しにサンプルコードをコンパイルしてみます。

// Example program:
// Using SDL2 to create an application window

#include "SDL.h"
#include <stdio.h>

int main(int argc, char* argv[]) {
    // Show SDL Version
    SDL_version compiled;
    SDL_version linked;

    SDL_VERSION(&compiled);
    SDL_GetVersion(&linked);
    printf("We compiled against SDL version %d.%d.%d ...\n",
           compiled.major, compiled.minor, compiled.patch);
    printf("But we are linking against SDL version %d.%d.%d.\n",
           linked.major, linked.minor, linked.patch);

    SDL_Window *window;                    // Declare a pointer

    SDL_Init(SDL_INIT_VIDEO);              // Initialize SDL2

    // Create an application window with the following settings:
    window = SDL_CreateWindow(
        "An SDL2 window",                  // window title
        SDL_WINDOWPOS_UNDEFINED,           // initial x position
        SDL_WINDOWPOS_UNDEFINED,           // initial y position
        640,                               // width, in pixels
        480,                               // height, in pixels
        SDL_WINDOW_OPENGL                  // flags - see below
    );

    // Check that the window was successfully created
    if (window == NULL) {
        // In the case that the window could not be made...
        printf("Could not create window: %s\n", SDL_GetError());
        return 1;
    }

    // The window is open: could enter program loop here (see SDL_PollEvent())

    SDL_Delay(3000);  // Pause execution for 3000 milliseconds, for example

    // Close and destroy the window
    SDL_DestroyWindow(window);

    // Clean up
    SDL_Quit();
    return 0;
}

main.c というファイル名で保存して、 sdl-config で調べたオプションを追加し、

$ gcc -I/usr/local/include/SDL2 -D_THREAD_SAFE -L/usr/local/lib -lSDL2 main.c

コンパイルできます。実行すると、SDL のバージョンが出力されると思います。その後ウィンドウが作られ、3秒後に終了します。

$ ./a.out 
We compiled against SDL version 2.0.8 ...
But we are linking against SDL version 2.0.8.

SDL_image

画像を扱うときに使うライブラリです。こちらも 公式ドキュメント そのままにインストールすることができました。

SDL2_image-2.0.3.zip を DL して適当な場所に解凍し、

$ ./configure
$ make
$ sudo make install

でオーケーです。

SDL_ttf

SDL でフォントを扱うライブラリです。こちらはインストールに freetype が必要なので事前に homebrew でインストールしておきます。

$ brew install freetype

それ以外は 公式ドキュメント 通りでインストールできました。すなわち、 SDL2_ttf-2.0.14.zip を適当な場所に解答して、

$ ./configure
$ make
$ sudo make install

でオーケーです。

Maker Faire Tokyo 2018 で、"ピクセル化装置" を展示します

なにか

Maker Faire Tokyo 2018 で、ピクセル化装置というものを展示します。何なのかというと、 Raspberry Pi で、 Web カメラの画像を、 LED マトリクスにリアルタイムで表示する装置です。

装置の詳細

Github に記載してあるのでそちらを御覧ください。

どこで見られるか

Maker Faire Tokyo 2018 の KLab Make 部 にて展示します。位置は H09-04 です。ぜひふらっと起こしください。

なぜ作ったか

世の中のディスプレイはどんどん高精細高密度になってきて、最近のスマホや PC だともうピクセルは見えません。そういったご時世に、あえてピクセルを意識させるような装置を作ったら面白いかもな、ということで作ってみた次第です。動画だとあまりわかりませんが、実際はビカビカしています。

ディジタル回路設計とコンピュータアーキテクチャ[ARM版] 翻訳誤り一覧

いわゆる「ハリス&ハリス本」の ARM 版 の評判が良いようなので読んでみました。組み合わせ回路と順序回路の解説から始まり、HDL の導入、ARM のマイクロアーキテクチャの紹介、HDL を用いたシングルサイクルの ARMv4 サブセットの実装と実に盛りだくさんの内容になっています。私は HDL を全く知らない状態で読み始めたのですが、特に詰まるところ無く読み進められました。このような素晴らしい書籍を日本語で読めることに対して、翻訳者の皆様に感謝致します。

ところで、このような専門書にはありがちなことだと思うのですが、本書にも多少なりとも誤訳が含まれているように思われます。ここに自分が違和感を感じた箇所を掲載しておきます。私のミスリードもあるかと思います。ご容赦ください。

p.2

薄い灰色示している

薄い灰色で示している

p.4

…数を表現するかを論じる

日本語として違和感

p.59

Qにはその否定

~Qにはその否定

p.125

コードに「SystemVerilog」という文字列があるが不必要

p.169

コンピュータで稼働するすべてのプログラムは、同じ命令セットを使っている。

「あるコンピュータで」でしょうか

オペランドはメモリから来る場合や、レジスタから来るか場合、あるいは命令自体から来る場合もある。

日本語に違和感。「来るか場合」>「来る場合」

命令を機械語(マシンランゲージ)と呼ばれる形式に符号化される。

符号化する

p.170

通常的ではない

日本語として違和感

人間が読み易くした

人間に読み易くした

命令が実施する演算

演算を実施するというのは一般的な用法か?

p.172

一時変数s

「s」?

p.181

であるという点で普通でないのが、関数からの戻りは〜

訳に違和感

p.183

siddofsums

diffofsums の間違い?

p.185

怖されれる

壊される

p.193

テクスト

テキスト

(SP)スタックの

(SP)をスタックの

GCC基づいている

GCCに基づいている

p.196

リテラルプールを作った

使った

p.201

備える、

備える。

p.204

表6.19

表6.19が何ページに記載されているのか分からなかった

FB08 CPU 製作記 [03 - データフロー図]

それほど進んでいないのですがメモしておきます。まず、現状のデータフローを図に書き起こしました。それが以下です。

f:id:iizukak:20170115153728p:plain

先週からいくつか差分があります。

  • SHIFTR, SHIFTL 命令を廃止しました
    • IC 数を減らす(アキュムレータのバスドライバがなくて済むようになった)のと、コントロールシグナルのピン数(16)がカツカツなので消しました。CPU の命令としてビットシフトできなくなってしまいますが、これはアキュムレータ自分自身の値を足すことで左シフトはできるのでどうにかなるといいな…というかんじ。右シフトをどうするかは要検討。
  • 論理演算命令を追加しました
    • AND, OR, XOR です
  • オペコードを 5bit にしました。
    • 先週までオペコードは 4bit でしたが、1bit 増やしました。これは、単に命令が 16 種類より増えてしまったから。また、SRAM のアドレスが 11bit なので、プログラム ROM のアドレスも 11bit にしてしまったほうが扱いが楽かなというのもあります。

74HC181 が届きました。

f:id:iizukak:20170114143138j:plain

まだまだ設計段階なので少し先走った注文でしたが、こうやってパーツが届くとやる気が少しアップするので、良いです。

以上です。地道に進めます。