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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

1469閲覧

anaconda環境での画像読み込み時のエラー

Thina

総合スコア1

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2020/10/19 13:50

編集2020/10/19 14:48

anacondaで仮想環境を作り、そこでtensorflowとkerasを使って機械学習をしてみたかったので、ネットに転がっていた「自分で用意した画像を使った機械学習のコード」を少し手を加えて(ニューラルネットワーク部分を自分で考えたものにした)実行してみました。すると、実行結果の欄には自分が用意した画像のファイル名がずらりと並んでいき、うまくいくと思いましたが、次のようなエラー文が出ました。

#エラー文

AttributeError Traceback (most recent call last) <ipython-input-9-ddcfcffbcd49> in <module> 59 # Squeeze 60 model = Sequential() ---> 61 model.add(GlobalAveragePooling2D()(input)) 62 model.add(Dense(200,activation="relu")) 63 model.add(Dense(200,activation="sigmoid")) ~\anaconda3\envs\ban\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py in __call__(self, inputs, *args, **kwargs) 892 # Eager execution on data tensors. 893 with backend.name_scope(self._name_scope()): --> 894 self._maybe_build(inputs) 895 cast_inputs = self._maybe_cast_inputs(inputs) 896 with base_layer_utils.autocast_context_manager( ~\anaconda3\envs\ban\lib\site-packages\tensorflow_core\python\keras\engine\base_layer.py in _maybe_build(self, inputs) 2125 if not self.built: 2126 input_spec.assert_input_compatibility( -> 2127 self.input_spec, inputs, self.name) 2128 input_list = nest.flatten(inputs) 2129 if input_list and self._dtype_policy.compute_dtype is None: ~\anaconda3\envs\ban\lib\site-packages\tensorflow_core\python\keras\engine\input_spec.py in assert_input_compatibility(input_spec, inputs, layer_name) 161 spec.min_ndim is not None or 162 spec.max_ndim is not None): --> 163 if x.shape.ndims is None: 164 raise ValueError('Input ' + str(input_index) + ' of layer ' + 165 layer_name + ' is incompatible with the layer: ' AttributeError: 'function' object has no attribute 'shape'

エラーがおきたコードの全文を下に載せます

#ソースコード

import

1from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, AveragePooling2D, GlobalAveragePooling2D, Dense, Multiply, Input 2 3from keras.activations import linear 4from keras.utils import to_categorical 5import numpy as np 6import os, pickle, zipfile, glob 7from keras.models import Sequential 8from keras.layers import Activation, Dense, Dropout 9from keras.utils.np_utils import to_categorical 10from keras.optimizers import Adagrad 11from keras.optimizers import Adam 12import numpy as np 13from PIL import Image 14import os 15 16image_list = [] 17label_list = [] 18 19for dir in os.listdir("data/training"): 20 if dir == ".DS_Store": 21 continue 22 dir1 = "data/training/" + dir 23 label = 0 24 if dir == "no": 25 label = 0 26 elif dir == "ok": 27 label = 1 28 for file in os.listdir(dir1): 29 if file != ".DS_Store": 30 label_list.append(label) 31 filepath = dir1 + "/" + file 32 image = np.array(Image.open(filepath).resize((25, 25))) 33 print(filepath) 34 image = image.transpose(2, 0, 1) 35 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 36 image_list.append(image / 255.) 37image_list = np.array(image_list) 38Y = to_categorical(label_list) 39model = Sequential() 40model.add(GlobalAveragePooling2D()(input)) 41model.add(Dense(200,activation="relu")) 42model.add(Dense(200,activation="sigmoid")) 43 44opt = Adam(lr=0.001) 45model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 46model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1) 47 48total = 0. 49ok_count = 0. 50 51for dir in os.listdir("data/training"): 52 if dir == ".DS_Store": 53 continue 54 dir1 = "data/validation/" + dir 55 label = 0 56 if dir == "no": 57 label = 0 58 elif dir == "ok": 59 label = 1 60 for file in os.listdir(dir1): 61 if file != ".DS_Store": 62 label_list.append(label) 63 filepath = dir1 + "/" + file 64 image = np.array(Image.open(filepath).resize((25, 25))) 65 print(filepath) 66 image = image.transpose(2, 0, 1) 67 image = image.reshape(1, image.shape[0] * image.shape[1] * image.shape[2]).astype("float32")[0] 68 result = model.predict_classes(np.array([image / 255.])) 69 print("label:", label, "result:", result[0]) 70 total += 1. 71 if label == result[0]: 72 ok_count += 1. 73 74print("seikai: ", ok_count / total * 100, "%") 75 76from IPython.display import SVG 77from keras.utils.vis_utils import model_to_dot 78SVG(model_to_dot(model).create(prog='dot', format='svg'))ここに言語を入力

