‫なるほど､ 素晴らしい｡
‫この小さなヘルパー関数は､ 画像を時制の形で返すだけでなく､ ラベルも返すので､
‫タプルの形で返すことができます｡
‫そこで､ この関数を利用して､ データ､ つまり全データを回転させる別の関数を書いてみましょう｡
‫すべてのデータ､ つまりXとY､ データとラベルをサイズのバッチにする方法が必要です｡
‫32.
‫さて､ これで書き留めましょう｡
‫私たちは､ データを時制のタプルに変換する方法を､ このノートブックで自分自身に伝えようとしていることを忘れないでください｡
‫そして､ ここにフォームで行くのです｡
‫画像ラベル｡
‫すべてのデータを回す関数を作ってみましょう｡
‫XとYをバッチにする｡
‫わかりました｡
‫素晴らしい｡
‫さて､ もう一度言いますが､ もしあなたがこのすべてがどこから来たのか不思議に思っているなら､ あらゆる種類のデータロードのための素晴らしい場所は､
‫ドキュメントを読み通すことです｡
‫少し退屈な時もあると思いますが､ 私を信じて､ 最初は分からなくても読み進めてください｡
‫最初はわからなかったんです｡
‫通読してください｡
‫ぜひお試しください｡
‫もう一度､ 試してみてください｡
‫これはなりそうですね｡
‫機能の大きな犬｡
‫ああ､ これはドッグビジョンの研究をしているからこそ､ ふさわしいのですが､ 後々とんでもない時間の節約になりそうです｡
‫では､ やってみましょう｡
‫そこで､ バッチサイズを定義する必要があります｡
‫だから､ 32は良いスタートだと思います｡
‫TensorFlowのデフォルトは32が多いことを覚えておいてください｡
‫だから､ どこかで設定しないと､ おそらくデフォルトは32になる｡
‫でも､ とにかく定義するんです｡
‫では､ データをバッチにするための関数を作って､ 今度はこの関数を通して一緒に書いてみましょう｡
‫また､ 学習データバッチ､ 検証データバッチ､ テストデータバッチのいずれを使用するかによって､
‫いくつかの異なる処理を行うことになります｡
‫なぜなら､ ここにあるのは3つのセットだからです｡
‫というわけで､ この3点セットです｡
‫そこで､ トレーニングセットを用意しました｡
‫それをトレーニングバッチ､ バリデーションバッチ､ テストバッチにするのです｡
‫わかりました｡
‫そこで､ データのバッチを作ることをデフォにしたい｡
‫XとYを取り込むようにしたい｡
‫そして､ 実はその理由は､ 何もないことが多いのです｡
‫今度は､ その理由を考えてみてほしい｡
‫なぜ､ ないのかもしれない｡
‫なぜなら､ なぜ私たちのレーベルなのか？
‫これは多分､ 少ししたらわかると思います｡
‫しかし､ なぜラベルのないデータバッチを作成したいのか､ 考えてみてください｡
‫有効なデータは偽に､ テストデータは偽に相当します｡
‫そして､ 私たちはここに小さなdocstringを残しておきます｡
‫昔､ ロンという同僚がいて､ 彼からラバーダッキングというテクニックを教えてもらいました｡
‫彼は私よりずっと優秀なコーダーで､ 「もしトラブルがあったら」と言ったんです｡
‫コードで何かをする方法を考えるには､ まず言語で書き出すか､ ゴム製のアヒルに話しかけるように言語で自分に言ってみることです｡
‫それに､ ラバーダックは英語があまりわからないので､ はっきり言ってあげないといけないんです｡
‫ロンさんからのアドバイスです｡
‫ロンさん､ ありがとうございます｡
‫そこで､ この関数では､ 画像Xとラベルyの組からデータのバッチを作成する｡
‫トレーニングデータであれば､ データをシャッフルします｡
‫その順番をモデルに覚えてもらっては困るのです｡
‫どんな順番やイメージで来ても､ できるだけ対応できるようにしたい｡
‫しかし､ トレーニングデータであればシャッフルされますが､ 検証データであればシャッフルされないわけです｡
‫では､ なぜ検証データだとシャッフルされないのか､ 考えてみてほしい｡
‫心配しないでください､ 私たちはそれをカバーしますが､ その間､ ちょっと考えてみてください｡
‫また､ テストデータの入力も可能です｡
‫さて､ その理由はこうだ｡
‫なぜ､ ないのかもしれない｡
‫なぜなら､ テストデータには当然ラベルがありません｡
‫今すぐ
‫同じようなことをする関数を作りたいのですが､ 有効なデータかテストデータか､ if節やelif節があります｡
‫だから､ 自分たちがやりたいことはなんとなくわかっているんです｡
‫そして､ 有効なデータかテストデータかを判断するための条件をいくつか用意しています｡
‫では､ まずは一番少ないと思うので､ テストデータから｡
‫そこで､ もしそのデータがテストデータセットであった場合｡
‫おそらく､ そうではないでしょう｡
‫テストデータセットであれば､ ラベルがないことが分かっているところに､ 間違いなくラベルがあった､ と書こうとしていました｡
‫だから､ テストデータなら行きますよ｡
‫プリントする｡
‫ちょっと､ ちょっと､ 気を引き締めていきましょう｡
‫私は､ 自分自身にちょっとした注意を促すのが好きです｡
‫どうしたんだ？
‫テストデータのバッチを作成するのは､ 後で､ ちょっと､ いくつかのデータバッチを作るときに､ 誤ってテストデータに誤ったパラメータを渡してしまい､
‫テストデータに対して異なる処理をしてしまうことを確認するためです｡
‫そんなことは望んでいない｡
‫テストバッチを作っていることが知りたいのです｡
‫つまり､ データはTFTPデータのデータセットに等しいのです｡
‫これがTensorFlowのデータにおけるモジュールなんですね｡
‫私たちは基本的にバッチデータセットを作っているのですが､ ここでちょっと面白いのがテンソルスライスの方です｡
‫そこで､ データセット､ aを作成します｡ k. a. は､ 与えられた時制のスライスを要素とするTensorFlowデータセットに過ぎない｡
‫つまり､ 基本的には時制をいくつか渡せば､ そこからデータセットを作るということです｡
‫少しわかりにくいが､ これはTensorFlowのtf constant xで行われる方法である｡
‫つまり､ 基本的にはTensorFlowのデータセットを作成するということです｡
‫天地無用スライスから
‫Xと､ XをT定数に渡しているので､ Xをテンソルに変えてしまうのです｡
‫つまり､ これはファイルパスだけなのです｡
‫ラベルはありません｡
‫なるほど｡
‫そして今､ データバック｡
‫ここでTensorFlowのデータセットにするのですが､ 今ならこれでXを全てデータセットにしますからね｡
‫それをバッチサイズ32にする必要があります｡
‫だから､ イコールデータ形式なんです｡
‫画像を加工する必要があります｡
‫そして､ それを一括のバッチサイズにする必要があります｡
‫おっと
‫いろいろなことが起きていますね｡
‫ダニエル､ どうしたんだ？
‫さて､ 上の行で話をしましたが､ この行は､ 基本的にこのデータ､ つまりXでできたTensorFlowのデータセットを取るということを言っているのです｡
‫これは､ ファイル名を時制で表現し､ プロセスイメージ機能をマッピングしたものです｡
‫ほら､ こうして関数にすることで､ プロセス・イメージと呼べるようになったわけです｡
‫ファイル名に対して､ これらのステップをすべて実行することになるのです｡
‫だから､ それをインポートして､ 正規化された時制に変えて､ バッチサイズのバッチにするんだ｡
‫ここに行こう｡
‫だからTensorFlowのデータバッチ｡
‫これは､ 私がいつでも見ているときのワークフローです｡
‫機能です｡
‫だから､ 戻れば｡
‫これでよしとしよう｡
‫バッチリです｡
‫このデータセットの連続する要素をバッチに結合する｡
‫これでよしとしよう｡
‫つまり､ 8つの範囲を渡して3つのバッチにしたい場合､ 8つを3つのバッチに分割することになります｡
‫それこそなんで新しいタブになってるんだ？
‫ここでは､ サイズ32の時点以外ではそうなっています｡
‫素晴らしい｡
‫これがテストデータですね｡
‫ここで､ データが有効なデータセットであれば､ シャッフルする必要はない､ ということをやってみたいのです｡
‫さて､ もう一度考えてみてほしいのですが､ なぜシャッフルする必要がないのでしょうか？
‫まったくわからなくても大丈夫です｡
‫私もこれで何度もバレました｡
‫そこで､ ここに小さな進捗状況を表示し､ これとほぼ同じことを行います｡
‫それをそのままコピーしてもいいのですが､ 書き出す練習をするのです｡
‫TFFデータです｡
‫からのデータセット｡
‫テンソルスライス｡
‫さて､ ここからが本題です｡
‫検証セットにはラベルがあるため
‫これにXとTF定数yのカップルを渡すのです｡
‫つまり､ ファイル名とラベルを時制に変えるだけです｡
‫そして､ ここにファイルパスができました｡
‫ラベル
‫これで､ TensorFlowのデータセットができました｡
‫検証用データセットなので､ 画像ファイルのポットやラベルの
‫検証データセットにはラベルがあるので､ 上と全く同じように､ データバッチ・イコール・データマップにします｡
‫画像を加工して､ バッチサイズのバッチにする｡
‫ああ｡
‫トリガーハッピーになる｡
‫素晴らしい｡
‫そして､ データバッチを返す｡
‫そして最後に､ どれもうまくいかない場合､ 有効データが偽で､ テストデータも偽であれば､ 当然トレーニングバッチになるわけですが､ そのような場合はどうすればいいのでしょうか｡
‫そこで､ トレーニングデータのバッチを作成してきます｡
‫ボム､ ボム､ ボム｡
‫そして､ レッツゴー｡
‫ですから､ トレーニングデータセットであれば､ シャッフルしたいのです｡
‫ここが唯一の違いです｡
‫そこで､ ファイルパスやラベルを時制に変えてきたいと思います｡
‫ですから､ 検証の時と同じように､ これをコピーすればいいのです｡
‫さて､ 同じ機能を持つこの関数を書くにはもっと効率的な方法があるかもしれませんが､
‫何が起こっているのかがよくわかるように書くことにしました｡
‫コンスタントXと言ったように､ かなり理解しやすいと言ったかもしれません｡
‫でも､ もしあなたが初めてこのようなものに出会ったのなら､ 信じてください｡
‫しかし､ 一歩一歩進めていくと､ 関数を分解するテクニックがあるのを覚えていますか？
‫一行ずつ書き出し､ 各行で何をしているかをチェックします｡
‫そこで､ マッピングの前にパス名とラベルをシャッフルしておきたい｡
‫画像のシャッフルよりも､ 画像処理機能のマッピングの方が高速であることは､ 後ほど説明します｡
‫コードを書くだけなので､ 話は簡単です｡
‫でも､ データシャッフル｡
‫バッファーはため息をつく｡
‫つまり､ バッファサイズは､ どれだけの変数をシャッフルするかということを表しているだけなのです｡
‫全体をシャッフルしたい｡
‫まあ､ いろいろとあるんですよ｡
‫つまり､ このデータをTensorFlowのデータセットとして､ ファイル名とラベルをシャッフルして､
‫例数をシャッフルしたい､ ということです｡
‫100個だけシャッフルした場合､ XとYの最初の100個の例を取ってシャッフルする｡
‫でも､ いや､ 全部シャッフルしたいんです｡
‫そして､ その理由は､ 私たちがマップ機能を実行した後､ 後で他のチュートリアルのシャッフルを見るかもしれないからです｡
‫データマップです｡
‫プロセス
‫画像はイメージです｡
‫ですから､ すでに画像を処理した後にシャッフルを行った場合､ ファイル名だけのシャッフルよりも､ 画像全体のシャッフルに時間がかかります｡
‫ですから､ 先ほど申し上げたように､ 実験と実験の間の時間を最小限にすることを忘れないでください｡
‫だから､ 少しでもスピードアップを図りたい｡
‫今気づいたのですが､ 私たちはここでちょっとしたミスを犯してしまいました｡
‫あるため､ 私たちの検証用データセットでは
‫画像とラベル
‫画像を処理する関数､ get image labelをマッピングする必要があります｡
‫一方､ 今回のテストデータセットでは､ ラベルがないため､ 直接処理画像関数を実行することができます｡
‫では､ このget image labelを置き換えてみましょう､ 同じになりますね｡
‫私たちのために｡
‫トレーニングデータセットで､ 素晴らしい画像ラベルを得ることができます｡
‫そして､ これが何をしているのか､ ちょっとした､ コメントで書き出してくれるかもしれません｡
‫そこで､ 画像ラベルのタプルを作成する｡
‫これにより､ 画像パスも処理前の画像になります｡
‫だから､ できることなら
‫データを最小の形式にしたときにシャッフルする､ a. k. この場合､ フル画像ではなく､ ファイル名で表示されます｡
‫そしていよいよ､ 学習データをバッチにしたいと思います｡
‫つまり､ データバッチはデータバッチに等しいのです｡
‫バッシュはため息をつく｡
‫そして､ ここから外に出ます｡
‫戻る｡
‫データバッシュ
‫ウルフ これはちょっと巨大な機能ですね｡
‫しかし､ 先ほども言ったように､ これは後で多くの時間を節約することになりますから､ それを見てください｡
‫こういう開発ワークスタイルから考えてほしいということを､ 忘れないでください｡
‫ねぇ､ 私､ 後で何かの機能を再利用するつもりなの？
‫まあ､ もしそうなら､ 関数に書き込むんだけどね｡
‫あなたは私よりずっと賢い開発者ですから､ もうご存知でしょう｡
‫昔はただただフワフワと､ 一行一行書いているだけだったんですけどね｡
‫それでは､ 学習用と検証用のデータバッチを作成して､ この関数をテストしてみましょう｡
‫そこで､ データをトレーニングしてきます｡
‫先ほどのビッグドッグの機能を使います｡
‫学習データとしてX train､ 検証データとしてY trainを渡す､ これだけでいい｡
‫そして､ VOデータについては､ データバッチを作成することができます｡
‫X Val.
‫Y Valは有効なデータか？
‫真に等しい｡
‫そして今､ 指をくわえて見ている｡
‫見るべきですね｡
‫当社の印刷進捗状況メッセージです｡
‫はい｡
‫それはすごいですね｡
‫なるほど｡
‫では､ データマッチのさまざまな属性を確認してみましょう｡
‫そのため､ データを試しに使ってみると､ TensorFlowが好む処理方法であるデータバッチの形式になっているのです｡
‫これでよしとしよう｡
‫これがトレーニングデータで､ ここの1枚目です｡
‫なんて書いてあるんだ？
‫シェイプがあるんですね｡
‫なし｡
‫2､ 2､ 4､ 2､ 4､ 3｡
‫これが私たちのイメージです｡
‫バッチサイズには該当しません｡
‫32まで言いましたが､ バッチサイズはフレキシブルであることを忘れてはならないので､ このままなしとするつもりです｡
‫これはちょうど､ 私たちの画像が32のバッチになって､ 2､ 2､ 4､ 2､ 2､ 4､ 3という形になっているわけです｡
‫高さ, 幅, 2 型のカラーチャンネル, float 32.
‫そして､ ここにラベルのタプルを用意しました｡
‫これが時制を表す画像ラベルのペアで､ 私たちのラベルもバッチサイズは自由なので､ バッチの形はなしにしています｡
‫そして､ 彼らは120というディメンションを持っています｡ それは､ 私たちが行けば､ なぜゼロなのか？
‫120種類の犬種があり､ 検証用データもまた同じです｡
‫美しい｡
‫ということで､ かなり突っ込んだ内容でした｡
‫彼のビデオが終わったら､ 数秒後になりますが､ この機能で何が起こっているのか､ もう一度読み返してみてください｡
‫もし確信が持てないのであれば､ 画像の前処理データの読み込みのチュートリアルを調べ､ それを読んでみてください｡
‫そして､ これを本当に書き出すことが一番の学習方法です｡
‫機能を分解して､ 一行ずつ実行してみる｡
‫そうやって､ 自分なりに割り切っています｡
‫しかし､ 現時点でのデータのあり方では､ バッチの概念を初めて知る人には､ まだちょっとわかりにくいかもしれませんね｡
‫おそらく､ とても難しい概念なのでしょう｡
‫今､ 何が起こっているのかわからなくても､ まったく問題ありません｡
‫そこで､ データバッチの中身を確認するときに､ ただ単にごちゃごちゃとした文章を出力させるのではなく､
‫何が起こっているのかを視覚化するための関数を書いてみましょう｡
‫というわけで､ 次回の動画ではそれをご紹介します｡