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

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

ただいまの
回答率

91.26%

  • Python 3.x

    2747questions

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

  • Chainer

    67questions

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

chainerの学習時に起きる次元数のエラー

受付中

回答 1

投稿

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

sankaku_360

score 0

前提・実現したいこと

python及びchainer初心者のものですが、150個のラベルを持ったデータを教師データとして
CNNを使った学習を行おうとしているのですが、以下のようなエラーが出てしまい、行き詰まってしまいました
ご教授お願い致します。

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

Invalid operation is performed in: Convolution2DFunction (Forward)

Expect: in_types[0].ndim == 4
Actual: 3 != 4

該当のソースコード

import numpy as np
import matplotlib.pylab as plt
from matplotlib import cm
import chainer
from chainer import Chain, optimizers, training
from chainer.training import extensions
import chainer.functions as F
import chainer.links as L
from sklearn.datasets import fetch_mldata
from gensim.models import word2vec
from gensim import corpora, models, similarities
from chainer import cuda
import cupy

cuda.get_device_from_id(0).use()

vector_D=300
S_length=150
N_data = 28732
#word2vecのデータをロード
w2v_model = word2vec.Word2Vec.load("sample.model")

# 学習データ作成
count =0
f = open('learning_data.txt','r' ,encoding='utf-8_sig')
data = f.readlines()
dataset = [] #最終的なデータセットの格納場所
picture = np.zeros((S_length,vector_D)) #文章を画像と見たときの画像の格納場所
label = np.zeros(S_length)
pict_data=[]
label_data=[]
#pict_data=np.zeros(28732) #画像データをまとめてここに保存
#label_data=np.zeros(28732)
empty = []
zero = np.zeros(vector_D) #空ピクセル
q=0
pictcount=0
labelcount=0
for text in data:
    a = count%3
    b = (count+2)%3
    if a == 0:
        sentense=data[count].split()
        for i in range(S_length):
            n = len(sentense)
            if n > i:
                word = sentense[i]
                vector=w2v_model[word]
                for vectordimension in range(vector_D):
                    picture[i][vectordimension]=vector[vectordimension]
            else :
                for vectordimension in range(vector_D):
                    picture[i][vectordimension]=0
        pict_data.append(picture)
        #pict_data[pictcount] = picture
        #pictcount=pictcount+1
    if b == 0:
        label_txt = data[count]
        label_txt=label_txt.replace('[','')
        label_txt=label_txt.replace(']','')
        z = label_txt.split(',')
        for x in range(S_length):
            a = int(z[x])
            label[x] = a

        label_data.append(label)
        #label_data[labelcount] = label
        #labelcount = labelcount+1
    q=0
    count=count+1


for x, t in zip(pict_data, label_data):
    dataset.append((x, t))


# 畳み込みニューラルネットワーク

# モデルクラス定義

class CNN(Chain):
    def __init__(self):
        # クラスの初期化
        super(CNN, self).__init__(
            conv1 = L.Convolution2D(1, 20, 5), # フィルター5
            conv2 = L.Convolution2D(20, 50, 5), # フィルター5
            l1 = L.Linear(800, 500),
            l2 = L.Linear(500, 500),
            l3 = L.Linear(500, 150)
        )

    def __call__(self, x):
        # 順伝播の計算を行う関数
        # :param x: 入力値
        h1 = F.max_pooling_2d(F.relu(self.conv1(x)), 2)
        h2 = F.max_pooling_2d(F.relu(self.conv2(h1)), 2)
        h3 = F.relu(self.l1(h2))
        h4 = F.relu(self.l2(h3))
        y = self.l3(h4)
        return y

# 学習

EPOCH_NUM = 5
BATCH_SIZE = 100

N = len(dataset)
print(N)
# モデルの定義
model = L.Classifier(CNN(),F.sigmoid_cross_entropy)
optimizer = optimizers.Adam()
optimizer.setup(model)

# 学習開始
print("Train")
train, test = chainer.datasets.split_dataset_random(dataset, N-1000) # 60000件を学習用、10000件をテスト用
train_iter = chainer.iterators.SerialIterator(train, BATCH_SIZE)
test_iter = chainer.iterators.SerialIterator(test, BATCH_SIZE, repeat=False, shuffle=False)
updater = training.StandardUpdater(train_iter, optimizer, device=-1)
trainer = training.Trainer(updater, (EPOCH_NUM, "epoch"), out="result")
trainer.extend(extensions.Evaluator(test_iter, model, device=-1))
trainer.extend(extensions.LogReport())
trainer.extend(extensions.PrintReport( ["epoch", "main/loss", "validation/main/loss", "main/accuracy", "validation/main/accuracy", "elapsed_time"])) # エポック、学習損失、テスト損失、学習正解率、テスト正解率、経過時間
trainer.extend(extensions.ProgressBar()) # プログレスバー出力
print("Train Start!")
trainer.run()
print("Train finish!")

試したこと

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

chainerのバージョンは3.1です

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

+1

picture = np.zeros((S_length,vector_D))とありますので、添字の数が足りていません。Conv2Dを行うためには3つ添字が必要です。

pictureにwordを入れていますが、何かのコードをご自身のデータに沿うように変更しているのでしょうか。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/17 19:58

    はい。pictureには文字をベクトルに変えた分散表現を入れております。
    追加で質問をしたいことがあるのですが、sigmoid_cross_entropyの部分で
    同じようなエラーが発生しました。同じ次元数に関わる問題だと思うのですが、
    肝心の部分が Actual: f != i と変数になっているので対応の仕方が分かりません。
    できれば、教えていただけると助かります。

    キャンセル

  • 2017/12/17 22:27

    https://teratail.com/questions/104113
    エラーだけ見ると、ラベルデータの型が整数ではないせいです。

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

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

  • Python 3.x

    2747questions

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

  • Chainer

    67questions

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