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

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

ただいまの
回答率

90.53%

  • Python 3.x

    9405questions

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

  • Chainer

    196questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。

chainerで推論をするときに,データを入れようとすると次元の問題でエラーが起こる

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 4,058

misogil

score 7

前提・実現したいこと

chainerで出力層の結果(10次元のベクトル)を得たいです.
そのために、cifar-10やmnistの時と同じようにデータを(3*H*W){チャンネル,高さ,幅}にしたのですが,
いざ学習したネットワークに流しこむ時にエラーが発生してしまいます.

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

Invalid operation is performed in Convolution2DFunction (Forward)
Expect: in_types[0].ndim == 4
Actual: 3 != 4

該当のソースコード

import chainer
import chainer.functions as F
import chainer.links as L
from chainer import training
from chainer.training import extensions
from chainer.datasets import tuple_dataset
from chainer import Variable
from chainer import serializers
import numpy as np
import _pickle as cpickle
import os
import random

xp = chainer.cuda.cupy

def load_pickle():
    base_path = os.path.dirname(os.path.abspath(__file__))
    hair_path = os.path.normpath(os.path.join(base_path, '../result/result_pickle'))
    imageData = []
    labelData = []
    test_tuple = []
    af_imageData = []
    af_labelData = []
    for directory in os.listdir(hair_path):
        if directory.find('.DS_Store') > -1:
            continue
        file_path = hair_path + '/' + directory
        for img in os.listdir(file_path):
            if img.find('_DS_Store') > -1 or img.find('.DS_Store') > -1:
                continue
            pickle_dt = np.load(file_path + '/' + img).reshape(3, 5625)
            r, g, b = pickle_dt[0], pickle_dt[1], pickle_dt[2]
            rImg = np.asarray(np.float32(r) / 255.0).reshape(75, 75)
            gImg = np.asarray(np.float32(g) / 255.0).reshape(75, 75)
            bImg = np.asarray(np.float32(b) / 255.0).reshape(75, 75)
            all_ary = np.asarray([rImg, gImg, bImg])
            test_tuple.append((all_ary, np.int32(int(directory))))
            imageData.append(all_ary)
            labelData.append(np.int32(int(directory)))

    random.shuffle(test_tuple)

    for tuple in test_tuple:
        af_imageData.append(tuple[0])
        af_labelData.append(tuple[1])

    return af_imageData, af_labelData

def load_result_pickle():
    base_path = os.path.dirname(os.path.abspath(__file__))
    result_path = os.path.normpath(os.path.join(base_path, '../result/result_pickle'))
    imageData = []
    # labelData = []

    for image in os.listdir(result_path):
        if image.find('.DS_Store') > -1:
            continue
        np_pickle = np.load(result_path + '/' + image).reshape(3, 5625)
        r, g, b = np_pickle[0], np_pickle[1], np_pickle[2]
        rImg = np.asarray(np.float32(r) / 255.0).reshape(75, 75)
        gImg = np.asarray(np.float32(g) / 255.0).reshape(75, 75)
        bImg = np.asarray(np.float32(b) / 255.0).reshape(75, 75)
        all_ary = np.asarray([rImg, gImg, bImg])
        imageData.append(all_ary)
        # labelData.append(np.int32(0))

    return imageData

class AlexNet(chainer.Chain):

    def __init__(self):
        super(AlexNet, self).__init__(
            conv1 = L.Convolution2D(None, 96, 6, stride=3),
            conv2 = L.Convolution2D(None, 128, 3, pad=2),
            # conv3 = L.Convolution2D(None, 256, 3, pad=1),
            conv4 = L.Convolution2D(None, 128, 3, pad=1),
            fc6 = L.Linear(None, 6400),
            fc7 = L.Linear(None, 6400),
            fc8 = L.Linear(None, 1000),
            #fc9 = L.Linear(None, 20)

        )

        # self.vector = 0

    def __call__(self, x):
        h = F.max_pooling_2d(F.local_response_normalization(F.relu(self.conv1(x))), 3, stride=1)
        h = F.max_pooling_2d(F.local_response_normalization(F.relu(self.conv2(h))), 3, stride=1)
        # h = F.relu(self.conv3(h))
        h = F.max_pooling_2d(F.relu(self.conv4(h)), 3, stride=2)
        h = F.dropout(F.relu(self.fc6(h)))
        h = F.dropout(F.relu(self.fc7(h)))
        h = self.fc8(h)
        # self.vector = h
        return h

# ベクトル化するために全データを配列へ入れる
imgData = load_result_pickle()
# モデルのロード
model = AlexNet()
chainer.serializers.load_npz('smaller_alex_not_Classifier', model)
optimizer = chainer.optimizers.Adam()
optimizer.setup(model)

for img in imgData:
    y = model(img)

試したこと

学習時はデータをL.Classifier()に入れて学習させました。
http://qiita.com/Worldforward/items/f72d907cbe2760b72c2a
ここを参考に,AlexNet単体と,L.Classifier(AlexNet())のパラメータは別々に保存してあります。
4つ目の次元についてが分かりません。バッチサイズなのか,正解ラベルなのか..?と思っています。
学習時にはtrainerを利用して,データをtuple_datasetにすることによって学習させました。
GPUを利用していて,GTX1070を使っています。

よろしくお願いします。

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

より詳細な情報

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

check解決した方法

0

テンソルをreshape(1,3,75,75)と変換して解決しました。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

  • Python 3.x

    9405questions

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

  • Chainer

    196questions

    Chainerは、国産の深層学習フレームワークです。あらゆるニューラルネットワークをPythonで柔軟に書くことができ、学習させることが可能。GPUをサポートしており、複数のGPUを用いた学習も直感的に記述できます。