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

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

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

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

Q&A

解決済

1回答

1910閲覧

CNN 層を増やしたい

yusuke_yamamoto

総合スコア16

Keras

Kerasは、TheanoやTensorFlow/CNTK対応のラッパーライブラリです。DeepLearningの数学的部分を短いコードでネットワークとして表現することが可能。DeepLearningの最新手法を迅速に試すことができます。

Python

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

0グッド

0クリップ

投稿2020/01/07 08:10

下記のエラーが発生しました。
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

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

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

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

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

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

Q71

2020/01/07 12:20

Pythonのコードが読めません。正しくマークアップして下さい。 「kerasなどを使用せずに」とは、どういう意味でしょうか。kerasは、機械学習のフレームワークです。「など」ということから、TensorFlowやPyTorchも使用しないということでしょうか。つまり、自分でフレームワークを作るおつもりでしょうか。では、Convolutionという関数は、どのように定義されているのでしょうか。
yusuke_yamamoto

2020/01/08 06:46

Convolutionは別ファイルからimportしていました。 初心者なもので使い方がまだわかっていない状態です。 今後正しく利用できるよう精進していきます。
guest

回答1

0

ベストアンサー

shapes (6400,750) and (700,30) not aligned: 750 (dim 1) != 700 (dim 0)

6400入力・750出力の網と、700入力・30出力の網を接続しようとしたら、750出力を700入力につなぐことになるので50本の信号が余ってしまいますよね?
だから、揃っていません(not aligned)という警告が出たのです。

層と層の接続が正しく行えるように、信号数が一致するように心がけてネットの設計をすれば良いです。

投稿2020/01/07 09:20

coco_bauer

総合スコア6915

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

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

yusuke_yamamoto

2020/01/07 09:58

返信ありがとうございます。 少しつかめてきたような気がします。 度々申し訳ないのですが、 出力と入力はどのように変更すればいいでしょうか?
coco_bauer

2020/01/07 11:40

例えば、shapes (6400,750) をshapes (6400,700) にすれば、700 (dim 1) = 700 (dim 0)で揃います。
yusuke_yamamoto

2020/01/08 06:44

ありがとうございます。 修正してみます。 わかりやすい回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問