【Keras】学習の初歩【犬猫判別1】

 

こんにちは、のっくん(@yamagablog)です。

 

ようやくGPUでディープラーニングができるようになったので、犬と猫の画像を判別してみたいと思います。

 

パソコンを買ってからGPUを設定するまでの苦労話は以下の記事にまとめてあります。

 

ドスパラでGPU搭載PCを買ってみた

【Ubuntu】TensorflowやKerasをGPUで動かす方法

 

いやー長かった。動かせるようになっただけで満足ですが、せっかくなので何かコードを書いてみたいと思います。

 

スポンサーリンク

 

使用するデータセット

 

kaggleというサイトから犬と猫の画像データセットをダウンロードします。

 

https://www.kaggle.com/c/dogs-vs-cats/data

 

25000枚ほど入ったzipファイルがありますのでその一部を使います。

 

ディレクトリの作成

 

訓練、検証、テスト用のディレクトリを作ります。それぞれのフォルダには犬と猫のそれぞれのフォルダを作っておきます。

 

 

ファイルのコピー

 

オリジナルのデータセットから以下の枚数だけ、上で作成したディレクトリにコピーしたいと思います。

  • 訓練用 – 2000枚
  • 検証用 – 1000枚
  • テスト用 – 1000枚

 

訓練用画像のコピー

 

犬、猫、それぞれ1000枚の画像をそれぞれ訓練用画像にします。

ファイル名は、cat.{0-999}.jpgのように連番になっているので、0-999の数字をfor文で回します。以下の例ではリスト内包表記で書いています。

 

 

検証用画像のコピー

 

犬と猫、それぞれ500枚ずつを検証用画像とします。

 

 

テスト用画像

 

テスト用画像も同様です。

 

 

ファイル数の確認

 

ファイル数の確認には、os.listdirの長さを数えます。

 

出力は以下の通り。

 

ネットワークの作成

 

ネットワークを作成します。

 

最後の層の活性化関数には、sigmoidを使います。

 

 

今回のような2値分類では、活性化関数は「sigmoid」、損失関数は「binary_crossentropy」を使うのが一般的みたい。

 

データの前処理

 

学習にかけるためには、画像ファイルに以下の前処理をしておきます。

  1. 画像ファイルを読み込む。
  2. 浮動小数点数型(float型)にする。
  3. ピクセル値(0-255)を、[0,1]の範囲の値にする

 

kerasのImageDataGeneratorを使うとこの処理を自動的にやってくれます。

なんて便利なのでしょう。

 

  • target_sizeは、画像のサイズです。上では150,150のサイズにリサイズします。
  • batch_sizeは、一度に処理する画像の枚数です。20枚を1バッチとします。
  • class_modeは、”binary”として二値のラベルを作成します。

 

内容を確認。

 

学習

 

訓練用は2000枚あるので1バッチ20枚処理するとすると100ステップ必要になります。

 

validation_stepsは、評価用のバッチをいくつ取り出すか決めるようです。検証用は1000枚なので、1バッチ20枚とすると、50ステップ指定すれば良いですね。

 

正解率の可視化

 

 

バリデーションの正解率は、70%-74%ほどになっています。

そこそこ分類できているようですね。

 

次はデータ拡張にトライしてみたいと思います。

 

【Keras】水増しとデータ拡張【犬猫判別2】

 

参考

 

4 件のコメント

  • こんにちは, 本記事を参考に私もMLに取り組んでみました!
    この記事の通りに取り組んでいく中で, 疑問点があったのでわかる範囲で回答お願いいたします.
    ①データのラベル付けはどの段階で行っているのか・・・?
    ②こちらで学習した重みモデルで判別した場合のラベルの順番は, ファイルの並びと一致しているのか・・・?

    • コメントありがとうございます!
      読んでくださって感謝しております。
      ①:
      データのラベルづけはflow_from_directoryで行なっています。フォルダ名に従ってラベルをつけています。
      ②:
      すいませんが、「学習した重みモデルで判別した場合のラベルの順番」、というのがよく分かりません。

      • お世話になっております、先日コメントを送信したDaisukeです。
        ①の件、了解しました!
        ②ですが、例えばファイルが「cat, dog」というふうな順番に並んでいる場合、ラベル「0番目:cat, 1番目:dog」と言った感じになるのでしょうか…?

        • ラベルは、ディレクトリごとに割り振られます。
          dogsディレクトリの中にあるファイルは全てdogのラベルがつきます。
          dogsディレクトリの中にcatの画像などを入れるとdogのラベルとして処理されてしまうので、画像が混ざらないように注意が必要です。

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ABOUTこの記事をかいた人

    のっくん

    理系院卒で大企業の研究所に就職。 趣味はプログラミング、レアジョブ英会話、筋トレ、旅行。 Twitter:@yamagablog