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

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

ただいまの
回答率

88.61%

MNISTを元に作成したdatasetで学習したい

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 814

155ccmm

score 12

前提・実現したいこと

MNISTの学習プログラムを元に自分の作成したdatasetを学習させ、3つに分類したいです。
datasetとして下記のように、images.txtを読み込んでdatasetを作成してます。
(とりあえず、自分の作成したdatasetで学習できるのかの動作を確認したいと思っているので、それぞれ5つずつ学習データとして用意しています。)

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

C:\Users\***\Anaconda3\python.exe C:/Users/***/PycharmProjects/project/cnn.py
GPU: -1
# unit: 5
# Minibatch-size: 15
# epoch: 15

Traceback (most recent call last):
  File "C:/Users/***/PycharmProjects/project/cnn.py", line 87, in <module>
    main()
  File "C:/Users/***/PycharmProjects/project/cnn.py", line 52, in main
    train, test = chainer.datasets.LabeledImageDataset(image_files)
ValueError: too many values to unpack (expected 2)

該当のソースコード

from __future__ import print_function
import argparse

import chainer
import chainer.functions as F
import chainer.links as L
import chainer.initializers as I
from chainer import training
from chainer.training import extensions

import numpy as np
import glob


from sklearn.model_selection import train_test_split


class MLP(chainer.Chain):
    def __init__(self, n_units, n_out):
        w = I.Normal(scale=0.05) # モデルパラメータの初期化
        super(MLP, self).__init__(
            conv1=L.Convolution2D(1, 16, 5, 1, 0), # 1層目の畳み込み層(フィルタ数は16)
            conv2=L.Convolution2D(16, 32, 5, 1, 0), # 2層目の畳み込み層(フィルタ数は32)
            l3=L.Linear(None, n_out, initialW=w), #クラス分類用
        )
    def __call__(self, x):
        h1 = F.max_pooling_2d(F.relu(self.conv1(x)), ksize=2, stride=2) # 最大値プーリングは2×2,活性化関数はReLU
        h2 = F.max_pooling_2d(F.relu(self.conv2(h1)), ksize=2, stride=2) 
        y = self.l3(h2)
        return y

def main():
    parser = argparse.ArgumentParser(description='Chainer example: MNIST')
    parser.add_argument('--batchsize', '-b', type=int, default=15, help='Number of images in each mini-batch')
    parser.add_argument('--epoch', '-e', type=int, default=15, help='Number of sweeps over the dataset to train')
    parser.add_argument('--gpu', '-g', type=int, default=-1, help='GPU ID (negative value indicates CPU)')
    parser.add_argument('--out', '-o', default='result', help='Directory to output the result')
    parser.add_argument('--resume', '-r', default='', help='Resume the training from snapshot')
    parser.add_argument('--unit', '-u', type=int, default=5, help='Number of units')
    args = parser.parse_args()

    print('GPU: {}'.format(args.gpu))
    print('# unit: {}'.format(args.unit))
    print('# Minibatch-size: {}'.format(args.batchsize))
    print('# epoch: {}'.format(args.epoch))
    print('')

    image_files = 'images.txt'
    train, test = chainer.datasets.LabeledImageDataset(image_files)
    #train, test = chainer.datasets.get_mnist(ndim=3)# ndim=3を引数で与えるだけでOK

    model = L.Classifier(MLP(args.unit, 10), lossfun=F.softmax_cross_entropy)

    if args.gpu >= 0:
        chainer.cuda.get_device(args.gpu).use()
        model.to_gpu()
    optimizer = chainer.optimizers.Adam()
    optimizer.setup(model)
    train_iter = chainer.iterators.SerialIterator(train, args.batchsize)
    test_iter = chainer.iterators.SerialIterator(test, args.batchsize, repeat=False, shuffle=False)
    updater = training.StandardUpdater(train_iter, optimizer, device=args.gpu)

    trainer = training.Trainer(updater, (args.epoch, 'epoch'), out=args.out)
    trainer.extend(extensions.Evaluator(test_iter, model, device=args.gpu))
    trainer.extend(extensions.dump_graph('main/loss'))
    trainer.extend(extensions.snapshot(), trigger=(args.epoch, 'epoch'))
    trainer.extend(extensions.LogReport())
    trainer.extend(extensions.PlotReport(['main/loss', 'validation/main/loss'], 'epoch', file_name='loss.png'))
    trainer.extend(extensions.PlotReport(['main/accuracy', 'validation/main/accuracy'], 'epoch', file_name='accuracy.png'))
    trainer.extend(extensions.PrintReport( ['epoch', 'main/loss', 'validation/main/loss', 'main/accuracy', 'validation/main/accuracy', 'elapsed_time']))
    trainer.extend(extensions.ProgressBar())

    if args.resume:
        chainer.serializers.load_npz(args.resume, trainer)

    trainer.run()
    model.to_cpu()

    modelname = args.out + "/MLP.model"
    print('save the trained model: {}'.format(modelname))
    chainer.serializers.save_npz(modelname, model)

if __name__ == '__main__':
    main()
./dataset/pic/train/1/2.png 1
./dataset/pic/train/1/3.png 1
./dataset/pic/train/1/4.png 1
./dataset/pic/train/1/5.png 1
./dataset/pic/train/1/6.png 1
./dataset/pic/train/2/2.png 2
./dataset/pic/train/2/3.png 2
./dataset/pic/train/2/4.png 2
./dataset/pic/train/2/5.png 2
./dataset/pic/train/2/6.png 2
./dataset/pic/train/3/41.png 3
./dataset/pic/train/3/42.png 3
./dataset/pic/train/3/43.png 3
./dataset/pic/train/3/44.png 3
./dataset/pic/train/3/45.png 3

試したこと

ここに問題に対して試したことを記載してください。

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

+1

エラー文を怖がらずに読んでみてください

ValueError: too many values to unpack (expected 2)

意訳
2つの値が出てくることを期待されてるけど、
それは多すぎて展開できないよ。

つまり

train, test = chainer.datasets.LabeledImageDataset(image_files)

のところがいけなくて
data_set = chainer.datasets.LabeledImageDataset(image_files)
としておいたあとに
何かしたの関数を使用してtrainとtestに分けなければいけません

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.61%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る