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

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

ただいまの
回答率

90.51%

  • Python 3.x

    9841questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    920questions

  • NumPy

    644questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

「Error when checking model input」のエラーで困っています

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,383

tsurutake

score 3

前提・実現したいこと

PythonでUnityのシミュレーターを動かしたいが、コンパイルできずに止まってしまっています。
エラーを解決してシュミレーションしたいです。

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

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-8-0c1d7921604c> in <module>()
     33 
     34 model.compile(optimizer='adam', loss='mse')
---> 35 model.fit(X_train,y_train,validation_split=0.2,shuffle=True)
     36 model.save('model.h5')

C:\Users\kom\Anaconda3\envs\carnd-term1\lib\site-packages\keras\models.py in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, **kwargs)
    670                               class_weight=class_weight,
    671                               sample_weight=sample_weight,
--> 672                               initial_epoch=initial_epoch)
    673 
    674     def evaluate(self, x, y, batch_size=32, verbose=1,

C:\Users\kom\Anaconda3\envs\carnd-term1\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, nb_epoch, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch)
   1115             class_weight=class_weight,
   1116             check_batch_axis=False,
-> 1117             batch_size=batch_size)
   1118         # prepare validation data
   1119         if validation_data:

C:\Users\kom\Anaconda3\envs\carnd-term1\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_batch_axis, batch_size)
   1028                                    self.internal_input_shapes,
   1029                                    check_batch_axis=False,
-> 1030                                    exception_prefix='model input')
   1031         y = standardize_input_data(y, self.output_names,
   1032                                    output_shapes,

C:\Users\kom\Anaconda3\envs\carnd-term1\lib\site-packages\keras\engine\training.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    110                                  ' to have ' + str(len(shapes[i])) +
    111                                  ' dimensions, but got array with shape ' +
--> 112                                  str(array.shape))
    113             for j, (dim, ref_dim) in enumerate(zip(array.shape, shapes[i])):
    114                 if not j and not check_batch_axis:

ValueError: Error when checking model input: expected flatten_input_7 to have 4 dimensions, but got array with shape (2279, 1)

該当のソースコード(Python3.5)

import csv
import cv2
import numpy as np

lines = []
with open('./data/driving_log.csv') as csvfile:
  reader = csv.reader(csvfile)
  for line in reader:
    lines.append(line)

images = []
measurements = []
for line in lines:
  source_path = line[0]
  tokens = source_path.split('/')
  filename = tokens[-1]
  local_path = "\data\IMG\" + filename
  image = cv2.imread(local_path)
  images.append(image)
  measurement = line[3]
  measurements.append(measurement)

X_train = np.array(images)
y_train = np.array(measurements)

import keras
from keras.models import Sequential
from keras.layers import Flatten, Dense

