2018年10月20日土曜日

大長編ドラえもんは少年向けから幼児向けにシフトした論

 先日、2019年公開の映画ドラえもん「のび太の月面探査記」が公開されたようですね。
この機会に大長編ドラえもん全体の感想をまとめておきます。(ただし映画ではなく漫画版)

・1~12作目はSF冒険好き少年向け

大長編ドラえもんの魅力は学校生活の日常から抜け出して宇宙や秘境やら非日常の舞台を冒険するワクワク感にあるわけですが、大長編ドラは「てんとう虫コミックス」のキャッチフレーズ「SF=すこしふしぎ」の枠に留まらずガチなサイエンスフィクション入ってる所が当時の対象読者である小学校中~高学年男子の心に響いたんじゃないかと思っています。例えば「宇宙小戦争」で宇宙空間を行くスネ夫の戦車がピリカ星に着陸するため衛星に紛れて自由落下するも地震計に着陸の振動が記録されず敵に見破られるとかSF的な描写がアツく、また「竜の騎士」では謎の地底世界そのものや四角い聖域の伏線がクライマックスで恐竜絶滅とその回避に繋がっていく壮大さは圧巻でした。私の中で藤子F先生が描くSFドラの集大成と位置づけているのは「雲の王国」です。本作は環境破壊がテーマでありノア計画で地上文明をリセットしようとする天上人の国とドラ達が駆け引きするなどとにかくスケールが大きい。特にドラえもんが「雲もどしガス」で交渉に備えようとするシーンはいかに地上文明の未来かかっているかが伝わってきて緊張しました。

各作品の評価(S,A,B,C,Dの5段階)
1     のび太の恐竜    A
2     のび太の宇宙開拓史 B+
3     のび太の大魔境   B
4     のび太の海底鬼岩城 A
5     のび太の魔界大冒険 A
6     のび太の宇宙小戦争 A+
7     のび太と鉄人兵団  A
8     のび太と竜の騎士  S
9     のび太の日本誕生  B+
10     のび太とアニマル惑星 A+
11     のび太のドラビアンナイト B
12     のび太と雲の王国  S

・13作目からは幼児向けへシフト
残念ながら、私が大長編ドラの集大成と位置づける「雲の王国」を最後にこのシリーズは別物になってしまったと考えています。それは12作目までは硬派なSFや冒険が好きな少年向けだったのが、13作目の「ブリキの迷宮」から次第に幼児向けにシフトしてるように見受けられたからです。もっとも「ブリキの迷宮」は第一次世界大戦をモチーフにした戦闘機や戦車など世界観はさすが藤子先生と思わせる面もあるのですが、そもそも迷宮自体の存在意義が微妙ですしロボット反乱のネタも過去作とかぶり、ラストのコンピュータウィルスでボスロボットが「イートマキマキ」するシーンが4作目の海底鬼岩城のボス打破のシーンとは明らかに別の読者層、つまり小学校低学年かそれ未満をターゲットにしてるように感じるのです。ターゲット低年齢化の傾向は迷宮以降も続き、特に16作目ではのび太が敵を石鹸水の入った水鉄砲(!)でやっつけるシーンがあるのです。初期作ではショックガンを駆使して生きるか死ぬかのアクションを繰り広げていたのび太が水鉄砲ではねえ…。

13     のび太とブリキの迷宮 C
14     のび太と夢幻三剣士  C
15     のび太の創世日記   B
16     のび太と銀河超特急  C
17     のび太のねじ巻き都市冒険記 C
18     のび太の南海大冒険
19     のび太の宇宙漂流記
20     のび太の太陽王伝説
21     のび太と翼の勇者たち
22     のび太とロボット王国
23     のび太とふしぎ風使い
24     のび太のワンニャン時空伝

総括としては、12作目「雲の王国」を最後にSF冒険活劇としての大長編ドラえもんは終わってしまったかなと考えます。最新作「月面探査記」が大人でも楽しめる作品であるといいな。


2018年5月6日日曜日

tiny-dnnでディープニューラルネット超入門

