質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.96%

InceptionV3モデルでcifar10の画像分類をしたい

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 2
  • VIEW 2,779

renin

score 11

前提・実現したいこと

Kerasで深層学習の勉強をしています。InceptionV3のモデルを利用してcifar10の画像分類をしたいです。

発生している問題・エラーメッセージ

kerasに用意されているApplicationsからモデルをロードしたのですが、cifar10の32*32という小さなサイズには対応しておらず読み込みでエラーが出ます。

/home/***/keras_study/test.py:69: UserWarning: Update your `fit_generator` call to the Keras 2 API: `fit_generator(<keras.pre..., verbose=1, validation_data=(array([[[..., steps_per_epoch=1562, epochs=200, callbacks=[<keras.ca..., max_queue_size=100)`
  callbacks=[lr_reducer, csv_logger])
Traceback (most recent call last):
  File "/home/***/keras_study/test.py", line 69, in <module>
    callbacks=[lr_reducer, csv_logger])
  File "/usr/local/lib/python2.7/dist-packages/keras/legacy/interfaces.py", line 87, in wrapper
    return func(*args, **kwargs)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1777, in fit_generator
    val_x, val_y, val_sample_weight)
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 1234, in _standardize_user_data
    exception_prefix='input')
  File "/usr/local/lib/python2.7/dist-packages/keras/engine/training.py", line 140, in _standardize_input_data
    str(array.shape))
ValueError: Error when checking input: expected input_1 to have shape (None, 299, 299, 3) but got array with shape (10000, 32, 32, 3)

該当のソースコード

from __future__ import print_function
from keras.datasets import cifar10
from keras.preprocessing.image import ImageDataGenerator
from keras.utils import np_utils
from keras.callbacks import ReduceLROnPlateau, CSVLogger
import numpy as np

from keras.applications.inception_v3 import InceptionV3

lr_reducer = ReduceLROnPlateau(factor=np.sqrt(0.1), cooldown=0, patience=5, min_lr=0.5e-6)
csv_logger = CSVLogger('test_cifar10.csv')

batch_size = 32
nb_classes = 10
nb_epoch = 200

# input image dimensions
img_rows, img_cols = 32, 32
# The CIFAR10 images are RGB.
img_channels = 3

# The data, shuffled and split between train and test sets:
(X_train, y_train), (X_test, y_test) = cifar10.load_data()

# Convert class vectors to binary class matrices.
Y_train = np_utils.to_categorical(y_train, nb_classes)
Y_test = np_utils.to_categorical(y_test, nb_classes)

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

# subtract mean and normalize
mean_image = np.mean(X_train, axis=0)
X_train -= mean_image
X_test -= mean_image
X_train /= 128.
X_test /= 128.

model = InceptionV3(weights='imagenet')
model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

# This will do preprocessing and realtime data augmentation:
datagen = ImageDataGenerator(
    featurewise_center=False,  # set input mean to 0 over the dataset
    samplewise_center=False,  # set each sample mean to 0
    featurewise_std_normalization=False,  # divide inputs by std of the dataset
    samplewise_std_normalization=False,  # divide each input by its std
    zca_whitening=False,  # apply ZCA whitening
    rotation_range=10,  # randomly rotate images in the range (degrees, 0 to 180)
    width_shift_range=0.1,  # randomly shift images horizontally (fraction of total width)
    height_shift_range=0.1,  # randomly shift images vertically (fraction of total height)
    shear_range=0.1,
    zoom_range=0.1,
    horizontal_flip=True,  # randomly flip images
    vertical_flip=False)  # randomly flip images

datagen.fit(X_train)

# Fit the model on the batches generated by datagen.flow().
model.fit_generator(datagen.flow(X_train, Y_train, batch_size=batch_size),
                    steps_per_epoch=X_train.shape[0] // batch_size,
                    validation_data=(X_test, Y_test),
                    epochs=nb_epoch, verbose=1, max_q_size=100,
                    callbacks=[lr_reducer, csv_logger])

model_json_str = model.to_json()
open('test_cifar10.json', 'w').write(model_json_str)
model.save_weights('test_cifar10_param.hdf5')

試したこと

cifar10の画像サイズを300*300のように大きくリサイズして通そうとは考えたのですが、その場合元のデータに比べて大きくなりすぎて学習で問題が起こりそうな気がしています。
<追記>
32*32→300*300にリサイズした画像を実際に表示すると、テレビのノイズ画面のような元の画像とかけ離れた画像に変換されており、これでは教師データとして問題があるんじゃないかと考えています。

質問したいこと

cifar10のような小さい画像に対してInceptionV3モデルを適用させる方法があれば、Kerasでの実装方法も含めて教えて頂きたいです。

補足情報(言語/FW/ツール等のバージョンなど)

Keras2.07
Python2.7

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    2017/08/28 22:01

    cifar10のInception V3用へのリサイズは実際にはまだやっていない、ということでしょうか?

    キャンセル

  • renin

    2017/08/28 23:34 編集

    回答ありがとうございます。単純に32→300にリサイズは考えました。しかしリサイズした画像を実際に表示してみると、テレビのノイズ画面のような元の画像とはかけ離れた画像に変換されており、これを教師データとしていいのか判断に困りました。変換した画像を試してはいないです。

    キャンセル

  • 退会済みユーザー

    退会済みユーザー

    2017/08/29 07:19

    cifar10(30*30)の画像をInception v3(300x300)に変更して評価したい。普通に画像を拡大するとノイズが乗るけれども、Q.1綺麗に拡大する方法はあるか?Q.2ノイズが乗っていても拡大後cifar10で正しく(?)Inception v3で動作するか?ということですね。 Q.1の部分のコードと拡大前後の写真があるとより良いと思います。

    キャンセル

回答 1

checkベストアンサー

0

Stackoverflowで同じ質問ようなを発見しました。

Thomas Pinetzさんによれば、
問題点

  • inceptionのモデルは224x224で訓練されている
  • 10x10より小さいいくらかの値までダウンスケーリングされていく
    ∴32x32 3chではうまくいかない
    解決策は3つ
  1. 32x32 --> 224x224まで拡大して、これを初期値にする
  2. ダウンサンプリングフィルタをいくらか外す
  3. ゼロパディングをして解像度をそのまま残す

また、Marcin Możejkoによれば、

  • 入力可能な最小値は (150, 150, 3)で、これより小さいとプーリングもvalid border mode もできない

だそうです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/28 23:48 編集

    回答ありがとうございます。同様の質問を見つけてきて頂き感謝します。やはり入力画像のサイズをどうにかして拡大するか、モデルを改造してダウンサンプリングの回数を減らすかの2つしか方法はなさそうですかね。挙げられた方法をなんとか試していきたいと思います。

    キャンセル

  • 2017/08/29 07:05

    解決策3の「32x32の周りに0をつけて(0パディング)で32x32の解像度を保ったまま画像を見かけ上広げる」、もあるようです。私が探した限り、これらの結果がどうなったかは見つけられませんでした。恐らく誰もやっていない/やっても公開していないことだと思います。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.96%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る