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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Chainer

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

Python 3.x

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

機械学習

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

Python

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

Q&A

1回答

621閲覧

CNNのconv層からlinear層への渡し方がわからない

null0723

総合スコア22

Chainer

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

Python 3.x

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

機械学習

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

Python

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

0グッド

1クリップ

投稿2018/12/19 02:06

前提・実現したいこと

現在、chainerの勉強でCNNを用いたニューラルネットワークの実装を試みています。

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

今回、convolution2D層からlinear層にデータを渡す際、エラーが起こってしまいました。

Exception in main training loop: Invalid operation is performed in: LinearFunction (Forward) Expect: x.shape[1] == W.shape[1] Actual: 65536 != 512 Traceback (most recent call last): File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/trainer.py", line 315, in run update() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 165, in update self.update_core() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 181, in update_core optimizer.update(loss_func, in_arrays) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/optimizer.py", line 680, in update loss = lossfun(*args, **kwds) File "/home/tetsuro/AttnGAN-master/data/coco/net.py", line 64, in lf mu, ln_var = self.encode(x) File "/home/tetsuro/AttnGAN-master/data/coco/net.py", line 41, in encode mu = self.le4_mu(h3) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/link.py", line 242, in __call__ out = forward(*args, **kwargs) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/links/connection/linear.py", line 138, in forward return linear.linear(x, self.W, self.b, n_batch_axes=n_batch_axes) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/functions/connection/linear.py", line 289, in linear y, = LinearFunction().apply(args) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/function_node.py", line 245, in apply self._check_data_type_forward(in_data) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/function_node.py", line 330, in _check_data_type_forward self.check_type_forward(in_type) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/functions/connection/linear.py", line 27, in check_type_forward x_type.shape[1] == w_type.shape[1], File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/utils/type_check.py", line 546, in expect expr.expect() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/utils/type_check.py", line 483, in expect '{0} {1} {2}'.format(left, self.inv, right)) Will finalize trainer extensions and updater before reraising the exception. Traceback (most recent call last): File "train_vae_img.py", line 128, in <module> main() File "train_vae_img.py", line 88, in main trainer.run() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/trainer.py", line 329, in run six.reraise(*sys.exc_info()) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/six.py", line 693, in reraise raise value File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/trainer.py", line 315, in run update() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 165, in update self.update_core() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/training/updaters/standard_updater.py", line 181, in update_core optimizer.update(loss_func, in_arrays) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/optimizer.py", line 680, in update loss = lossfun(*args, **kwds) File "/home/tetsuro/AttnGAN-master/data/coco/net.py", line 64, in lf mu, ln_var = self.encode(x) File "/home/tetsuro/AttnGAN-master/data/coco/net.py", line 41, in encode mu = self.le4_mu(h3) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/link.py", line 242, in __call__ out = forward(*args, **kwargs) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/links/connection/linear.py", line 138, in forward return linear.linear(x, self.W, self.b, n_batch_axes=n_batch_axes) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/functions/connection/linear.py", line 289, in linear y, = LinearFunction().apply(args) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/function_node.py", line 245, in apply self._check_data_type_forward(in_data) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/function_node.py", line 330, in _check_data_type_forward self.check_type_forward(in_type) File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/functions/connection/linear.py", line 27, in check_type_forward x_type.shape[1] == w_type.shape[1], File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/utils/type_check.py", line 546, in expect expr.expect() File "/home/tetsuro/.virtualenvs/Test/lib/python3.5/site-packages/chainer/utils/type_check.py", line 483, in expect '{0} {1} {2}'.format(left, self.inv, right)) chainer.utils.type_check.InvalidType: Invalid operation is performed in: LinearFunction (Forward) Expect: x.shape[1] == W.shape[1] Actual: 65536 != 512

該当のソースコード

Python3