最近話題のディープニューラルネットを使って色々応用できたらいいなぁと思ったのでtiny-dnnを使って入門してみることにしました。tensorflowとか有名どころのnnプラットフォームはみんなpythonなので、C++で使えるtiny-dnnは数少ない選択肢で非常に有り難いです。以前、仕事で画像判別にOpenCV機械学習ライブラリのCvANN_MLPを使ったことあるので似たようなクラス判別処理のスケルトンをtiny-dnnで実装してみます。

このtiny-dnnですが、C++11のテンプレート機能をゴリゴリ使っているためコンパイラがかなり最近のものに限定されます。
  • C++ Builder XE3 … 少し古いためC++11が部分対応なのでコンパイル不可
  • Visual C++ 2017 … コンパイラのテンプレート展開のバグらしく、不可解なエラーが出てコンパイル不可
  • Visual C++ 2015 … 正式に対応が謳われているため問題なし
なのでVC2015を使うことに決定。

どんなニューラルネットを作るか?
以下のような単純な4次元の入力データを4つ用意し、それぞれクラス0,1に分類するだけの超簡単なクラス判別NNを作成してみます。
S1 = [1,0,1,0] ; クラス0
S2 = [0,1,0,1] ; クラス0
S3 = [1,1,0,0] ; クラス1
S4 = [0,0,1,1] ; クラス1
入力データが4次元なので入力層は4点、 クラスが2つなので出力層は最低2点あれば良いことになります。
また、一層のパーセプトロンでは線形判別できないので、中間層は32点結合の3層としました。

#define _SCL_SECURE_NO_WARNINGS
#include <tiny_dnn/tiny_dnn.h>
using namespace tiny_dnn;
using namespace tiny_dnn::layers;

void main(int argc,...)
{
    //-------------------------------------------------------------
    // ニューラルネットの構造を定義
    //-------------------------------------------------------------

    network<sequential> net;
    net << fc(4, 32)  << activation::tanh()
        << fc(32, 32) << activation::tanh()
        << fc(32, 32) << activation::tanh()
        << fc(32, 3)  << activation::softmax();

    //-------------------------------------------------------------
    // 学習データ(ベクトルの次元 = 入力層の点数)
    //-------------------------------------------------------------

    vec_t sample1;
    vec_t sample2;
    vec_t sample3;
    vec_t sample4;

    sample1.assign(4, 0);
    sample1[0] = 1;
    sample1[2] = 1;

    sample2.assign(4, 0);
    sample2[1] = 1;
    sample2[3] = 1;

    sample3.assign(4, 0);
    sample3[0] = 1;
    sample3[1] = 1;

    sample4.assign(4, 0);
    sample4[2] = 1;
    sample4[3] = 1;

    std::vector<vec_t >  trainData;
    std::vector<label_t> trainLabels;

    trainData.assign(4, vec_t()); // クラス分類数
    trainData[0] = sample1;
    trainData[1] = sample2;
    trainData[2] = sample3;
    trainData[3] = sample4;

    // 教師データ
    // 学習サンプルがどのクラスに属するかを教示するデータ。
    // クラス番号は 0 to 出力層の点数M-1 の範囲。

    trainLabels.assign(4, 0);
    trainLabels[0] = 0;
    trainLabels[1] = 0;
    trainLabels[2] = 1;
    trainLabels[3] = 1;

    //-------------------------------------------------------------
    // 学習実行
    //-------------------------------------------------------------

    adagrad optimizer;

    if (!net.train<mse>(optimizer, trainData, trainLabels, 1, 200))
    {
        printf("train - error");
        return;
    }

    //-------------------------------------------------------------
    // 未知データを判定
    //-------------------------------------------------------------

    for(int i=0;i<trainData.size();++i)
    {
        printf("predict #%d\n", i+1);

        tensor_t result;
        std::vector<vec_t> unknownData;
        unknownData.assign(1, vec_t());

        unknownData[0] = trainData[i]; // 学習に使ったデータを判定してみる
  
        result = net.predict(unknownData);

        vec_t vec = result[0];

        for (int i = 0; i < vec.size(); ++i)
            printf("Class%d : %0.2f\n", i, vec[i]);

        printf("\n");
    }

2018年2月12日月曜日

艦これプライズフィギュア SPM 陸奥

先々月にゲーセンで取ってきた艦これのプライズフィギュア陸奥ですが、艤装と別々の景品になっており流石にクオリティが高いです。