model = Sequential()
model.add(Flatten(input_shape=(160,320,3)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')
model.fit(X_train,y_train,validation_split=0.2,shuffle=True)
model.save('model.h5')

試したこと

1.Stackoverflowにて同じような問題があり、参考にしようとしましたが、解決方法が最後まで書いてありませんでした。
URL:https://stackoverflow.com/questions/42770997/error-when-checking-model-input-expected-flatten-input-8-to-have-4-dimensions
2.参考にしていた動画はMacでプログラミングしていたので、エラーが出ているファイルパスの箇所の「\」が問題だと思いましたが、Windowsとの違いが分かりませんでした。このエラーが発生する前のcsvファイルを読み込むところは動画内と同じでしたので、さほど違いがあるようには思えませんが、実際のところ良く分かっていません。

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

Windoes7 64bit Professional

Youtube動画内キャプチャ画面
>>>回答から以下を追記

3.「model.add(Flatten(input_shape=(160,320,3)))」→→→「model.add(Flatten(input_shape=(1,160,320,3)))」へ修正して再度コンパイルしてみました。すると
「Error when checking model input: expected flatten_input_1 to have 5 dimensions, but got array with shape (1888, 1)」とエラーが表示され、dimensionsが異なっていることが分かりました。
上記の画像のファイルパスと「X_train」の中身を確認してみました。すると
---↓↓↓ファイルパス↓↓↓---
./data/IMG/C:\Users\kom\AnacondaProjects\CarND-Behavioral-Cloning-P3-master\data\IMG\center_2017_07_16_16_26_04_663.jpg
./data/IMG/C:\Users\kom\AnacondaProjects\CarND-Behavioral-Cloning-P3-master\data\IMG\center_2017_07_16_16_26_04_766.jpg
[None None None ..., None None None]
---↑↑↑X_trainの中身↑↑↑---
が出力されました。これはX_trainをresizeしなければならないのでしょうか。
大変恐縮でございますが、ご指導頂きたく。ご回答の程宜しくお願いします。

自己解決しました。以下に内容を述べます。

自己解決したソースコード(Python3.5)

import csv
import cv2
import numpy as np
import keras
from keras.models import Sequential
from keras.layers import Flatten, Dense

lines = []
with open('C:/Users/kom/Desktop/data/driving_log.csv') as csvfile:
  reader = csv.reader(csvfile)
  for line in reader:
    lines.append(line)

images = []
measurements = []
for line in lines:
  source_path = line[0]
  filename = source_path.split('\\')[-1]
  current_path = "C:/Users/kom/Desktop/data/IMG/" + filename
  image = cv2.imread(current_path)
  images.append(image)
  measurement = float(line[3])
  measurements.append(measurement)

X_train = np.array(images)
y_train = np.array(measurements)

model = Sequential()
model.add(Flatten(input_shape=(160,320,3)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')
model.fit(X_train,y_train,validation_split=0.2,shuffle=True, nb_epoch=10)
model.save('model.h5')


変更箇所は以下の2点です。若干コードの中身は変わっています。参考にした動画はMacからAWSを使用していましたが、自分のPCはWindowsを使用していたので、ファイルパスの指定がcsvとファイルでは異なることにピンときて修正したところコンパイルできました。
1.(変更前)with open('./data/driving_log.csv') as csvfile:
(変更後)with open('C:/Users/(自分のPCユーザー名)/Desktop/data/driving_log.csv') as csvfile:
2.(変更前)local_path = "\data\IMG\" + filename
(変更後)current_path = "C:/Users/kom/Desktop/data/IMG/" + filename
無事シミュレーターに反映されたので、とりあえず一安心です。

-以上-

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

タイトルとエラーメッセージの内容が違っているので、そこから見直した方が良さそうに思います。
(パスの違いの修正は必要だったかもしれませんが、少なくとも今出ているエラーは別件と思われます)

ValueError: Error when checking model input: expected flatten_input_7 to have 4 dimensions, but got array with shape (2279, 1)

「値のエラー: modelへの入力データをチェックしたとき、flatten_input_7は4次元のデータを期待したけれども、与えられたデータは (2279, 1) のデータだった。」

例外を発生させている箇所のコード
https://github.com/fchollet/keras/blob/master/keras/engine/training.py#L123 を見てもflatten_input_7がなにか分かりませんでしたが、少なくとも、今与えているデータ model.fit(X_train,y_train,validation_split=0.2,shuffle=True) のX_trainは2次元のようなので、model.fit関数に渡す値の形式が違っている可能性があります。

StackOverflowのコメントにも「X_train should be (1,160,320,3)」と4次元データを渡すべき、という答えがあるので、これが解決方法でしょう。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/07/16 16:44

    「model.add(Flatten(input_shape=(160,320,3)))」→→→「model.add(Flatten(input_shape=(1,160,320,3)))」へ修正して再度コンパイルしてみました。すると
    「Error when checking model input: expected flatten_input_1 to have 5 dimensions, but got array with shape (1888, 1)」とエラーが表示され、dimensionsが異なっていることが分かりました。
    上記の画像のファイルパスと「X_train」の中身を確認してみました。すると
    ---↓↓↓ファイルパス↓↓↓---
    ./data/IMG/C:\Users\kom\AnacondaProjects\CarND-Behavioral-Cloning-P3-master\data\IMG\center_2017_07_16_16_26_04_663.jpg
    ./data/IMG/C:\Users\kom\AnacondaProjects\CarND-Behavioral-Cloning-P3-master\data\IMG\center_2017_07_16_16_26_04_766.jpg
    [None None None ..., None None None]
    ---↑↑↑X_trainの中身↑↑↑---
    が出力されました。これはX_trainをresizeしなければならないのでしょうか。
    大変恐縮でございますが、ご指導頂きたく。ご回答の程宜しくお願いします。

    キャンセル

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

  • Python 3.x

    9841questions

    Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

  • TensorFlow

    920questions

  • NumPy

    644questions

    NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。