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

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

新規登録して質問してみよう
ただいま回答率
85.44%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

1回答

518閲覧

Google Colaboratoryを使った機械学習でイメージのサイズが合わない

kinkiki22147048

総合スコア0

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2023/02/01 12:16

実現したいこと

機械学習を行ってモデルを保存したい

前提

学校の授業でpythonを用いて機械学習の実験を行っています。
今までの授業と同じようにコードを書いているはずなのにエラーが出てきました。
データセットを変更したところエラーが出たのでもしかしたらそこが原因かもしれません。

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

Traceback (most recent call last): File "src/train_for_beautiful.py", line 124, in <module> main() # main()が実行される File "src/train_for_beautiful.py", line 98, in main train(net, trainloader, optimizer, criterion, args.nepochs) File "src/train_for_beautiful.py", line 31, in train outputs = net(images) # ネットワークへの代入 File "/usr/local/lib/python3.8/dist-packages/torch/nn/modules/module.py", line 1194, in _call_impl return forward_call(*input, **kwargs) File "/content/drive/MyDrive/Colab Notebooks/JKJ1A/src/net_for_beautiful.py", line 16, in forward x = x.view(-1, 28*28) # 28 x 28の画像を 28*28のベクトルににしていた RuntimeError: shape '[-1, 784]' is invalid for input of size 3072

該当のソースコード

GoogleCoraboratory

1!python src/train_for_beautiful.py --nepochs 10 --batch_size 1 --lr 0.01 --save_model_name 'model/model_for_beautiful.pth'

train_for_beautiful.py

python

1import argparse 2 3import torch 4import torch.nn as nn 5import torch.nn.functional as F 6import torch.optim as optim 7 8 9import sys 10sys.path.append('src') 11from net_for_beautiful import Net 12from jkj1a import load_data 13 14import warnings 15warnings.filterwarnings("ignore") # warningを表示しない 16 17def train(net, trainloader, optimizer, criterion, nepochs): 18 net.train() # ネットワークを「訓練モード」にする(おまじない). 19 20 for epoch in range(nepochs): 21 # --- ここを埋める --------------- 22 running_loss = 0.0 23 for data in trainloader: 24 images, labels = data 25 images, labels = images.cuda(), labels.cuda() 26 27 optimizer.zero_grad() 28 29 outputs = net(images) # ネットワークへの代入 30 loss = criterion(outputs, labels) # ロスの計算 31 loss.backward() # 勾配の計算 32 optimizer.step() # ネットワークパラメタの更新 33 34 running_loss += loss.item() 35 36 running_loss = running_loss / len(trainloader) 37 print(f'[epoch {epoch + 1:2d}] loss: {running_loss:.3f}') 38 39 # ------------------------------ 40 print('Training completed') 41 42def test(net, dataloader): 43 net.eval() # ネットワークを「評価モード」にする(おまじない). 44 45 correct = 0 # 正解数 46 total = 0 # 画像総数 47 48 for data in dataloader: 49 # --- ここを埋める --------------- 50 images, labels = data 51 outputs = net(images.cuda()) 52 predicted = outputs.argmax(dim=1) 53 54 correct += (predicted == labels.cuda()).sum().item() 55 total += len(labels) 56 # ------------------------------ 57 58 acc = correct / total 59 60 return acc 61 62# これはおまじない 63def set_args(): 64 # Training settings 65 parser = argparse.ArgumentParser(description='') 66 parser.add_argument('--batch_size', type=int, default=64) 67 parser.add_argument('--nepochs', type=int, default=14) 68 parser.add_argument('--lr', type=float, default=0.01) 69 parser.add_argument('--save_model_name', type=str, default='') 70 args = parser.parse_args() 71 return args 72 73def main(): 74 # --- 変更不要 -------------------------------- 75 # GPU or CPUなのか表示 76 device = torch.device('cuda:0' if torch.cuda.is_available() else 'cpu') 77 print('using device:', device) 78 79 # `--nepochs 2` などで与えたパラメタの読み込み 80 # `args.nepochs` のようにして使える 81 args = set_args() 82 83 84 # --- データをロード --------------------------- 85 trainloader, testloader, classes = load_data(args.batch_size) 86 87 88 89 90 # --- ネットワークの初期化と学習------------------ 91 net = Net() 92 net.cuda() 93 optimizer = optim.SGD(net.parameters(), lr=args.lr, momentum=0.9) # 確率的勾配法SGD 94 criterion = nn.CrossEntropyLoss() # ロス関数の定義:分類で標準的なクロスエントロピーロス 95 train(net, trainloader, optimizer, criterion, args.nepochs) 96 net.eval() 97 98 # ------------------------------ 99 100 # --- ネットワークを評価して正解率を表示 ---------- 101 train_acc = test(net, trainloader) 102 test_acc = test(net, testloader) 103 print(f'train acc = {train_acc:.3f}') # ':.3f'とつけると小数点以下3桁までの表示になる 104 print(f' test acc = {test_acc:.3f}') 105 106 # --- 変更不要 -------------------------------- 107 if args.save_model_name: # 保存先が与えられている場合保存 108 PATH = args.save_model_name 109 torch.save(net.state_dict(), PATH) 110 111 # state_dict = torch.load(args.save_model_name) # 保存したパラメタをロード 112 # net.load_state_dict(state_dict) # ネットワークにパラメタをセット 113 # train_acc = test(net, trainloader) 114 # test_acc = test(net, testloader) 115 # print(f'train acc = {train_acc:.3f}') # ':.3f'とつけると小数点以下3桁までの表示になる 116 # print(f' test acc = {test_acc:.3f}') 117 118 119# おまじない(変更しなくて良い) 120if __name__ == '__main__': 121 main() # main()が実行される