コードの中にはfunctionという部分は書いてありませんし、一切手を加えていない元のコードを実行した際にはこのようなエラーは発生しませんでした。手詰まりとなり、わからないのは以下の点です
1:何が原因で起きたエラーなのか?
2:何をどうすれば解消できるのか?
3:functionという単語はどこから来たのか?
ソースコードで何をしているか、全然わかっていない初心者です。よろしくお願いします

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

y_waiwai

2020/10/19 14:28

このままではコードが読めないので、質問を編集し、<code>ボタンを押し、出てくる’’’の枠の中にコードを貼り付けてください
Thina

2020/10/19 14:50

ありがとうございます。コードの修正をいたしました。こちらで大丈夫でしょうか?
guest

回答1

0

ベストアンサー

すでに解決済みかもしれませんが・・・。
エラーコードは「functionというobjectにはshapeというメソッドはないよ」ということで、pythonをさわっているとよくありがちなエラーコードです。functionは、今回のコードがどうこうというよりも、pythonがインスタンスなどに対してエラーコードを吐く際に用いる総称のようなものです。今回は、コードを間違って記載したために、本来はndarrayなどに用いるべき「shape」というmethodが、全く異なるobjectに適応されてしまったがためにエラーが出てしまっています。具体的には、

Python

1if x.shape.ndims is None:

の部分で、本来はxにはndarrayなどが収納されているべきはずが、コードの間違いによって、何か別のobjectが代入されてしまったいるようです。

肝心のコードの間違い箇所ですが、エラー分でも示されているように

Python

1model = Sequential() 2model.add(GlobalAveragePooling2D()(input)) #<-この部分 3model.add(Dense(200,activation="relu")) 4model.add(Dense(200,activation="sigmoid"))

だと思います。正しくは

Python

1model = Sequential() 2model.add(GlobalAveragePooling2D()) 3model.add(Dense(200,activation="relu")) 4model.add(Dense(200,activation="sigmoid"))

ですね。SequentialモデルとfunctioncnalAPIモデルの書き方を混同していると思われます。
ただ、本来は1層目にはmodel.add(Dense(32, input_dim=784))などの入力層を挿入する場合が一般的なので、1層目にGlobalAveragePooling2D()と置いてうまくいくかはわかりません。

投稿2020/10/27 09:52

Ryomax

総合スコア68

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Thina

2020/10/27 17:53

回答ありがとうございます。GAPの箇所の修正と一層目に model.add(Dense(32, input_dim=784)) を追加してみると今度は TypeError Traceback (most recent call last) <ipython-input-13-71fe8303eebd> in <module> 48 49 model = Sequential() ---> 50 model.add(Dense(32, input_dim=788)) 51 model.add(GlobalAveragePooling2D()) 52 model.add(Dense(Activation="relu")) ~\anaconda3\envs\ban\lib\site-packages\keras\engine\sequential.py in add(self, layer) 131 raise TypeError('The added layer must be ' 132 'an instance of class Layer. ' --> 133 'Found: ' + str(layer)) 134 self.built = False 135 if not self._layers: TypeError: The added layer must be an instance of class Layer. Found: <tensorflow.python.keras.layers.core.Dense object at 0x0000023707D06630> といったエラーが発生しました。翻訳では「追加するレイヤーは、Layer クラスのインスタンスである必要があります。」とのことでした。これは先ほど仰っていた書き方の混同によるものでしょうか?それともまだ不足している情報があるのでしょうか?度重なる質問で恐縮ですが、よろしくお願いします
Ryomax

2020/10/28 08:28

そのエラーが出るのは、kerasとtensorflowのクラスが併存してしまっている場合です。 見返してみると、 from tensorflow.keras.layers import Conv2D, BatchNormalization, Activation, AveragePooling2D, GlobalAveragePooling2D, Dense, Multiply, Input from keras.layers import Activation, Dense, Dropout というtensorflowにからimportしたlayerと、kerasからimportしたlayerが存在しており、ここがコンフリクトしているものと考えられます。今のtensorflowにはkerasが内包されているため、基本的にはtensorflow.kerasですべてのコードは書くことができますが、古い記事を参考にしている場合、tensorflowに内包されていないkeras単独版が使用されていることが多いため要注意です。原則として、tensorflow内包版、keras単独版、いずれかにしぼってコードを書くべきです。今回の場合は、from tensorflow.keras.layersの方は削除してしまってもいいのではないでしょうか。 また、input層に関しては、参考で適当なものをピックアップしただけなので、次元は質問者さんのものに合わせる必要があります。Dense(32, input_dim=***)の部分を、入力の要素数、質問者さんの場合は25×25×3chの画像を1次元化しているようなので、1875に変更する必要があります(多分なので、間違っていたらすいません…)。 さらにいうと、GlobalAveragePooling2D()は通常、こういった1次元の配列ではなく、3次元配列での入力においてconv2Dなどと併用することが想定されているため、質問者さんのコード内では動かないと思います。とりあえず一旦省いてみて走らせてみてはどうでしょうか。
Ryomax

