ソースコードは<code>(コードの挿入)を使ってその中に記述するよう、
質問文を編集した方がより沢山回答を得られると思います。
現状ですとソースコードが読みにくく、
解析しようとコピペして、段落つけて読みやすくして・・・など
解析までに手間がかける状態になっており、
別の質問を回答したくなる人が多いと思いますので
ここに言語を入力```import os, pickle import numpy as np from PIL import Image from sklearn.model_selection import train_test_split class DigitImage: def __init__(self): self.dataset = {} def load_data(self, save_file, normalize=True, flatten=False, one_hot_label=True): # save_fileがなければデータセットを作成, あればデータを読み込む if not os.path.exists(save_file): self.create_dataset(save_file) else: with open(save_file, 'rb') as f: self.dataset = pickle.load(f) if normalize: # float32に変換して0~1の間になるよう正規化 self.dataset['img'] = self.dataset['img'].astype(np.float32) / 255 if not flatten: self.dataset['img'] = self.dataset['img'].reshape(-1, 1, 28, 28) if one_hot_label: self.dataset['label'] = self.change_one_hot_label() return self.dataset['img'], self.dataset['label'] def change_one_hot_label(self): T = np.zeros((self.dataset['label'].size, 10)) for idx, row in enumerate(T): row[self.dataset['label'][idx]] = 1 return T def create_dataset(self, save_file): image, label = [], [] for i in range(10): dir_path = os.path.join('dataset', str(i)) filelist = [os.path.join(dir_path, file) for file in os.listdir(dir_path)] # ファイル毎に画像を1次元のnumpy配列として追加していく images = [] for file in filelist: _img = Image.open(file).convert('L') _img = _img.resize((28, 28)) _img = np.asarray(_img, dtype=np.uint8).reshape(-1) images.append(_img) image.extend(images) label.extend([i] * len(filelist)) self.dataset = {'img': np.array(image), 'label': np.array(label)} with open(save_file, 'wb') as f: pickle.dump(self.dataset, f) if __name__ == '__main__': digit = DigitImage() X, y = digit.load_data('digit_dataset.pkl', normalize=True, flatten=False, one_hot_label=True) print(X.shape) print(y.shape) # ここでロードしたデータを学習用とテスト用に分割. シャッフルもされる X_train, X_test, y_train, y_test = train_test_split( X.reshape((len(X), 28, 28, 1)), y, train_size=0.6) print(y_train[:10]) digit = DigitImage() X, y = digit.load_data('digit_dataset.pkl', normalize=True, flatten=False, one_hot_label=True) print(X.shape) # (10000, 1, 28, 28) print(y.shape) # (10000, 10) コード ``` ``` コード ```### 前提・実現したいこと 自作データセットをコード一行で読み込めるようにしたいです。 プログラム初心者で全くわからない状況なのでおかしいことたくさん言っていると思います。すみません ここに質問の内容を詳しく書いてください。 import os, pickle import numpy as np from PIL import Image from sklearn.model_selection import train_test_split class DigitImage: def __init__(self): self.dataset = {} def load_data(self, save_file, normalize=True, flatten=False, one_hot_label=True): # save_fileがなければデータセットを作成, あればデータを読み込む if not os.path.exists(save_file): self.create_dataset(save_file) else: with open(save_file, 'rb') as f: self.dataset = pickle.load(f) if normalize: # float32に変換して0~1の間になるよう正規化 self.dataset['img'] = self.dataset['img'].astype(np.float32) / 255 if not flatten: self.dataset['img'] = self.dataset['img'].reshape(-1, 1, 28, 28) if one_hot_label: self.dataset['label'] = self.change_one_hot_label() return self.dataset['img'], self.dataset['label'] def change_one_hot_label(self): T = np.zeros((self.dataset['label'].size, 10)) for idx, row in enumerate(T): row[self.dataset['label'][idx]] = 1 return T def create_dataset(self, save_file): image, label = [], [] for i in range(10): dir_path = os.path.join('dataset', str(i)) filelist = [os.path.join(dir_path, file) for file in os.listdir(dir_path)] # ファイル毎に画像を1次元のnumpy配列として追加していく images = [] for file in filelist: _img = Image.open(file).convert('L') _img = _img.resize((28, 28)) _img = np.asarray(_img, dtype=np.uint8).reshape(-1) images.append(_img) image.extend(images) label.extend([i] * len(filelist)) self.dataset = {'img': np.array(image), 'label': np.array(label)} with open(save_file, 'wb') as f: pickle.dump(self.dataset, f) if __name__ == '__main__': digit = DigitImage() X, y = digit.load_data('digit_dataset.pkl', normalize=True, flatten=False, one_hot_label=True) print(X.shape) print(y.shape) # ここでロードしたデータを学習用とテスト用に分割. シャッフルもされる X_train, X_test, y_train, y_test = train_test_split( X.reshape((len(X), 28, 28, 1)), y, train_size=0.6) print(y_train[:10]) digit = DigitImage() X, y = digit.load_data('digit_dataset.pkl', normalize=True, flatten=False, one_hot_label=True) print(X.shape) # (10000, 1, 28, 28) print(y.shape) # (10000, 10) ### 発生している問題・エラーメッセージ このプログラムを実行するとファイルが作成されるのですが中身が文字化けしてしまいます。 ### 試したこと 文字コードを変換するサイトを使用しました。 ここに問題に対して試したことを記載してください。 それでも文字化けします。 ここにより詳細な情報を記載してください。 https://www.yakupro.info/entry/digit-dataset このサイトを参考にしています。
あなたの回答
tips
プレビュー