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

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

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

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

Q&A

0回答

686閲覧

CNNの畳み込み層を増やしたい

pootare

総合スコア16

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python

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

0グッド

0クリップ

投稿2022/01/15 10:27

実現したいこと

「ゼロから作るDeep Learning」を使ってCNNの勉強をしています。
掲載されているコードを改良して畳み込み層を増やし、学習させようとしたところ、
以下のエラーメッセージが発生しました。

配列の形状が違うので発生していることは分かったのですが、どのように改善すれば良いか分かりません。
ご教授よろしくお願いします。

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

ValueError Traceback (most recent call last) <ipython-input-19-96707e20b5db> in <module> 44 45 # 勾配の計算 (誤差逆伝播法を用いる) ---> 46 grads = net.gradient(x_train, t_train) 47 48 # 更新 <ipython-input-17-fe57c9e3d239> in gradient(self, x, t) 98 """ 99 # forward --> 100 self.loss(x, t) 101 102 # backward <ipython-input-17-fe57c9e3d239> in loss(self, x, t) 68 t : 教師データ 69 """ ---> 70 y = self.predict(x) 71 return self.last_layer.forward(y, t) 72 <ipython-input-17-fe57c9e3d239> in predict(self, x) 58 def predict(self, x): 59 for layer in self.layers.values(): ---> 60 x = layer.forward(x) 61 62 return x ~\OneDrive\Documents\hoge1\hoge2\hoge3\hoge4\common\layers.py in forward(self, x) 340 341 # 行列の積を計算し、バイアスを足す --> 342 out = np.dot(col, col_W) + self.b 343 344 # 画像形式に戻して、チャンネルの軸を2番目に移動させる ValueError: shapes (8192,750) and (25,30) not aligned: 750 (dim 1) != 25 (dim 0)

該当のソースコード

クラスの実装

python

1class ConvNet: 2 def __init__(self, input_dim=(1, 28, 28), 3 conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, 4 pool_param={'pool_size':2, 'pad':0, 'stride':2}, 5 hidden_size=100, output_size=15, weight_init_std=0.01): 6 """ 7 input_size : tuple, 入力の配列形状(チャンネル数、画像の高さ、画像の幅) 8 conv_param : dict, 畳み込みの条件 9 pool_param : dict, プーリングの条件 10 hidden_size : int, 隠れ層のノード数 11 output_size : int, 出力層のノード数 12 weight_init_std : float, 重みWを初期化する際に用いる標準偏差 13 """ 14 15 filter_num = conv_param['filter_num'] 16 filter_size = conv_param['filter_size'] 17 filter_pad = conv_param['pad'] 18 filter_stride = conv_param['stride'] 19 20 pool_size = pool_param['pool_size'] 21 pool_pad = pool_param['pad'] 22 pool_stride = pool_param['stride'] 23 24 input_size = input_dim[1] 25 conv_output_size = (input_size + 2*filter_pad - filter_size) // filter_stride + 1 # 畳み込み後のサイズ(H,W共通) 26 pool_output_size = (conv_output_size + 2*pool_pad - pool_size) // pool_stride + 1 # プーリング後のサイズ(H,W共通) 27 pool_output_pixel = filter_num * pool_output_size * pool_output_size # プーリング後のピクセル総数 28 29 # 重みの初期化 30 self.params = {} 31 std = weight_init_std 32 self.params['W1'] = std * np.random.randn(filter_num, input_dim[0], filter_size, filter_size) # W1は畳み込みフィルターの重みになる 33 self.params['b1'] = np.zeros(filter_num) #b1は畳み込みフィルターのバイアスになる 34 self.params['W11'] = std * np.random.randn(filter_num, input_dim[0], filter_size, filter_size) # W1は畳み込みフィルターの重みになる 35 self.params['b11'] = np.zeros(filter_num) #b1は畳み込みフィルターのバイアスになる 36 self.params['W2'] = std * np.random.randn(pool_output_pixel, hidden_size) 37 self.params['b2'] = np.zeros(hidden_size) 38 self.params['W3'] = std * np.random.randn(hidden_size, output_size) 39 self.params['b3'] = np.zeros(output_size) 40 41 # レイヤの生成 42 self.layers = OrderedDict() 43 self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'], 44 conv_param['stride'], conv_param['pad']) # W1が畳み込みフィルターの重み, b1が畳み込みフィルターのバイアスになる 45 self.layers['ReLU1'] = ReLU() 46 self.layers['Pool1'] = MaxPooling(pool_h=pool_size, pool_w=pool_size, stride=pool_stride, pad=pool_pad) 47 self.layers['Conv2'] = Convolution(self.params['W11'], self.params['b11'], 48 conv_param['stride'], conv_param['pad']) # W1が畳み込みフィルターの重み, b1が畳み込みフィルターのバイアスになる 49 self.layers['ReLU2'] = ReLU() 50 self.layers['Pool2'] = MaxPooling(pool_h=pool_size, pool_w=pool_size, stride=pool_stride, pad=pool_pad) 51 52 self.layers['Affine1'] = Affine(self.params['W2'], self.params['b2']) 53 self.layers['ReLU2'] = ReLU() 54 self.layers['Affine2'] = Affine(self.params['W3'], self.params['b3']) 55 56 self.last_layer = SoftmaxWithLoss() 57 58 def predict(self, x): 59 for layer in self.layers.values(): 60 x = layer.forward(x) 61 62 return x 63 64 def loss(self, x, t): 65 """ 66 損失関数 67 x : 入力データ 68 t : 教師データ 69 """ 70 y = self.predict(x) 71 return self.last_layer.forward(y, t) 72 73 def accuracy(self, x, t, batch_size=100): 74 if t.ndim != 1 : t = np.argmax(t, axis=1) 75 76 acc = 0.0 77 78 for i in range(int(x.shape[0] / batch_size)): 79 tx = x[i*batch_size:(i+1)*batch_size] 80 tt = t[i*batch_size:(i+1)*batch_size] 81 y = self.predict(tx) 82 y = np.argmax(y, axis=1) 83 acc += np.sum(y == tt) 84 85 return acc / x.shape[0] 86 87 def gradient(self, x, t): 88 """勾配を求める(誤差逆伝播法) 89 Parameters 90 ---------- 91 x : 入力データ 92 t : 教師データ 93 Returns 94 ------- 95 各層の勾配を持ったディクショナリ変数 96 grads['W1']、grads['W2']、...は各層の重み 97 grads['b1']、grads['b2']、...は各層のバイアス 98 """ 99 # forward 100 self.loss(x, t) 101 102 # backward 103 dout = 1 104 dout = self.last_layer.backward(dout) 105 106 layers = list(self.layers.values()) 107 layers.reverse() 108 for layer in layers: 109 dout = layer.backward(dout) 110 111 # 設定 112 grads = {} 113 grads['W1'], grads['b1'] = self.layers['Conv1'].dW, self.layers['Conv1'].db 114 grads['W11'], grads['b11'] = self.layers['Conv2'].dW, self.layers['Conv2'].db 115 grads['W2'], grads['b2'] = self.layers['Affine1'].dW, self.layers['Affine1'].db 116 grads['W3'], grads['b3'] = self.layers['Affine2'].dW, self.layers['Affine2'].db 117 118 return grads

