回答編集履歴

3 補足2

退会済みユーザー

退会済みユーザー

2017/10/12 07:19  投稿

上の方からザーッと書きます。
ここで感じた疑問は、必ず調べるようにしてくださいね。
---
* 学習データの準備
`f = open(FLAGS.train, 'r')`で読み込む元ファイルを手配
* trainデータ:学習用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
FLAGS.train(変数名:実体はテキストファイル)を開き、一行ずつfor文で読み出す。
OpenCVという画像処理モジュールを使って、画像サイズを一定にそろえる。
行列を高速に処理できるnumpyというモジュール用のデータに変換。
*評価用データの準備
`f = open(FLAGS.test, 'r')`で読み込む元ファイルを手配
* testデータ:評価用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
同上(省略)
※つまるところ、ここでやりたいことは、画像のファイルとその画像が何を表しているかのリストを読み込み、あとで学習用データで学習、ちゃんと学習できたかを評価用データで確認、のデータの段取りをしたいということです。**訓練データ(教師データ)、評価データ(テストデータ)、過学習**がキーワードです。
---
* tenorflowの実体
`with tf.Graph().as_default():`は、tensorflowを使うためのおまじないです
tensorflowでは、箱を先に用意しておいて、後から数値を突っ込むことで計算します。これからしばらく式が続きますが、ここでは式を決めているだけで、まだ実際には計算はしていません。
`tf.placeholder`のあたりで、画像(28px*28px*3ch)の箱とラベル(2クラス)の箱を用意しています。エクセルでいうセルは縦横の二次元のデータ、立方体は縦横高さの三次元のデータ(立体のイメージ)のように、うまく言えないですが軸の数(x)=要素の数(x)=(x)個の要素の配列という感じです。
どうして行列でデータを扱うのが良いのかは、パーセプトロンの話とかバックプロパゲーションとかの話とくっついてくるので、その辺は自力で調べるのが良いと思います(私には説明しきれません)。
**行列、テンソル**がキーワードです。
続いてドロップアウトが出てきます。あんまり学習させすぎると、汎用性が低い仕上がりになります。それを防ぐための機構がドロップアウトです。ネットワークをランダムにぶった切るための確率の値です。**ドロップアウト、過学習**がキーワードです。
`inference`の部分がニューラルネットワークの本体ですね。ここで処理した結果を`logits`に代入となっています。**畳み込み、プーリング**がキーワードです。
一方、`loss`の部分では損失を計算しています。何をやっているかというと、`inference`によって「これが正解かな?」として計算した結果のlogitsとラベルのplaceholderとを比較して、食い違っている部分を`loss`として扱っています。**損失、損失関数**がキーワードです。
`train_op = training(loss_value, FLAGS.learning_rate)`の部分で、先に計算した損失`loss`がなるべく小さくなるように`learning_rate`に従って学習します。**AdamOptimizer、学習率**がキーワードです。
`accuracy`の部分で、「これが正解かな?」として計算した結果の`logits`と、正解ラベル`labels_placeholder`とを比較して、何問中何問正解した、という答え合わせをしていますね。100%正解なら1、50%正解なら0.5が返ってくるはずです。
――という一連の式を`sever`で保存する準備をしたり、`sess`の部分で実際に使う準備をしています。
`summary_writer`の辺は、tensorflowとセットで使うことの多い、tensorboardというグラフをカッコよく分かりやすく表示できるツール用のデータをどうする、というものです。なくても動きます。
ここまでが、計算式のめんどくさい部分です
---
* データをぶん回す処理
`for step in range(FLAGS.max_steps):`のくだりで、バッチ処理を行っています。この場合、バッチサイズは10で定義してあるので、10枚ずつまとめて処理しています。まとめた方が早いけどメモリを食うとかGPUがこけるとかそういう話も出てきます。これが**ミニバッチ**という動作です。画像全体をミニバッチずつ回す感じです。
この後に続く評価の部分は、「学習データの評価(模擬試験の成績)」ですね。模擬試験(学習データ)は本番の試験(テストデータ)を想定して作っていますが、模擬試験(学習データ)ばかりやっていると模擬試験(学習データ)に最適化されて本番の試験(テストデータ)でこける、とかそんなことが起きるのはこの辺の数値で見えてきます。
---
本当はもっと高度なことが行われていますが、tensorflowはこうしためんどくさい行列の計算をとっつきやすくしてくれています。詳しくはqiitaやstackoverflowを参照されるとよいと思います。
畳み込みやプーリングがいまいちわからない、という場合には、[3Dに可視化したもの](http://scs.ryerson.ca/~aharley/vis/conv/)をみるとイメージがつかみやすいのではないでしょうか。
---
**10/12 1:50追補**
> 畳み込み,プーリングの意味がいまいち分かりません
畳み込みは、フィルタ(カーネル)をスライドさせながら特徴を抽出していく処理です。最近CNNでよく出てきますが、なんちゃってラプラス変換だとかあれやこれやと古くからある処理です。**本質的に畳み込み処理はエッジ検出機**とみてよいと思います。通常のエッジ検出では使わないフィルタを使うことで、物体の細かい違いを表現できる、とでもいうのでしょうか。[このへん](http://hokuts.com/2016/12/13/cnn1/)が参考になると思います。
一方プーリングは、フィルタはなく、機械的に代表値をピックアップしていく処理です。データが小さくなるメリットと、多少ズレてもズレを代表値をピックアップする中で潰していけますよね。
一方プーリングは、フィルタはなく、機械的に代表値をピックアップしていく処理です。代表値をピックアップする中、画像が大幅に小さくなる=計算量が小さくなるメリットと、多少対象物が左右上下にズレてもズレを吸収できるメリットがありますね。
> なぜ層を重ねると精度が上がるのか分かりません
**線形分離問題、パーセプトロン**、がキーワードです。一つ言えることは、CNNの初期段階では細かいエッジを、後半では何か本質的なものを評価します。例えば、浅い層では「斜めの線」が、深い層では「犬」のような感じです。
一つ言えることは、CNNの初期段階では細かいエッジを、後半では何か本質的なものを評価します。例えば、浅い層では「斜めの線」が、深い層では「犬」のような感じです。ただのエッジを本質的なものに変換しやすくなるとでもいうのでしょうか。線形分離しかできないパーセプトロンをたくさん重ねることで表現力が上がり、非線形分離できるようになります。層を増やすことはエクセルの散布図でいう近似曲線の次元数を増やすことと同じイメージです。次元が多いほど最適化されていきますが、ムダにグニャグニャして無理にフィッティングしているためデータのないところは大きく外れます。これが過学習と同じ現象です。これをデータ数やドロップアウトなどで抑えているような感じです。**線形分離問題、パーセプトロン**、がキーワードです。
> interfaceの部分が具体的にどのような処理をしているのか
畳み込み、プーリングの実体ですね。私の理解での説明ですが、これらを読んで調べて、それでも分からない部分を改めて別の質問で上げるべきだと私は思います。
畳み込み、プーリングの実体ですね。ここまでは私の理解での説明ですが、これらを読んで調べて、もう一度interfaceの部分を眺めて、それでも分からない部分を改めてピンポイントに別の質問で上げるべきだと、私は思います。
2 誤植修正

退会済みユーザー

退会済みユーザー

2017/10/12 07:06  投稿

上の方からザーッと書きます。
ここで感じた疑問は、必ず調べるようにしてくださいね。
---
* 学習データの準備
`f = open(FLAGS.train, 'r')`で読み込む元ファイルを手配
* trainデータ:学習用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
FLAGS.train(変数名:実体はテキストファイル)を開き、一行ずつfor文で読み出す。
OpenCVという画像処理モジュールを使って、画像サイズを一定にそろえる。
行列を高速に処理できるnumpyというモジュール用のデータに変換。
*評価用データの準備
`f = open(FLAGS.test, 'r')`で読み込む元ファイルを手配
* testデータ:評価用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
同上(省略)
※つまるところ、ここでやりたいことは、画像のファイルとその画像が何を表しているかのリストを読み込み、あとで学習用データで学習、ちゃんと学習できたかを評価用データで確認、のデータの段取りをしたいということです。**訓練データ(教師データ)、評価データ(テストデータ)、過学習**がキーワードです。
---
* tenorflowの実体
`with tf.Graph().as_default():`は、tensorflowを使うためのおまじないです
tensorflowでは、箱を先に用意しておいて、後から数値を突っ込むことで計算します。これからしばらく式が続きますが、ここでは式を決めているだけで、まだ実際には計算はしていません。
`tf.placeholder`のあたりで、画像(28px*28px*3ch)の箱とラベル(2クラス)の箱を用意しています。エクセルでいうセルは縦横の二次元のデータ、立方体は縦横高さの三次元のデータ(立体のイメージ)のように、うまく言えないですが軸の数(x)=要素の数(x)=(x)個の要素の配列という感じです。
どうして行列でデータを扱うのが良いのかは、パーセプトロンの話とかバックプロパゲーションとかの話とくっついてくるので、その辺は自力で調べるのが良いと思います(私には説明しきれません)。
**行列、テンソル**がキーワードです。
続いてドロップアウトが出てきます。あんまり学習させすぎると、汎用性が低い仕上がりになります。それを防ぐための機構がドロップアウトです。ネットワークをランダムにぶった切るための確率の値です。**ドロップアウト、過学習**がキーワードです。
`inference`の部分がニューラルネットワークの本体ですね。ここで処理した結果を`logits`に代入となっています。**畳み込み、プーリング**がキーワードです。
一方、`loss`の部分では損失を計算しています。何をやっているかというと、`inference`によって「これが正解かな?」として計算した結果のlogitsとラベルのplaceholderとを比較して、食い違っている部分を`loss`として扱っています。**損失、損失関数**がキーワードです。
`train_op = training(loss_value, FLAGS.learning_rate)`の部分で、先に計算した損失`loss`がなるべく小さくなるように`learning_rate`に従って学習します。**AdamOptimizer、学習率**がキーワードです。
`accuracy`の部分で、「これが正解かな?」として計算した結果の`logits`と、正解ラベル`labels_placeholder`とを比較して、何問中何問正解した、という答え合わせをしていますね。100%正解なら1、50%正解なら0.5が返ってくるはずです。
――という一連の式を`sever`で保存する準備をしたり、`sess`の部分で実際に使う準備をしています。
`summary_writer`の辺は、tensorflowとセットで使うことの多い、tensorboardというグラフをカッコよく分かりやすく表示できるツール用のデータをどうする、というものです。なくても動きます。
ここまでが、計算式のめんどくさい部分です
---
* データをぶん回す処理
`for step in range(FLAGS.max_steps):`のくだりで、バッチ処理を行っています。この場合、バッチサイズは10で定義してあるので、10枚ずつまとめて処理しています。まとめた方が早いけどメモリを食うとかGPUがこけるとかそういう話も出てきます。これが**ミニバッチ**という動作です。画像全体をミニバッチずつ回す感じです。
この後に続く評価の部分は、「学習データの評価(模擬試験の成績)」ですね。模擬試験(学習データ)は本番の試験(テストデータ)を想定して作っていますが、模擬試験(学習データ)ばかりやっていると模擬試験(学習データ)に最適化されて本番の試験(テストデータ)でこける、とかそんなことが起きるのはこの辺の数値で見えてきます。
---
本当はもっと高度なことが行われていますが、tensorflowはこうしためんどくさい行列の計算をとっつきやすくしてくれています。詳しくはqiitaやstackoverflowを参照されるとよいと思います。
畳み込みやプーリングがいまいちわからない、という場合には、[3Dに可視化したもの](http://scs.ryerson.ca/~aharley/vis/conv/)をみるとイメージがつかみやすいのではないでしょうか。
---
**10/12 1:30追補**
**10/12 1:50追補**
> 畳み込み,プーリングの意味がいまいち分かりません
 
畳み込みは、フィルタ(カーネル)をスライドさせながら特徴を抽出していく処理です。最近CNNでよく出てきますが、なんちゃってラプラス変換だとかあれやこれやと古くからある処理です。**本質的に畳み込み処理はエッジ検出機**とみてよいと思います。通常のエッジ検出では使わないフィルタを使うことで、物体の細かい違いを表現できる、とでもいうのでしょうか。[このへん](http://hokuts.com/2016/12/13/cnn1/)が参考になると思います。
一方プーリングは、フィルタはなく、機械的に代表値をピックアップしていく処理です。データが小さくなるメリットと、多少ズレてもズレを代表値をピックアップする中で潰していけますよね。
> なぜ層を重ねると精度が上がるのか分かりません
**線形分離問題、パーセプトロン**、がキーワードです。一つ言えることは、CNNの初期段階では細かいエッジを、後半では何か本質的なものを評価します。例えば、浅い層では「斜めの線」が、深い層では「犬」のような感じです。
> interfaceの部分が具体的にどのような処理をしているのか
畳み込み、プーリングの実体ですね。私の理解での説明ですが、これらを読んで調べて、それでも分からない部分を改めて別の質問で上げるべきだと私は思います。
1 追補

退会済みユーザー

退会済みユーザー

2017/10/12 01:53  投稿

上の方からザーッと書きます。
ここで感じた疑問は、必ず調べるようにしてくださいね。
---
* 学習データの準備
`f = open(FLAGS.train, 'r')`で読み込む元ファイルを手配
* trainデータ:学習用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
FLAGS.train(変数名:実体はテキストファイル)を開き、一行ずつfor文で読み出す。
OpenCVという画像処理モジュールを使って、画像サイズを一定にそろえる。
行列を高速に処理できるnumpyというモジュール用のデータに変換。
*評価用データの準備
`f = open(FLAGS.test, 'r')`で読み込む元ファイルを手配
* testデータ:評価用画像ファイル・ラベルの読み込み
`for line in f:`のくだり
同上(省略)
※つまるところ、ここでやりたいことは、画像のファイルとその画像が何を表しているかのリストを読み込み、あとで学習用データで学習、ちゃんと学習できたかを評価用データで確認、のデータの段取りをしたいということです。**訓練データ(教師データ)、評価データ(テストデータ)、過学習**がキーワードです。
---
* tenorflowの実体
`with tf.Graph().as_default():`は、tensorflowを使うためのおまじないです
tensorflowでは、箱を先に用意しておいて、後から数値を突っ込むことで計算します。これからしばらく式が続きますが、ここでは式を決めているだけで、まだ実際には計算はしていません。
`tf.placeholder`のあたりで、画像(28px*28px*3ch)の箱とラベル(2クラス)の箱を用意しています。エクセルでいうセルは縦横の二次元のデータ、立方体は縦横高さの三次元のデータ(立体のイメージ)のように、うまく言えないですが軸の数(x)=要素の数(x)=(x)個の要素の配列という感じです。
どうして行列でデータを扱うのが良いのかは、パーセプトロンの話とかバックプロパゲーションとかの話とくっついてくるので、その辺は自力で調べるのが良いと思います(私には説明しきれません)。
**行列、テンソル**がキーワードです。
続いてドロップアウトが出てきます。あんまり学習させすぎると、汎用性が低い仕上がりになります。それを防ぐための機構がドロップアウトです。ネットワークをランダムにぶった切るための確率の値です。**ドロップアウト、過学習**がキーワードです。
`inference`の部分がニューラルネットワークの本体ですね。ここで処理した結果を`logits`に代入となっています。**畳み込み、プーリング**がキーワードです。
一方、`loss`の部分では損失を計算しています。何をやっているかというと、`inference`によって「これが正解かな?」として計算した結果のlogitsとラベルのplaceholderとを比較して、食い違っている部分を`loss`として扱っています。**損失、損失関数**がキーワードです。
`train_op = training(loss_value, FLAGS.learning_rate)`の部分で、先に計算した損失`loss`がなるべく小さくなるように`learning_rate`に従って学習します。**AdamOptimizer、学習率**がキーワードです。
`accuracy`の部分で、「これが正解かな?」として計算した結果の`logits`と、正解ラベル`labels_placeholder`とを比較して、何問中何問正解した、という答え合わせをしていますね。100%正解なら1、50%正解なら0.5が返ってくるはずです。
――という一連の式を`sever`で保存する準備をしたり、`sess`の部分で実際に使う準備をしています。
`summary_writer`の辺は、tensorflowとセットで使うことの多い、tensorboardというグラフをカッコよく分かりやすく表示できるツール用のデータをどうする、というものです。なくても動きます。
ここまでが、計算式のめんどくさい部分です
---
* データをぶん回す処理
`for step in range(FLAGS.max_steps):`のくだりで、バッチ処理を行っています。この場合、バッチサイズは10で定義してあるので、10枚ずつまとめて処理しています。まとめた方が早いけどメモリを食うとかGPUがこけるとかそういう話も出てきます。これが**ミニバッチ**という動作です。画像全体をミニバッチずつ回す感じです。
この後に続く評価の部分は、「学習データの評価(模擬試験の成績)」ですね。模擬試験(学習データ)は本番の試験(テストデータ)を想定して作っていますが、模擬試験(学習データ)ばかりやっていると模擬試験(学習データ)に最適化されて本番の試験(テストデータ)でこける、とかそんなことが起きるのはこの辺の数値で見えてきます。
---
本当はもっと高度なことが行われていますが、tensorflowはこうしためんどくさい行列の計算をとっつきやすくしてくれています。詳しくはqiitaやstackoverflowを参照されるとよいと思います。
畳み込みやプーリングがいまいちわからない、という場合には、[3Dに可視化したもの](http://scs.ryerson.ca/~aharley/vis/conv/)をみるとイメージがつかみやすいのではないでしょうか。
畳み込みやプーリングがいまいちわからない、という場合には、[3Dに可視化したもの](http://scs.ryerson.ca/~aharley/vis/conv/)をみるとイメージがつかみやすいのではないでしょうか。
---
**10/12 1:30追補**
> 畳み込み,プーリングの意味がいまいち分かりません
畳み込みは、フィルタ(カーネル)をスライドさせながら特徴を抽出していく処理です。最近CNNでよく出てきますが、なんちゃってラプラス変換だとかあれやこれやと古くからある処理です。**本質的に畳み込み処理はエッジ検出機**とみてよいと思います。通常のエッジ検出では使わないフィルタを使うことで、物体の細かい違いを表現できる、とでもいうのでしょうか。[このへん](http://hokuts.com/2016/12/13/cnn1/)が参考になると思います。
一方プーリングは、フィルタはなく、機械的に代表値をピックアップしていく処理です。データが小さくなるメリットと、多少ズレてもズレを代表値をピックアップする中で潰していけますよね。
> なぜ層を重ねると精度が上がるのか分かりません
**線形分離問題、パーセプトロン**、がキーワードです。一つ言えることは、CNNの初期段階では細かいエッジを、後半では何か本質的なものを評価します。例えば、浅い層では「斜めの線」が、深い層では「犬」のような感じです。
> interfaceの部分が具体的にどのような処理をしているのか
畳み込み、プーリングの実体ですね。私の理解での説明ですが、これらを読んで調べて、それでも分からない部分を改めて別の質問で上げるべきだと私は思います。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る