net_for_beautiful.py

python

1import torch.nn as nn 2import torch.nn.functional as F 3 4class Net(nn.Module): 5 def __init__(self, width = 64): 6 super().__init__() 7 self.width = width 8 self.depth = 4 9 self.parameters_num = 28*28 * self.width + self.width * self.width * (self.depth - 2) + self.width * 10 10 self.fc1 = nn.Linear(28*28, self.width) # 入力28*28次元, 出力128次元 11 self.fc2 = nn.Linear(self.width, self.width) 12 self.fc3 = nn.Linear(self.width, 2) 13 14 15 def forward(self, x): 16 x = x.view(-1, 28*28) # 28 x 28の画像を 28*28のベクトルににしていた 17 x = F.relu(self.fc1(x)) 18 x = F.relu(self.fc2(x)) 19 x = self.fc3(x) 20 return x

jkj1a.py

python

1from pathlib import Path 2 3from PIL import Image 4 5import os 6import torch 7import torchvision.transforms as transforms 8from torchvision.datasets import FashionMNIST 9from torch.utils.data import random_split, DataLoader, Subset, Dataset 10import numpy as np 11 12def load_data(batch_size, metric='beauty', img_size=32): # metric is 'beauty' or 'pleasure' 13 14 # 画像への前処理 15 transform = transforms.Compose( 16 [transforms.Resize(img_size), # original size is 256 x 256 17 transforms.ToTensor(), 18 ] 19 ) 20 21 # ラベルに対する前処理(各自で適宜修正) 22 target_transform = transforms.Compose( 23 [ 24 transforms.Lambda(torch.tensor), 25 transforms.Lambda(lambda x: x / x.norm()) # xは7次元ベクトル(ヒストグラム).それの正規化している. 26 ] 27 ) 28 29 dataset = JKJ1Adataset( 30 transform=transform, 31 target_transform=target_transform, 32 metric=metric) 33 34 n_test = 50 35 n_train = len(dataset) - n_test 36 trainset, testset = random_split(dataset, [n_train, n_test], generator=torch.Generator().manual_seed(42)) 37 38 trainloader = DataLoader(trainset, batch_size=batch_size) 39 testloader = DataLoader(testset, batch_size=batch_size) 40 41 return (trainloader, testloader, metric) 42 43 44class JKJ1Adataset(Dataset): 45 def __init__(self, 46 img_dir='data/JKJ1A-dataset/images', 47 label_dir='data/JKJ1A-dataset/labels', 48 transform=None, 49 target_transform=None, 50 metric='beauty'): 51 52 self.img_dir = img_dir 53 self.label_dir = os.path.join(label_dir, metric) 54 55 # 画像ファイルのパス一覧を取得する。 56 self.images = self.load_images(self.img_dir) 57 self.labels = np.load(os.path.join(self.label_dir, 'histogram.npy')) 58 59 self.transform = transform 60 self.target_transform = target_transform 61 # self.transform = transforms.Compose( 62 # [transforms.Resize(size), 63 # transforms.ToTensor(), 64 # ] # original size is 256 x 256 65 # ) 66 67 def __getitem__(self, index): 68 img = self.images[index] 69 label = self.labels[index] 70 if self.transform is not None: 71 img = self.transform(img) 72 if self.target_transform is not None: 73 label = self.target_transform(label) 74 75 return img, label 76 77 def _get_img_paths(self, img_dir, IMG_EXTENSIONS=[".jpg", ".jpeg", ".png", ".bmp"]): 78 """指定したディレクトリ内の画像ファイルのパス一覧を取得する。 79 """ 80 img_dir = Path(img_dir) 81 img_paths = [ 82 p for p in img_dir.iterdir() if p.suffix in IMG_EXTENSIONS 83 ] 84 85 return img_paths 86 87 def load_images(self, img_dir): 88 img_paths = sorted(self._get_img_paths(img_dir)) 89 images = [Image.open(path) for path in img_paths] 90 return images 91 92 def _get_label_paths(self, label_dir): 93 """指定したディレクトリ内の画像ファイルのパス一覧を取得する。 94 """ 95 label_dir = Path(label_dir) 96 label_paths = [ 97 p for p in label_dir.iterdir() 98 ] 99 100 return label_paths 101 102 def __len__(self): 103 """ディレクトリ内の画像ファイルの数を返す。 104 """ 105 return len(self.labels) 106

試したこと

x.viewの値をエラーメッセージのように3072に変更したところ、今度は別のエラーが出てきました。根本的な解決になってないみたいです...

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

友達の勧めで学習モデルをvggに変更したのですが、依然として出来ていないのでこちらを参照してください。Google Colaboratoryを使った機械学習でイメージのサイズが合わない

投稿2023/02/01 13:03

kinkiki22147048

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.44%

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

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

質問する

関連した質問