質問編集履歴

3 誤字修正

soheil

soheil score 11

2018/12/02 19:50  投稿

機械学習での画像認識(dimentions不一致によるエラー)
### 前提・実現したいこと
Pythonで画像認識のシステムを学習のため作っています。
以下記載のサイトを参考に自分自身で綾鷹、おーいお茶、伊右衛門の3種のお茶の画像認識をしたいのですが、予測モデルを学習させる際にdimensionsのエラーが出てしまいます。まだ学習し始めの初心者のため、どこの値が4つに足りてないのかいまいち把握できておりません...
どうすればよいでしょうか?
参考:(https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188)
 
■■な機能を実装中に以下のエラーメッセージが発生しました。  
### 発生している問題・エラーメッセージ
```
Using TensorFlow backend.
_________________________________________________________________
Layer (type)                Output Shape             Param # 
=================================================================
conv2d_1 (Conv2D)           (None, 298, 298, 32)     896     
_________________________________________________________________
max_pooling2d_1 (MaxPooling2 (None, 149, 149, 32)     0       
_________________________________________________________________
conv2d_2 (Conv2D)           (None, 147, 147, 64)     18496   
_________________________________________________________________
max_pooling2d_2 (MaxPooling2 (None, 73, 73, 64)       0       
_________________________________________________________________
conv2d_3 (Conv2D)           (None, 71, 71, 128)      73856   
_________________________________________________________________
max_pooling2d_3 (MaxPooling2 (None, 35, 35, 128)      0       
_________________________________________________________________
conv2d_4 (Conv2D)           (None, 33, 33, 128)      147584   
_________________________________________________________________
max_pooling2d_4 (MaxPooling2 (None, 16, 16, 128)      0       
_________________________________________________________________
flatten_1 (Flatten)         (None, 32768)            0       
_________________________________________________________________
dense_1 (Dense)             (None, 512)              16777728 
_________________________________________________________________
dense_2 (Dense)             (None, 3)                1539     
=================================================================
Total params: 17,020,099
Trainable params: 17,020,099
Non-trainable params: 0
_________________________________________________________________
Traceback (most recent call last):
 File "model-construct.py", line 54, in <module>
   validation_data=(X_test,y_test))
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
   batch_size=batch_size)
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
   exception_prefix='input')
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
   'with shape ' + str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
```
### 該当のソースコード
```python
#ラベリングによる学習/検証データの準備
from PIL import Image
import os, glob
import numpy as np
import random, math
#画像が保存されているルートディレクトリのパス
root_dir = "./img/"
# 商品名
categories = ["綾鷹","お〜いお茶","伊右衛門"]
# 画像データ用配列
X = []
# ラベルデータ用配列
Y = []
#画像データごとにadd_sample()を呼び出し、X,Yの配列を返す関数
def make_sample(files):
   global X, Y
   X = []
   Y = []
   for cat, fname in files:
       add_sample(cat, fname)
   return np.array(X), np.array(Y)
#渡された画像データを読み込んでXに格納し、また、
#画像データに対応するcategoriesのidxをY格納する関数
def add_sample(cat, fname):
   img = Image.open(fname)
   img = img.convert("RGB")
   img = img.resize((300, 300))
   data = np.asarray(img)
   X.append(data)
   Y.append(cat)
#全データ格納用配列
allfiles = []
#カテゴリ配列の各値と、それに対応するidxを認識し、全データをallfilesにまとめる
for idx, cat in enumerate(categories):
   image_dir = root_dir + "/" + cat
   files = glob.glob(image_dir + "/*.jpg")
   for f in files:
       allfiles.append((idx, f))
#シャッフル後、学習データと検証データに分ける
random.shuffle(allfiles)
th = math.floor(len(allfiles) * 0.8)
train = allfiles[0:th]
test = allfiles[th:]
X_train, y_train = make_sample(train)
X_test, y_test = make_sample(test)
xy = (X_train, X_test, y_train, y_test)
#データを保存する(データの名前を「tea_data.npy」としている)
np.save("tea_data.npy", xy)
```
```python
#モデルの構築
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(300,300,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dense(3,activation="sigmoid")) #分類先の種類分設定
#モデル構成の確認
model.summary()
#モデルのコンパイル
from keras import optimizers
model.compile(loss="binary_crossentropy",
             optimizer=optimizers.RMSprop(lr=1e-4),
             metrics=["acc"])
#データの準備
from keras.utils import np_utils
import numpy as np
categories = ["綾鷹","お〜いお茶","伊右衛門"]
nb_classes = len(categories)
X_train, X_test, y_train, y_test = np.load("./tea_data.npy")
#データの正規化
X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255
#kerasで扱えるようにcategoriesをベクトルに変換
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)
#モデルの学習
model = model.fit(X_train,
                 y_train,
                 epochs=10,
                 batch_size=6,
                 validation_data=(X_test,y_test))
```
### 試したこと
最下行の#モデルの学習においてのvalidation_data=(X_test,y_test)をvalidation_data=(X_test,y_test,1,1)など試してみました。見当違いでしたらすいません...
### 補足情報(FW/ツールのバージョンなど)
参考のサイトと違い、3社の商品を判別でしたいので随所値を変更した場所はありますが、基本的にサイトに記載のプログラムをそのまま利用しています。
  • Python

    23219 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