1#!/usr/bin/env python 2 3 4import six 5 6import chainer 7import chainer.functions as F 8from chainer.functions.loss.vae import gaussian_kl_divergence 9import chainer.links as L 10 11 12class VAE(chainer.Chain): 13 """ Variational AutoEncoder""" 14 15 16 def __init__(self, n_ch, n_latent, n_first): 17 super(VAE, self).__init__() 18 with self.init_scope(): 19 # encoder 入力から隠れベクトルの作成 20 self.le1 = L.Convolution2D(n_ch, n_first, 4, 2, 1) 21 self.le2 = L.Convolution2D(n_first, n_first * 2, 4, 2, 1) 22 self.le3 = L.Convolution2D(n_first * 2, n_first * 4, 4, 2, 1) 23 self.le4_mu = L.Linear(n_first*4, n_latent) 24 self.le4_ln_var = L.Linear(n_first*4, n_latent) 25 # decoder 26 27 self.ld1 = L.Linear(n_latent, 512) 28 self.ld2 = L.Deconvolution2D(n_first * 4, n_first * 2, 4, 2, 1) 29 self.ld3 = L.Deconvolution2D(n_first * 2, n_first, 4, 2, 1) 30 self.ld4 = L.Deconvolution2D(n_first, 1, 4, 2, 1) 31 32 33 def forward(self, x, sigmoid=False): 34 """AutoEncoder""" 35 return self.decode(self.encode(x), sigmoid) 36 37 def encode(self, x): 38 h1 = F.leaky_relu(self.le1(x), slope = 0.2) 39 h2 = F.leaky_relu(self.le2(h1), slope = 0.2) 40 h3 = F.leaky_relu(self.le3(h2), slope = 0.2) 41 mu = self.le4_mu(h3) 42 ln_var = self.le4_ln_var(h3) # log(sigma**2) 43 return mu, ln_var 44 45 def decode(self, z, sigmoid=False): 46 h1 = F.relu(self.ld1(z)) 47 h2 = F.relu(self.ld2(h1)) 48 h3 = F.relu(self.ld3(h2)) 49 h4 = self.ld4(h3) 50 if sigmoid: 51 return F.F.sigmoid(h4) 52 else: 53 return h4 54 55 def get_loss_func(self, beta=1.0, k=1): 56 """ 57 VAEの損失の計算 58 Args: 59 C (int): 正則化項をどれだけ効かせるかの変数、通常1.0が使用される 60 k (int): サンプルを何回行うか 61 """ 62 63 def lf(x): 64 mu, ln_var = self.encode(x) 65 batchsize = len(mu) 66 # 復元誤差の計算 67 rec_loss = 0 68 for l in six.moves.range(k): 69 z = F.gaussian(mu, ln_var) 70 # rec_loss += F.bernoulli_nll(x, self.decode(z, sigmoid=False)) / (k * batchsize) 71 rec_loss += F.mean_squared_error( 72 x, self.decode(z, sigmoid=False)) / (k * batchsize) 73 self.rec_loss = rec_loss 74 self.loss = self.rec_loss + \ 75 beta * gaussian_kl_divergence(mu, ln_var) / batchsize 76 chainer.report( 77 {'rec_loss': rec_loss, 'loss': self.loss}, observer=self) 78 return self.loss 79 return lf 80 81

試したこと

linearで受け取るデータが512次元になってないのかと思い、
self.le4_mu = L.Linear(n_first4, n_latent)
self.le4_ln_var = L.Linear(n_first
4, n_latent)
のn_first*4を512にしたのですがエラーが出てしまいました。

どのようにコードを書き換えればよいでしょうか。

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

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

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

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

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

kzm4269

2018/12/19 02:55

`VAE` クラスをどうインスタンス化してどう扱おうとしたのかの情報が不足しています。 エラーを再現可能なソースコードを記載してください。
null0723

2018/12/19 03:19

文字数制限があったので別の質問として投稿しました。
guest

回答1

0

畳み込み層からの出力は512ですが、これは「2次元のデータが512ある」です。データの総数は、この時点での2次元データの総数倍あります。
10*10の画像を入力していたなら、51200ある。

chainerはdefine by run なので、入力はNoneでいいですよ。

python

1 self.le1 = L.Convolution2D(None, n_first, 4, 2, 1) 2 self.le2 = L.Convolution2D(None, n_first * 2, 4, 2, 1) 3 self.le3 = L.Convolution2D(None, n_first * 4, 4, 2, 1) 4 self.le4_mu = L.Linear(None, n_latent) 5 self.le4_ln_var = L.Linear(None, n_latent)

投稿2018/12/19 07:35

編集2018/12/19 11:24
Q71

総合スコア995

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

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

null0723

2018/12/19 07:41

入力をNoneにした場合、self.ld1 = L.Linearの引数はn_latentと何になるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問