実行したコード

python

1x = X_train[:47980,:] 2t = y_train[:47980,:] 3 4x = x.reshape(-1,1,28,28) # 配列形式の変形 5 6epochs = 20 7batch_size = 128 8 9optimizer = RMSProp(lr=0.01, rho=0.9) 10 11# 繰り返し回数 12xsize = x.shape[0] 13iter_num = np.ceil(xsize / batch_size).astype(np.int) 14 15 16# CNNのオブジェクト生成 17net = ConvNet(input_dim=(1, 28, 28), 18 conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, 19 pool_param={'pool_size':2, 'pad':0, 'stride':2}, 20 hidden_size=100, output_size=15, weight_init_std=0.01) # output_size:文字の数 21 22train_loss = [] 23test_loss = [] 24train_accuracy = [] 25test_accuracy = [] 26 27for epoch in tqdm(range(epochs)): 28 # print("epoch=%s"%epoch) 29 30 # シャッフル 31 idx = np.arange(xsize) 32 np.random.shuffle(idx) 33 34 for it in range(iter_num): 35 """ 36 ランダムなミニバッチを順番に取り出す 37 """ 38 # print("it=", it) 39 mask = idx[batch_size*it : batch_size*(it+1)] 40 41 # ミニバッチの生成 42 x_train = x[mask] 43 t_train = t[mask] 44 45 # 勾配の計算 (誤差逆伝播法を用いる) 46 grads = net.gradient(x_train, t_train) 47 48 # 更新 49 optimizer.update(net.params, grads) 50 51 ## 学習経過の記録 52 53 # 訓練データにおけるloss 54# print("calculating train_loss") 55 train_loss.append(net.loss(x, t)) 56 57# print("calculating test_loss") 58 # テストデータにおけるloss 59 test_loss.append(net.loss(X_test, y_test)) 60 61# print("calculating train_accuracy") 62 # 訓練データにて精度を確認 63 train_accuracy.append(net.accuracy(x, t)) 64 65# print("calculating test_accuracy") 66 # テストデータにて精度を算出 67 test_accuracy.append(net.accuracy(X_test, y_test)) 68

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問