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

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

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

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

Python

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

Q&A

解決済

3回答

3338閲覧

Pythonで4GB以上のオブジェクトをserializeする時のエラー

0afnjosa

総合スコア7

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/12/15 01:06

#わからないところ
現在、150枚の画像に反転や回転を加えてデータセットを作っています。
100枚の場合は成功したのですが、枚数を増やすと以下に記載するエラーが出てしまいました。
#参考にした記事
以下のリンクの記事を拝見したところ、pickle.dumpの引数であるprotocolをprotocol=4にすればよいという事はわかりました。
しかし、saveやwrite_arrayなどの関数やformat.pyなどのモジュールはこちらで定義しておらず内部のもの?なので引数の変え方がわかりませんでした。
https://qiita.com/NomuraS/items/da3fd3a1ecd76175e5f8

#実行したコード

python

1from PIL import Image 2import os, glob 3import numpy as np 4from keras.utils import np_utils 5from sklearn import model_selection 6from sklearn.model_selection import train_test_split 7import pickle 8 9 10classes = ["leftt","rightt"] 11num_classes = len(classes) 12image_size = 320 13 14 15#datesetのディレクトリ 16datadir='/content/drive/MyDrive/Colab Notebooks/spiral/CNN(No,6)/' 17 18#画像の読み込み 19X = [] 20Y = [] 21 22 23for index, classlabel in enumerate(classes): 24 photos_dir = datadir+ classlabel 25 files = glob.glob(photos_dir + "/*.jpg") 26 for i, file in enumerate(files): 27 28 image = Image.open(file) 29 image = image.convert("RGB") 30 image = image.resize((image_size, image_size)) 31 #image.save("./test/{}{}.jpg".format(classlabel,i)) 32 data = np.asarray(image) 33 34 for angle in range(-20, 20, 5):##5 35 # 回転 36 img_r = image.rotate(angle) 37 data = np.asarray(img_r) 38 X.append(data) 39 Y.append(index) 40 41 # 反転 42 img_trans = image.transpose(Image.FLIP_LEFT_RIGHT) 43 data = np.asarray(img_trans) 44 X.append(data) 45 Y.append(index) 46 47 48 49X = np.array(X) 50Y = np.array(Y) 51 52 53 54#2割検証データへ 55(X_train, X_test, y_train, y_test) = train_test_split(X, Y, test_size=0.2) 56 57#正規化 58X_train = X_train.astype("float") / 255 59X_test = X_test.astype("float") / 255 60 61#教師データの型を変換 62y_train = np_utils.to_categorical(y_train,num_classes) 63y_test = np_utils.to_categorical(y_test, num_classes) 64 65#X_train, X_test, y_train, y_test = model_selection.train_test_split(X, Y) 66xy = (X_train, X_test, y_train, y_test) 67np.save("/content/drive/MyDrive/Colab Notebooks/spiral/CNN(No,6)/dataset.npy", xy) 68 69print('X_train.shape:', X_train.shape) 70print('X_test.shape:', X_test.shape) 71print('y_train.shape:', y_train.shape) 72print('y_test.shape:', y_test.shape)

#出力されたエラー

python

1/usr/local/lib/python3.7/dist-packages/numpy/lib/npyio.py in save(file, arr, allow_pickle, fix_imports) 2 527 arr = np.asanyarray(arr) 3 528 format.write_array(fid, arr, allow_pickle=allow_pickle, 4--> 529 pickle_kwargs=dict(fix_imports=fix_imports)) 5 530 6 531 7 8/usr/local/lib/python3.7/dist-packages/numpy/lib/format.py in write_array(fp, array, version, allow_pickle, pickle_kwargs) 9 662 if pickle_kwargs is None: 10 663 pickle_kwargs = {} 11--> 664 pickle.dump(array, fp, protocol=3, **pickle_kwargs) 12 665 elif array.flags.f_contiguous and not array.flags.c_contiguous: 13 666 if isfileobj(fp): 14 15OverflowError: cannot serialize a bytes object larger than 4 GiB

#教えていただきたい点
・内部で定義されている(はず?の)関数の引数の値の変え方
・それ以外の解決策
以上2点のどちらかを教えていただきたいです。
よろしくお願い致します。

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

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

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

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

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

0afnjosa

2021/12/15 02:10

1T2R3M4様、ご返信ありがとうございます。 ただいま、解決方法が分かりましたのでそれも含めて記載したいと思います。 次回はもう少し詳細に書くよう努力いたします。 ありがとうございました。
coco_bauer

2021/12/15 03:13

質問者が参照されているQiitaの記事に書かれている class MacOSFile(object): のプログラムを使い、「pickle.dump pickle.loadの代わりにpickle_dump pickle_loadを使う(質問に書かれているプログラムの"pickle.dump"を"pickle_dump"に変更する)」という方法は試してみましたか?
0afnjosa

2021/12/15 03:23

coco_bauer様、ご返信ありがとうございます。 当方、Windowsだったので、そちらは試していません。
guest

回答3

0

自己解決

#注意
勝手に内部のプログラムを書き換えるのは回答としてはよい方法ではないようなので、もしこの解決方法を試そうと思っている方は自己責任でお願い致します。
#行ったこと
エラーが出ていたwrite_arrayの引数の書き換え。
#方法
Google Colabのファイルを開くと添付してある画像が出てくると思います。
その中でdriveの上のマークをクリックすると沢山フォルダが出てくるので、今回であれば/usr/local/lib/python3.7/dist-packages/numpy/lib/format.pyの順番にフォルダを見ていくとformat.pyのモジュールを開く事が出来ます。
後はその中のprotocolの値を4にすることで無事に動くと思います。

(555e3736227387f5eddb8b8a76cf7b35.png)

投稿2021/12/15 02:21

編集2021/12/15 03:20
0afnjosa

総合スコア7

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

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

bsdfan

2021/12/15 02:57

今回はnumpy.save の使い方を間違っているのが原因で、X_train, X_test, y_train, y_test を個別のファイルにsaveするか、numpy.savez を使うのがいいです。 安易にライブラリのコードを書き換えるのは、回答としてはよくないです。
0afnjosa

2021/12/15 03:07

bsdfan様、ご指摘ありがとうございます。 次回からそのようにコードを書き換えてみたいと思います。 良い方法ではないという事も回答に付け加えさせていただきたいと思います。
guest

0

公式ドキュメント numpy.saveに書かれている、
キーワード引数allow_pickleを使って、

python

1numpy.save(file, arr, allow_pickle=False)

として保存してください。

投稿2021/12/15 02:15

ppaul

総合スコア24670

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

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

0afnjosa

2021/12/15 03:08

ppaul様、ご回答ありがとうございます。 自己解決したと思っていましたが、あまり良い方法ではないようなのでこちらでも動かしてみたいと思います。
0afnjosa

2021/12/15 03:18

こちらのコードで動かしてみたところ、以下のエラーが出されてしまいました。 ValueError: Object arrays cannot be saved when allow_pickle=False allow_pickleをFalseにするとオブジェクトが保存できないようです。
guest

0

#追記
添付した画像が表示されていなかったのでこちらに貼っておきます。
イメージ説明

投稿2021/12/15 02:23

0afnjosa

総合スコア7

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問