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

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

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

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

Python

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

Q&A

解決済

1回答

449閲覧

Chainerで簡単なCNNを実装したい。

kanpan

総合スコア20

Chainer

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

Python

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

0グッド

0クリップ

投稿2018/11/28 06:52

編集2018/11/28 06:54

chainerを使って、簡単なCNNを実装したいのですが、見たことがない形式のエラーが出てうまく実行できません。どうすればよいのでしょうか?

#ソースコード
CNNSC.py

python

1#encoding: utf8 2 3from chainer import ChainList 4import chainer.functions as F 5import chainer.links as L 6 7""" 8Code for Convolutional Neural Networks for Sentence Classification 9 10author: ichiroex 11""" 12 13# リンク数を可変にしたいのでChainListを使用する 14class CNNSC(ChainList): 15 def __init__(self, 16 input_channel, 17 output_channel, 18 filter_height, 19 filter_width, 20 n_label, 21 max_sentence_len): 22 # フィルター数、使用されたフィルター高さ、最大文長は後から使う 23 self.cnv_num = len(filter_height) 24 self.filter_height = filter_height 25 self.max_sentence_len = max_sentence_len 26 27 # Convolution層用のLinkをフィルター毎に追加 28 # Convolution2D( 入力チャンネル数, 出力チャンネル数(形毎のフィルターの数), フィルターの形(タプル形式で), パディングサイズ ) 29 link_list = [L.Convolution2D(input_channel, output_channel, (i, filter_width), pad=0) for i in filter_height] 30 # Dropoff用のLinkを追加 31 link_list += [L.Linear(output_channel * self.cnv_num, output_channel * self.cnv_num)] 32 # 出力層へのLinkを追加 33 link_list += [L.Linear(output_channel * self.cnv_num, n_label)] 34 35 # ここまで定義したLinkのリストを用いてクラスを初期化する 36 super(CNNSC, self).__init__(*link_list) 37 38 # ちなみに 39 # self.add_link(link) 40 # みたいにリンクを列挙して順々に追加していってもOKです 41 42 def __call__(self, x, train=True): 43 # フィルタを通した中間層を準備 44 h_conv = [None for _ in self.filter_height] 45 h_pool = [None for _ in self.filter_height] 46 47 # フィルタ形毎にループを回す 48 for i, filter_size in enumerate(self.filter_height): 49 # Convolition層を通す 50 h_conv[i] = F.relu(self[i](x)) 51 # Pooling層を通す 52 h_pool[i] = F.max_pooling_2d(h_conv[i], (self.max_sentence_len+1-filter_size)) 53 # Convolution+Poolingを行った結果を結合する 54 concat = F.concat(h_pool, axis=2) 55 # 結合した結果に対してDropoutをかける 56 h_l1 = F.dropout(F.tanh(self[self.cnv_num+0](concat)), ratio=0.5, train=train) 57 # Dropoutの結果を出力層まで圧縮する 58 y = self[self.cnv_num+1](h_l1) 59 60 return y 61 62if __name__ == '__main__': 63 model = L.Classifier(CNNSC(input_channel=1, 64 output_channel=100, 65 filter_height=[3,4,5], 66 filter_width=20, 67 n_label=2, 68 max_sentence_len=20)) 69 print('done process') 70

実行プログラム

python