2020/10/28 08:35

ちなみに、出力層が Dense(200,activation="sigmoid") になっていますが、この形だと、200クラス分類、しかもsoftmaxではないのでクラスごとの確率に変換される前の数値が出力されると思います。ここは正しいでしょうか? あと、Dense(32, input_dim=***)と書きましたが、入力が1875個の1次元配列ということだと、Denseの出力は32ではなく300-500くらいのもっと大きい数値にした方がいいかもしれないですね。 MNISTなどでよく使用される単純なモデルを参考に貼っておきます。 model = Sequential() model.add(Dense(512, input_dim=784)) #784は質問者さんのモデルでは1875に変更の必要あり model.add(Dropout(0.2)) model.add(Dense(512, activation='relu')) model.add(Dropout(0.2)) model.add(Dense(10, activation='softmax')) #10クラス分類
Thina

2020/10/28 14:46

ご指摘いただいた箇所と一度GAP2Dを削除し、モデルを model = Sequential() model.add(Dense(200, input_dim=1875)) model.add(Activation("relu")) model.add(Dropout(0.2)) model.add(Dense(200)) model.add(Activation("relu")) model.add(Dropout(0.2)) model.add(Dense(2)) model.add(Activation("softmax")) に変更してみると、今度は次のようなエラーが出ました。 ValueError Traceback (most recent call last) <ipython-input-36-edec7aaf648a> in <module> 56 model.compile(loss="categorical_crossentropy", optimizer=opt, metrics=["accuracy"]) 57 # 学習を実行。10%はテストに使用。 ---> 58 model.fit(image_list, Y, nb_epoch=1500, batch_size=100, validation_split=0.1) 59 60 # テスト用ディレクトリ(./data/train/)の画像でチェック。正解率を表示する。 ~\anaconda3\envs\ban\lib\site-packages\keras\engine\training.py in fit(self, x, y, batch_size, epochs, verbose, callbacks, validation_split, validation_data, shuffle, class_weight, sample_weight, initial_epoch, steps_per_epoch, validation_steps, validation_freq, max_queue_size, workers, use_multiprocessing, **kwargs) 1152 sample_weight=sample_weight, 1153 class_weight=class_weight, -> 1154 batch_size=batch_size) 1155 1156 # Prepare validation data. ~\anaconda3\envs\ban\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size) 619 feed_output_shapes, 620 check_batch_axis=False, # Don't enforce the batch size. --> 621 exception_prefix='target') 622 623 # Generate sample-wise weight values given the `sample_weight` and ~\anaconda3\envs\ban\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix) 143 ': expected ' + names[i] + ' to have shape ' + 144 str(shape) + ' but got array with shape ' + --> 145 str(data_shape)) 146 return data 147 ValueError: Error when checking target: expected dense_91 to have shape (2,) but got array with shape (1,) 調べてみると変数が変更されて中身が変わっている可能性がある、とのことでした。しかしながら自分の直した方法では全く改善できませんでした・・・。これはどうすればいいでしょうか?(dense_91の数値の部分は実行するたびに増加していきました)
Ryomax

2020/10/28 16:25

最終層の出力と、ラベルの形状が異なっているようです。 見た感じ、質問者さんのコードは、フォルダ名からnoとokを取得して0と1に分類したものがラベルのようですが、ラベルは想定通りの形状になっているでしょうか? label_listが[0, 0, 0, 1, 1, 1] Yが上記をto_categoricalに通したものになっているため array([[1., 0.], [1., 0.], [1., 0.], [0., 1.], [0., 1.], [0., 1.]], dtype=float32) のような形になっていることが期待されますが、 label_list が [0, 0, 0, 0, 0, 0] Yが array([[1.], [1.], [1.], [1.], [1.], [1.]], dtype=float32) のような形になっていたりしないでしょうか? 一度printなどで確認してみてください。
Thina

2020/11/01 11:58

返信が遅れてしまい申し訳ありません。 Y = to_categorical(label_list) までをコピーし、その下に print=(Y) で確認しようとしても書き方が悪かったのか TypeError: 'numpy.ndarray' object is not callable というようなエラーが出ました。ここまでのコードでこんなエラーがでるのかと思い再度モデルを変更したときのコードを実行してみると、先ほどのエラーが消失し、学習を開始しました。原因がはっきりしないまま解決してしまい申し訳ありません・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問