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

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

ただいまの
回答率

89.06%

機械学習を実装中で画像の形状が合いませんどのようにすればよいですか?

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 763

SaitoHiroaki

score 15

import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator

base_dir = base_dir = (r"C:\Users\HN4-00012\Documents\kosen fike\bunnkasai\loads15_data_small")

train_dir = os.path.join(base_dir,'train')
validation = os.path.join(base_dir,'validation')
test_dir = os.path.join(base_dir,'test')

datagen = ImageDataGenerator(rescale=1./255)
batch_size = 20

def extract_features(directory, sample_count):
    features = np.zeros(shape=(sample_count, 4, 4, 512))
    labels = np.zeros(shape=(sample_count))
    generator = datagen.flow_from_directory(directory,
                                            target_size=(150,150),
                                            batch_size=batch_size,
                                            class_mode='binary')
    i=0
    for inputs_batch, labels_batch in generator:
        features_batch = conv_base.predict(inputs_batch)
        features[i * batch_size : (i + 1) * batch_size] = features_batch
        labels[i * batch_size : (i + 1) * batch_size] = labels_batch
        i += 1
        if i * batch_size >= sample_count:
            break

    return features, labels



train_features, train_labels = extract_features(train_dir, 2000)
validation_features, validation_labels = extract_features(validation_dir,
                                                          1000)
test_features, test_labels = extract_features(test_dir, 1000)

train_features = np.reshape(train_features, (2000, 4 * 4 * 512))
validation_features = np.reshape(validation_features, (1000, 4* 4 * 512))
test_features = np.reshape(test_features, (1000, 4 * 4 * 512))


エラーが
Found 847 images belonging to 3 classes.


ValueError                                Traceback (most recent call last)
<ipython-input-8-d96131adac5a> in <module>()
32 
33 
---> 34 train_features, train_labels = extract_features(train_dir, 2000)
35 validation_features, validation_labels = extract_features(validation_dir,
36                                                           1000)

<ipython-input-8-d96131adac5a> in extract_features(directory, sample_count)
22     for inputs_batch, labels_batch in generator:
23         features_batch = conv_base.predict(inputs_batch)
---> 24         features[i * batch_size : (i + 1) * batch_size] = features_batch
25         labels[i * batch_size : (i + 1) * batch_size] = labels_batch
26         i += 1

ValueError: could not broadcast input array from shape (7,4,4,512) into shape (20,4,4,512)

です
解決方法を教えてください!

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

以下のようにしてみてはどうでしょうか。

import os
import numpy as np
from keras.preprocessing.image import ImageDataGenerator

base_dir = (r'C:\Users\HN4-00012\Documents\kosen fike\bunnkasai\loads15_data_small')
train_dir = os.path.join(base_dir,'train')
validation_dir = os.path.join(base_dir,'validation')
test_dir = os.path.join(base_dir,'test')

datagen = ImageDataGenerator(rescale=1./255)

def extract_features(dirpath):
    features = []
    labels = []
    generator = datagen.flow_from_directory(
        dirpath, target_size=(150, 150), batch_size=32, class_mode='categorical')

    num_steps = len(generator)
    for step, (img_batch, label_batch) in enumerate(generator, 1):
        print('step: {}, img_batch: {}, label_batch: {}'.format(
            step, img_batch.shape, label_batch.shape))

        feat_batch = conv_base.predict(img_batch)
        features.extend(feat_batch)
        labels.extend(label_batch)

        if step >= num_steps:
            break

    features = np.array(features)
    features = features.reshape(len(features), -1)
    labels = np.array(labels).astype(int)
    return features, labels

train_features, train_labels = extract_features(train_dir)
validation_features, validation_labels = extract_features(validation_dir)
test_features, test_labels = extract_features(test_dir)
  • datagen.flow_from_directory() で3クラス以上の場合は class_mode='categorical' を指定します。
  • ステップ数は num_steps = len(generator) で取得できるので、if step >= num_steps で break すればよいです。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/10/11 19:48

    1次元に潰す以前に同じエラーが出てしまいます。
    なぜ、何でしょうか?

    キャンセル

  • 2018/10/11 20:38

    回答を修正しました。
    おそらく出力の形状と、np.zeros で確保した配列の形状があっていないのではないでしょうか?
    予め確保しなくてもリストに詰めておいて、最後に numpy 配列にすればいいかと思います。

    キャンセル

  • 2018/10/13 08:05

    実行してみたら出来ました!
    ありがとうございます!

    キャンセル

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

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

関連した質問

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