1import numpy as np 2import sys, os 3import six 4import argparse 5import chainer 6import chainer.links as L 7from chainer import optimizers, cuda, serializers 8import chainer.functions as F 9 10from CNNSC import CNNSC 11 12def get_parser(): 13 14 DEF_GPU = -1 15 DEF_DATA = "..{sep}Data{sep}input.dat".format(sep=os.sep) 16 DEF_EPOCH = 100 17 DEF_BATCHSIZE = 50 18 19 #引数の設定 20 parser = argparse.ArgumentParser() 21 parser.add_argument('data', 22 type=str, 23 default=DEF_DATA, 24 metavar='PATH', 25 help='an input data file') 26 parser.add_argument('--gpu', 27 dest='gpu', 28 type=int, 29 default=DEF_GPU, 30 metavar='CORE_NUMBER', 31 help='use CORE_NUMBER gpu (default: use cpu)') 32 parser.add_argument('--epoch', 33 dest='epoch', 34 type=int, 35 default=DEF_EPOCH, 36 help='number of epochs to learn') 37 parser.add_argument('--batchsize', 38 dest='batchsize', 39 type=int, 40 default=DEF_BATCHSIZE, 41 help='learning minibatch size') 42 parser.add_argument('--save-model', 43 dest='save_model', 44 action='store', 45 type=str, 46 default=None, 47 metavar='PATH', 48 help='save model to PATH') 49 parser.add_argument('--save-optimizer', 50 dest='save_optimizer', 51 action='store', 52 type=str, 53 default=None, 54 metavar='PATH', 55 help='save optimizer to PATH') 56 parser.add_argument('--baseline', 57 dest='baseline', 58 action='store_true', 59 help='if true, run baseline model') 60 61 return parser 62 63def save_model(model, file_path='sc_cnn.model'): 64 # modelを保存 65 print ('save the model') 66 model.to_cpu() 67 serializers.save_npz(file_path, model) 68 69def save_optimizer(optimizer, file_path='sc_cnn.state'): 70 # optimizerを保存 71 print ('save the optimizer') 72 serializers.save_npz(file_path, optimizer) 73 74def train(args): 75 76 batchsize = args.batchsize # minibatch size 77 n_epoch = args.epoch # エポック数 78 79 hight = 100 80 width = 200 81 82 #訓練データの読み込み 83 x_train = np.load('posneg_train_data.npy') 84 y_train = np.load('posneg_train_label.npy') 85 86 #テストデータの読み込み 87 x_test = np.load('posneg_test_data.npy') 88 y_test = np.load('posneg_test_label.npy') 89 90 N_test = y_test.size # test data size 91 N = len(x_train) # train data size 92 in_units = x_train.shape[1] # 入力層のユニット数 (語彙数) 93 94 # (nsample, channel, height, width) の4次元テンソルに変換 95 input_channel = 1 96 x_train = x_train.reshape(len(x_train), input_channel, height, width) 97 x_test = x_test.reshape(len(x_test), input_channel, height, width) 98 99 n_label = 2 # ラベル数 100 filter_height = [3,4,5] # フィルタの高さ 101 baseline_filter_height = [3] 102 filter_width = width # フィルタの幅 (embeddingの次元数) 103 output_channel = 100 104 decay = 0.0001 # 重み減衰 105 grad_clip = 3 # gradient norm threshold to clip 106 max_sentence_len = height # max length of sentences 107 108 # モデルの定義 109 if args.baseline == False: 110 # 提案モデル 111 model = CNNSC(input_channel, 112 output_channel, 113 filter_height, 114 filter_width, 115 n_label, 116 max_sentence_len) 117 else: 118 # ベースラインモデル (フィルタの種類が1つ) 119 model = CNNSC(input_channel, 120 output_channel, 121 baseline_filter_height, 122 filter_width, 123 n_label, 124 max_sentence_len) 125 126 # Setup optimizer 127 optimizer = optimizers.AdaDelta() 128 optimizer.setup(model) 129 optimizer.add_hook(chainer.optimizer.GradientClipping(grad_clip)) 130 optimizer.add_hook(chainer.optimizer.WeightDecay(decay)) 131 132 #GPUを使うかどうか 133 if args.gpu >= 0: 134 cuda.check_cuda_available() 135 cuda.get_device(args.gpu).use() 136 model.to_gpu() 137 xp = np if args.gpu < 0 else cuda.cupy #args.gpu <= 0: use cpu, otherwise: use gpu 138 139 # Learning loop 140 for epoch in six.moves.range(1, n_epoch + 1): 141 142 print ('epoch', epoch, '/', n_epoch) 143 144 # training 145 perm = np.random.permutation(N) #ランダムな整数列リストを取得 146 sum_train_loss = 0.0 147 sum_train_accuracy = 0.0 148 for i in six.moves.range(0, N, batchsize): 149 150 #perm を使い x_train, y_trainからデータセットを選択 (毎回対象となるデータは異なる) 151 x = chainer.Variable(xp.asarray(x_train[perm[i:i + batchsize]])) #source 152 t = chainer.Variable(xp.asarray(y_train[perm[i:i + batchsize]])) #target 153 154 model.zerograds() 155 156 y = model(x) 157 loss = F.softmax_cross_entropy(y, t) # 損失の計算 158 accuracy = F.accuracy(y, t) # 正解率の計算 159 160 sum_train_loss += loss.data * len(t) 161 sum_train_accuracy += accuracy.data * len(t) 162 163 # 最適化を実行 164 loss.backward() 165 optimizer.update() 166 167 print('train mean loss={}, accuracy={}'.format(sum_train_loss / N, sum_train_accuracy / N)) #平均誤差 168 169 # evaluation 170 sum_test_loss = 0.0 171 sum_test_accuracy = 0.0 172 for i in six.moves.range(0, N_test, batchsize): 173 174 # all test data 175 x = chainer.Variable(xp.asarray(x_test[i:i + batchsize])) 176 t = chainer.Variable(xp.asarray(y_test[i:i + batchsize])) 177 178 y = model(x, False) 179 loss = F.softmax_cross_entropy(y, t) # 損失の計算 180 accuracy = F.accuracy(y, t) # 正解率の計算 181 182 sum_test_loss += loss.data * len(t) 183 sum_test_accuracy += accuracy.data * len(t) 184 185 print(' test mean loss={}, accuracy={}'.format(sum_test_loss / N_test, sum_test_accuracy / N_test)) #平均誤差 186 187 sys.stdout.flush() 188 189 return model, optimizer 190 191def main(): 192 parser = get_parser() 193 args = parser.parse_args() 194 model, optimizer = train(args) 195 196 if args.save_model != None: 197 save_model(model) 198 if args.save_optimizer != None: 199 save_optimizer(optimizer) 200 201if __name__ == "__main__": 202 main() 203

#エラーメッセージ

(base) C:\jikken>python confirm.py usage: confirm.py [-h] [--gpu CORE_NUMBER] [--epoch EPOCH] [--batchsize BATCHSIZE] [--save-model PATH] [--save-optimizer PATH] [--baseline] PATH confirm.py: error: the following arguments are required: PATH

#備考
参考にしたページはこちらです。
https://qiita.com/ichiroex/items/7ff1cff3840520cf2410

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

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

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

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

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

tiitoi

2018/11/28 06:57 編集

confirm.py に argparse で自分で位置引数 PATH を設定したのに、実行時に渡さないで実行しているからだと思います。
kanpan

2018/11/28 07:13

ありがとうございました。
guest

回答1

0

自己解決

argparserをわたした。

投稿2018/11/28 07:14

kanpan

総合スコア20

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問