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

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

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

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

Q&A

解決済

1回答

2821閲覧

「ゼロから作るディープラーニング」7章でつまずました。

kuma1957

総合スコア12

Python

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

0グッド

0クリップ

投稿2018/04/02 05:11

編集2018/04/02 14:36

前提・実現したいこと

「ゼロから作るディープラーニング」
7章
畳み込みニューラルネットワーク
でSampleCodeは実行できましたが、入力画像を変えて
120(高さ)x160(幅)の画像を入力して
train_covnet.pyを実行すると
演算途中でエラーで停止します。

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

SimpleConvNetで
class Affine
def forward
out = np.dot(self.x self.W) + self.b
部分の行列の内積で dimが合っていないようです。

画像のH=60 W=160 条件化のエラーコード ValueError: shapes (100,19656) and (7056,2000) not aligned: 19656 (dim 1) != 7056 (dim 0)
場所は以下 trainer.train()/self.train_step()/self.loss(x, t)/y = self.predict(x)/x = layer.forward(x)/out = np.dot(self.x, self.W) + self.b

該当のソースコード

SimpleConvNetの設定は

network=SimpleConvNet(input_dim=(1,60,160),conv_param = {'filter_num': 9, 'filter_size': 5, 'pad': 0, 'stride': 1}, hidden_size=2000, output_size=4, weight_init_std=0.01)

trainer = Trainer(network, x_train, t_train, x_test, t_test,
epochs=max_epochs, mini_batch_size=100,
optimizer='Adam', optimizer_param={'lr': 0.001},
evaluate_sample_num_per_epoch=1000)
trainer.train()

試したこと

幾つかのパラメーターを 振って、エラーログを見てみました。
計算方程式を作り、満たす解をもとめてみましたが ありませんでした。

全結合の入力は
W= 係数xpool_out_size,hidden_sizeで決定されます。
def forward
out = np.dot(self.x self.W) + self.b
のxは、エラーログからxのサイズは、
①filter_num
②入力画像のW,H
③filter_size
④Pad
⑤strideに依存しますが
今はpad=0 stride=1にしているので依存は①-③までです。

sample Codeだと高さ=幅の画像しか扱えないような
計算式になっているように思えますが、何か
これを打開する方法はありますでしょうか?

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

少しだけ、不思議なのは、ここでは、Wはpool_out_sizeで規定される
し、CONVの出力もpool_out_sizeですが、
out = np.dot(self.x self.W) + self.b
はxは入力画像をもとに計算された大きさになっている事です。
つまり入力画像をもとに計算された値とWの内積をしている事です。

Python 3.6.1
Ubuntu 16.04 LTS

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

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

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

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

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

wakame

2018/04/02 07:34

出力されたエラーコードを追記してください
mkgrei

2018/04/02 09:20

コードを```で囲ってください。
y_waiwai

2018/04/02 11:34

初心者本の内容なんかエキスパートなひとは知らんだろうし、内容知ってるような初心者は答えれないだろうしというジレンマ
wakame

2018/04/02 11:47 編集

CNNでwidthとheightの値が異なるというのが気になりました。
退会済みユーザー

退会済みユーザー

2018/04/02 11:58 編集

縦横比が合うようにcv2.resizeで画像をリサイズするのは邪道ですか?ネットワーク構造を変えるよりたぶんバグりにくいので安全でシンプルで思い立ってから実装するまでが速い気がします。画像が多少歪んでいても、学習枚数が多ければちゃんと理解してくれそうな気がしますが...
guest

回答1

0

自己解決

教科書のサンプルコード⇒画像size,オペレータsize,Pad_size,の演算式からなりpool_out_sizeをH方向の値からのみで求めてました。(だから、H方向W方向同じサイズでないと上手く動作しませんでした)今回は、縦横が違うので、それぞれ求める必要があると理解しまた。H方向 W方向それぞれに値を計算し、pool_output_sizeを計算したところ上手く動きました。

教科書のサンプルコードは

input_size = input_dim[1] conv_output_size = (input_size - filter_size + 2*filter_pad) / filter_stride +1 pool_output_size = int(filter_num * (conv_output_size/2) * (conv_output_size/2))

修正は

input_size1 = input_dim[1] input_size2 = input_dim[2] conv_output_size1 = (input_size1 - int(filter_size / 2) * 2 + 2 * filter_pad) / filter_stride conv_output_size2 = (input_size2 - int(filter_size / 2) * 2 + 2 * filter_pad) / filter_stride pool_output_size = int(filter_num * (conv_output_size1 / 2) * (conv_output_size2 / 2))

注意点:偶数のオペレータ(この教科書ではフィルター)は未確認です。
一般的なオペレーターは画像を余らせないため奇数なので2で割り両サイドのため2を掛けています。このため教科書にある+1はしていません。

投稿2018/04/03 02:01

編集2018/04/03 05:34
kuma1957

総合スコア12

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問