2 エラーメッセージの修正

soheil

soheil score 11

2018/12/02 18:02  投稿

機械学習での画像認識(dimentions不一致によるエラー)
### 前提・実現したいこと
Pythonで画像認識のシステムを学習のため作っています。
以下記載のサイトを参考に自分自身で綾鷹、おーいお茶、伊右衛門の3種のお茶の画像認識をしたいのですが、予測モデルを学習させる際にdimensionsのエラーが出てしまいます。まだ学習し始めの初心者のため、どこの値が4つに足りてないのかいまいち把握できておりません...
どうすればよいでしょうか?
参考:(https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188)
■■な機能を実装中に以下のエラーメッセージが発生しました。
### 発生している問題・エラーメッセージ
```
Using TensorFlow backend.  
_________________________________________________________________  
Layer (type)                Output Shape             Param #   
=================================================================  
conv2d_1 (Conv2D)           (None, 298, 298, 32)     896       
_________________________________________________________________  
max_pooling2d_1 (MaxPooling2 (None, 149, 149, 32)     0         
_________________________________________________________________  
conv2d_2 (Conv2D)           (None, 147, 147, 64)     18496     
_________________________________________________________________  
max_pooling2d_2 (MaxPooling2 (None, 73, 73, 64)       0         
_________________________________________________________________  
conv2d_3 (Conv2D)           (None, 71, 71, 128)      73856     
_________________________________________________________________  
max_pooling2d_3 (MaxPooling2 (None, 35, 35, 128)      0         
_________________________________________________________________  
conv2d_4 (Conv2D)           (None, 33, 33, 128)      147584     
_________________________________________________________________  
max_pooling2d_4 (MaxPooling2 (None, 16, 16, 128)      0         
_________________________________________________________________  
flatten_1 (Flatten)         (None, 32768)            0         
_________________________________________________________________  
dense_1 (Dense)             (None, 512)              16777728   
_________________________________________________________________  
dense_2 (Dense)             (None, 3)                1539       
=================================================================  
Total params: 17,020,099  
Trainable params: 17,020,099  
Non-trainable params: 0  
_________________________________________________________________  
Traceback (most recent call last):
 File "model-construct.py", line 54, in <module>
   validation_data=(X_test,y_test))
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
   batch_size=batch_size)
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
   exception_prefix='input')
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
   'with shape ' + str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
```
### 該当のソースコード
```python
#ラベリングによる学習/検証データの準備
from PIL import Image
import os, glob
import numpy as np
import random, math
#画像が保存されているルートディレクトリのパス
root_dir = "./img/"
# 商品名
categories = ["綾鷹","お〜いお茶","伊右衛門"]
# 画像データ用配列
X = []
# ラベルデータ用配列
Y = []
#画像データごとにadd_sample()を呼び出し、X,Yの配列を返す関数
def make_sample(files):
   global X, Y
   X = []
   Y = []
   for cat, fname in files:
       add_sample(cat, fname)
   return np.array(X), np.array(Y)
#渡された画像データを読み込んでXに格納し、また、
#画像データに対応するcategoriesのidxをY格納する関数
def add_sample(cat, fname):
   img = Image.open(fname)
   img = img.convert("RGB")
   img = img.resize((300, 300))
   data = np.asarray(img)
   X.append(data)
   Y.append(cat)
#全データ格納用配列
allfiles = []
#カテゴリ配列の各値と、それに対応するidxを認識し、全データをallfilesにまとめる
for idx, cat in enumerate(categories):
   image_dir = root_dir + "/" + cat
   files = glob.glob(image_dir + "/*.jpg")
   for f in files:
       allfiles.append((idx, f))
#シャッフル後、学習データと検証データに分ける
random.shuffle(allfiles)
th = math.floor(len(allfiles) * 0.8)
train = allfiles[0:th]
test = allfiles[th:]
X_train, y_train = make_sample(train)
X_test, y_test = make_sample(test)
xy = (X_train, X_test, y_train, y_test)
#データを保存する(データの名前を「tea_data.npy」としている)
np.save("tea_data.npy", xy)
```
```python
#モデルの構築
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(300,300,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dense(3,activation="sigmoid")) #分類先の種類分設定
#モデル構成の確認
model.summary()
#モデルのコンパイル
from keras import optimizers
model.compile(loss="binary_crossentropy",
             optimizer=optimizers.RMSprop(lr=1e-4),
             metrics=["acc"])
#データの準備
from keras.utils import np_utils
import numpy as np
categories = ["綾鷹","お〜いお茶","伊右衛門"]
nb_classes = len(categories)
X_train, X_test, y_train, y_test = np.load("./tea_data.npy")
#データの正規化
X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255
#kerasで扱えるようにcategoriesをベクトルに変換
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)
#モデルの学習
model = model.fit(X_train,
                 y_train,
                 epochs=10,
                 batch_size=6,
                 validation_data=(X_test,y_test))
```
### 試したこと
最下行の#モデルの学習においてのvalidation_data=(X_test,y_test)をvalidation_data=(X_test,y_test,1,1)など試してみました。見当違いでしたらすいません...
### 補足情報(FW/ツールのバージョンなど)
参考のサイトと違い、3社の商品を判別でしたいので随所値を変更した場所はありますが、基本的にサイトに記載のプログラムをそのまま利用しています。
  • Python

    23219 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1 誤字の修正

