下記のエラーが発生しました。
kerasなどを使用せずに画像認識の精度を上げたいと考えています。
CNNで層を増やしたく、自分でいじってみたのですがよくわからない状態になりました。
もしよろしければアドバイスを頂ければと思っています。
よろしくお願い致します。
エラー文
ValueError: shapes (6400,750) and (700,30) not aligned: 750 (dim 1) != 700 (dim 0)
該当コード
class SimpleConvNet: def __init__(self, input_dim=(1, 28, 28), conv_param={'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1}, hidden_size=100, output_size=15, weight_init_std=0.01): """ input_size : 入力の配列形状(チャンネル数、画像の高さ、画像の幅) conv_param : 畳み込みの条件, dict形式 例、{'filter_num':30, 'filter_size':5, 'pad':0, 'stride':1} hidden_size : 隠れ層のノード数 output_size : 出力層のノード数 weight_init_std : 重みWを初期化する際に用いる標準偏差 """ filter_num = conv_param['filter_num'] filter_size = conv_param['filter_size'] filter_pad = conv_param['pad'] filter_stride = conv_param['stride'] 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)) # 重みの初期化 self.params = {} std = weight_init_std self.params['W1'] = std * np.random.randn(filter_num, input_dim[0], filter_size, filter_size) self.params['b1'] = np.zeros(filter_num) self.params['W2'] = std * np.random.randn(filter_num, input_dim[1], filter_size, filter_size) self.params['b2'] = np.zeros(filter_num) self.params['W3'] = std * np.random.randn(filter_num, input_dim[2], filter_size, filter_size) self.params['b3'] = np.zeros(filter_num) self.params['W4'] = std * np.random.randn(pool_output_size, hidden_size) self.params['b4'] = np.zeros(hidden_size) self.params['W5'] = std * np.random.randn(hidden_size, output_size) self.params['b5'] = np.zeros(output_size) # レイヤの生成 self.layers = OrderedDict() self.layers['Conv1'] = Convolution(self.params['W1'], self.params['b1'], conv_param['stride'], conv_param['pad']) # W1が畳み込みフィルターの重み, self.layers['ReLU1'] = ReLU() self.layers['Pool1'] = MaxPooling(pool_h=2, pool_w=2, stride=2) self.layers['Conv2'] = Convolution(self.params['W2'], self.params['b2'], conv_param['stride'], conv_param['pad']) # W1が畳み込みフィルターの重み, self.layers['ReLU2'] = ReLU() self.layers['Pool2'] = MaxPooling(pool_h=2, pool_w=2, stride=2) self.layers['Conv3'] = Convolution(self.params['W3'], self.params['b3'], conv_param['stride'], conv_param['pad']) # W1が畳み込みフィルターの重み, self.layers['ReLU3'] = ReLU() self.layers['Pool3'] = MaxPooling(pool_h=2, pool_w=2, stride=2) self.layers['Affine1'] = Affine(self.params['W4'], self.params['b4']) self.layers['ReLU4'] = ReLU() self.layers['Affine2'] = Affine(self.params['W5'], self.params['b5']) self.last_layer = SoftmaxWithLoss() def predict(self, x): for layer in self.layers.values(): x = layer.forward(x) return x def loss(self, x, t): """ 損失関数 x : 入力データ t : 教師データ """ y = self.predict(x) return self.last_layer.forward(y, t) def accuracy(self, x, t, batch_size=100): if t.ndim != 1 : t = np.argmax(t, axis=1) acc = 0.0 for i in range(int(x.shape[0] / batch_size)): tx = x[i*batch_size:(i+1)*batch_size] tt = t[i*batch_size:(i+1)*batch_size] y = self.predict(tx) y = np.argmax(y, axis=1) acc += np.sum(y == tt) return acc / x.shape[0] def gradient(self, x, t): """勾配を求める(誤差逆伝播法) Parameters ---------- x : 入力データ t : 教師データ Returns ------- 各層の勾配を持ったディクショナリ変数 grads['W1']、grads['W2']、...は各層の重み grads['b1']、grads['b2']、...は各層のバイアス """ # forward self.loss(x, t) # backward dout = 1 dout = self.last_layer.backward(dout) layers = list(self.layers.values()) layers.reverse() for layer in layers: dout = layer.backward(dout) # 設定 grads = {} grads['W1'], grads['b1'] = self.layers['Conv1'].dW, self.layers['Conv1'].db grads['W2'], grads['b2'] = self.layers['Conv2'].dW, self.layers['Conv3'].db grads['W3'], grads['b3'] = self.layers['Conv3'].dW, self.layers['Conv3'].db grads['W4'], grads['b4'] = self.layers['Affine1'].dW, self.layers['Affine1'].db grads['W5'], grads['b5'] = self.layers['Affine2'].dW, self.layers['Affine2'].db return grads
回答1件
あなたの回答
tips
プレビュー