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

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

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

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

NumPy

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

Python

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

Q&A

解決済

2回答

6334閲覧

「TypeError: Cannot handle this data type:」の解消方法

mnmnmmmn

総合スコア18

Anaconda

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

NumPy

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

Python

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

0グッド

0クリップ

投稿2021/01/13 04:02

編集2021/01/13 04:05

前提・実現したいこと

下記URLのコードを参考に、手書き文字認識プログラムを作成したいです。
https://github.com/yukoba/CnnJapaneseCharacter
(紹介記事:https://qiita.com/yukoba/items/7a687e44395783eb32b1)

conda環境にて「learn.py」を実行したところ、以下のエラーメッセージが発生しました。

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

Traceback (most recent call last): File "/home/user/anaconda3/lib/python3.8/site-packages/PIL/Image.py", line 2751, in fromarray mode, rawmode = _fromarray_typemap[typekey] KeyError: ((1, 1, 128), '<f4') The above exception was the direct cause of the following exception: Traceback (most recent call last): File "learn.py", line 25, in <module> X_train[i] = np.array(Image.fromarray(ary).resize(img_cols,img_rows)) File "/home/takeru/anaconda3/lib/python3.8/site-packages/PIL/Image.py", line 2753, in fromarray raise TypeError("Cannot handle this data type: %s, %s" % typekey) from e TypeError: Cannot handle this data type: (1, 1, 128), <f4

該当のソースコード

python

1ary = np.load("hiragana.npz")['arr_0'].reshape([-1, 127, 128]).astype(np.float32) / 15 2X_train = np.zeros([nb_classes * 160, img_rows, img_cols], dtype=np.float32) 3for i in range(nb_classes * 160): 4 X_train[i] = np.array(Image.fromarray(ary).resize((img_cols,img_rows))) 5 # X_train[i] = ary[i] 6Y_train = np.repeat(np.arange(nb_classes), 160)

試したこと

同様の質問がteratailに記載されていたので(https://teratail.com/questions/271765)、参考にさせていただき上記コードを以下の通り修正いたしました。(float32→uint8に置換)

python

1ary = np.load("hiragana.npz")['arr_0'].reshape([-1, 127, 128]).astype(np.uint8) / 15 2X_train = np.zeros([nb_classes * 160, img_rows, img_cols], dtype=np.uint8)

実行結果、エラーメッセージが「<f4」から「<f8」に変わりました。
対応している型に誤りがあることは分かるのですが、どのように修正すべきかをつかみかねている状況です。
お答えいただける範囲でアドバイスいただければ幸いです。
追加すべき情報等ありましたらご指摘ください。

補足情報

・バージョン
conda 4.9.2
・ソースコードからの修正箇所(上記「試したこと」以外)
ソースコードのまま実行したとき下記エラーが発生したため、下記の通り変更を加えています。

(エラー①)
ImportError: cannot import name 'initializations'
(変更①)
initializations→initializersに置換
参考URL:https://github.com/keras-team/keras/issues/6278

(エラー②)
AttributeError: module 'scipy.misc' has no attribute 'imresize'
(変更②)
import scipy.misc→from PIL import Imageに置換
X_train[i] = scipy.misc.imresize(ary[i], (img_rows, img_cols), mode='F')

X_train[i] = np.array(Image.fromarray(ary).resize((img_cols,img_rows)))
に置換
参考URL:https://qiita.com/enoughspacefor/items/678226cd149d6afec72c

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

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

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

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

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

guest

回答2

0

ベストアンサー

python

1X_train[i] = np.array(Image.fromarray(ary).resize((img_cols,img_rows)))

↓ 変更する (ary → ary[i])

python

1X_train[i] = np.array(Image.fromarray(ary[i]).resize((img_cols,img_rows)))

元々の

python

1X_train[i] = scipy.misc.imresize(ary[i], (img_rows, img_cols), mode='F')

も、「ary」じゃなくて「ary[i]」でした

なお、aryとX_trainのどちらもnp.float32なんだから、型はこのエラーの原因では無いです

【追記】PIL.Image.fromarray()がfloatだとエラーになるのは、画像がカラーの場合です
ary[i]はグレースケールなので、floatでもエラーにはなりませんから、uintに変える必要はありません
たとえば、

python

1XX = np.zeros([5, 5, 3], dtype=np.float32) 2YY = Image.fromarray(XX)

はエラーになりますが、

python

1XX = np.zeros([5, 5], dtype=np.float32) 2YY = Image.fromarray(XX)

はエラーにはなりません

投稿2021/01/13 04:55

編集2021/01/13 05:22
jbpb0

総合スコア7651

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

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

mnmnmmmn

2021/01/13 06:22

ご回答ありがとうございます!ご教示いただいたコードでTypeError:が無事解消しました! 今度はtensorflow(keras?)のAtributeErrorが何をやっても出続けるので、後ほど改めて別の質問を立てます。本当にありがとうございました。
guest

0

astype(np.uint8) でキャストしてもそのあと除算をしたら float64 に戻ってしまいますよ。
Image.fromarray(ary) に渡した段階で np.uint8 にしないとだめです。

diff

1- Image.fromarray(ary) 2+ Image.fromarray(ary.astype(np.uint8))

投稿2021/01/13 04:16

tiitoi

総合スコア21956

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

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

mnmnmmmn

2021/01/13 04:56

早速のご回答ありがとうございます! いただいたコードで試してみたところ、「<f8」の部分が「|u1」に変わったエラーメッセージが出ました。型に誤りがあるということでしょうか? また修正するのはご指摘いただいた箇所+下記2箇所の計3箇所で良いのでしょうか? ary = np.load("hiragana.npz")['arr_0'].reshape([-1, 127, 128]).astype(np.【変更箇所】) / 15 X_train = np.zeros([nb_classes * 160, img_rows, img_cols], dtype=np.【変更箇所】) ※【変更箇所】=uint8
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問