soheil

soheil score 11

2018/12/02 16:33  投稿

機械学習での画像認識(dimentions不一致によるエラー)
### 前提・実現したいこと
ここに質問の内容を詳しく書いてください。  
Pythonで画像認識のシステムを学習のため作っています。
以下記載のサイトを参考に自分自身で綾鷹、おーいお茶、伊右衛門の3種のお茶の画像認識をしたいのですが、予測モデルを学習させる際にdimensionsのエラーが出てしまいます。まだ学習し始めの初心者のため、どこの値が4つに足りてないのかいまいち把握できておりません...
どうすればよいでしょうか?
参考:(https://qiita.com/tomo_20180402/items/e8c55bdca648f4877188)
■■な機能を実装中に以下のエラーメッセージが発生しました。
### 発生している問題・エラーメッセージ
```
Traceback (most recent call last):
 File "model-construct.py", line 54, in <module>
   validation_data=(X_test,y_test))
 File "/home/s1611497/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 952, in fit
   batch_size=batch_size)
 File "/home/s1611497/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training.py", line 751, in _standardize_user_data
   exception_prefix='input')
 File "/home/s1611497/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
 File "/ホームディレクトリパス/.pyenv/versions/anaconda3-4.4.0/lib/python3.6/site-packages/keras/engine/training_utils.py", line 128, in standardize_input_data
   'with shape ' + str(data_shape))
ValueError: Error when checking input: expected conv2d_1_input to have 4 dimensions, but got array with shape (0, 1)
```
### 該当のソースコード
```python
#ラベリングによる学習/検証データの準備
from PIL import Image
import os, glob
import numpy as np
import random, math
#画像が保存されているルートディレクトリのパス
root_dir = "./img/"
# 商品名
categories = ["綾鷹","お〜いお茶","伊右衛門"]
# 画像データ用配列
X = []
# ラベルデータ用配列
Y = []
#画像データごとにadd_sample()を呼び出し、X,Yの配列を返す関数
def make_sample(files):
   global X, Y
   X = []
   Y = []
   for cat, fname in files:
       add_sample(cat, fname)
   return np.array(X), np.array(Y)
#渡された画像データを読み込んでXに格納し、また、
#画像データに対応するcategoriesのidxをY格納する関数
def add_sample(cat, fname):
   img = Image.open(fname)
   img = img.convert("RGB")
   img = img.resize((300, 300))
   data = np.asarray(img)
   X.append(data)
   Y.append(cat)
#全データ格納用配列
allfiles = []
#カテゴリ配列の各値と、それに対応するidxを認識し、全データをallfilesにまとめる
for idx, cat in enumerate(categories):
   image_dir = root_dir + "/" + cat
   files = glob.glob(image_dir + "/*.jpg")
   for f in files:
       allfiles.append((idx, f))
#シャッフル後、学習データと検証データに分ける
random.shuffle(allfiles)
th = math.floor(len(allfiles) * 0.8)
train = allfiles[0:th]
test = allfiles[th:]
X_train, y_train = make_sample(train)
X_test, y_test = make_sample(test)
xy = (X_train, X_test, y_train, y_test)
#データを保存する(データの名前を「tea_data.npy」としている)
np.save("tea_data.npy", xy)
```
```python
#モデルの構築
from keras import layers, models
model = models.Sequential()
model.add(layers.Conv2D(32,(3,3),activation="relu",input_shape=(300,300,3)))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(64,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Conv2D(128,(3,3),activation="relu"))
model.add(layers.MaxPooling2D((2,2)))
model.add(layers.Flatten())
model.add(layers.Dense(512,activation="relu"))
model.add(layers.Dense(3,activation="sigmoid")) #分類先の種類分設定
#モデル構成の確認
model.summary()
#モデルのコンパイル
from keras import optimizers
model.compile(loss="binary_crossentropy",
             optimizer=optimizers.RMSprop(lr=1e-4),
             metrics=["acc"])
#データの準備
from keras.utils import np_utils
import numpy as np
categories = ["綾鷹","お〜いお茶","伊右衛門"]
nb_classes = len(categories)
X_train, X_test, y_train, y_test = np.load("./tea_data.npy")
#データの正規化
X_train = X_train.astype("float") / 255
X_test = X_test.astype("float") / 255
#kerasで扱えるようにcategoriesをベクトルに変換
y_train = np_utils.to_categorical(y_train, nb_classes)
y_test = np_utils.to_categorical(y_test, nb_classes)
#モデルの学習
model = model.fit(X_train,
                 y_train,
                 epochs=10,
                 batch_size=6,
                 validation_data=(X_test,y_test))
```
### 試したこと
最下行の#モデルの学習においてのvalidation_data=(X_test,y_test)をvalidation_data=(X_test,y_test,1,1)など試してみました。見当違いでしたらすいません...
### 補足情報(FW/ツールのバージョンなど)
参考のサイトと違い、3社の商品を判別でしたいので随所値を変更した場所はありますが、基本的にサイトに記載のプログラムをそのまま利用しています。
  • Python

    23219 questions

    Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

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