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

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

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

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

Q&A

解決済

2回答

1016閲覧

ニューラルネットワークを作ろう、のプログラムを利用したい。

退会済みユーザー

退会済みユーザー

総合スコア0

Python

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

0グッド

0クリップ

投稿2021/04/24 03:28

編集2021/04/26 12:34

以前、splitの使い方が分からない、というタイトルで質問しましたが、本質的な質問でなかったため、
BAを出した後、再度内容を変えて質問し直しました。

Qiitaの自分でニューラルネットワークを作ろうの記事https://qiita.com/takahiro_itazuri/items/d2bea1c643d7cca11352#comment-a59cd26161ee56ea1220

これはニューラルネットワークの「精度測定」プログラムですが、これを用いて「画像認識」的なものの基盤を作りたいと思います。

そこでなのですが、記事のプログラムの

python

1 # 学習 2 epoch = 10 3 for e in range(epoch): 4 print('#epoch ', e) 5 data_size = len(training_data_list) 6 for i in range(data_size): 7 if i % 1000 == 0: 8 print(' train: {0:>5d} / {1:>5d}'.format(i, data_size)) 9 val = training_data_list[i].split(',') 10 idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01 11 tdata = np.zeros(onodes) + 0.01 12 tdata[int(val[0])] = 0.99 13 nn.backprop(idata, tdata) 14 pass 15 pass

ここの、
val = training_data_list[i].split(',')
の部分の、training_data_list[i]を自分の作ったデータに変えて読み込みたいのですが、
その自分のデータというのが、紛らわしいのですが同じ名前でtraining_data_listというのですが、それをprintした結果print(training_data_list)は、
[0,・・・ 10]
これになります。
また、このデータを用いるために、記事のプログラムの
inodes = 784
の部分は、
inodes = 59
に変更しています(,の数が59個だから)。

ここで、まずこの記事のプログラムは、training_data.csvという、
5,0・・・18,126・・・略
0,・・・0,48・・・略
4,0,・・・0,0,0,0,0,67・・・略
まぁ大体こんな感じのデータを読み込んでいてtraining_data_listにしているらしく、その読み込み方としては、
training_data_list[0]に1行目、training_data_list[1]に2行目、training_data_list[3]に3行目・・・みたいにしているようです。

具体的に、記事にfor文の中で以下のようにprint

python

1val = training_data_list[i].split(',') 2print(val)

すると、
['5',・・・ '0', '0\n']

['0', ・・・(略)・・・ '0', '0\n']

['4', ・・・(略)・・・ '0']

のようになります、上から、forの1周目、2周目,3周目という事かと、また、1周目は全て表示しましたが、2,3周目は省略しています。

で、自分のデータ(同名の、training_data_list)は
[0, ・・・ 10]
これであるので、単純に「1行目」しか存在しません。後に2,3,4行目も作っていきたいのですが、今は1行目だけ、つまりforで回すのは1周分という事になります。
1周だとforの必要はありませんが、今後の事も考えてforを残しておきたい、しかし、これを上手く変換する方法が分かりません。

例えば、

python

1 val = training_data_list[i].split(',')

とすると、
--> 161 val = training_data_list[i].split(',')
162 idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01
163 tdata = np.zeros(onodes) + 0.01

AttributeError: 'int' object has no attribute 'split'
となります。

かといって、一気に
val = [str(x) for x in test_data_list[e]]
とか使ってfor文外でlist化してしまえば、for文が使えなくて色々不便ですし・・・
いまいちよく分かっていません、たぶんリスト、文字、数値の区別がごちゃごちゃになっているからだと思うのですが・・・どうすればいいんでしょうか。

試した事
記事のプログラムに入る前に、

python

1training_data_list = [str(x) for x in test_data_list]

と書いて、
for文内で、

python

1 val = training_data_list[i].split(',')

と書き換えた所、

ValueError: shapes (100,59) and (0,1) not aligned: 59 (dim 1) != 0 (dim 0)
というエラーが出ました。

これって、行列の掛け算定義不能って事なんですかね??問題はそこだけ?

どうすればいいのかな。

一応この部分については解決しました、で、この後なんですが、

python

1 # テスト 2 scoreboard = [] 3 for record in test_data_list: 4 idata = (np.array(test_data_list) / 255.0 * 0.99) + 0.01 5 predict = nn.feedforward(idata) 6 plabel = np.argmax(predict) 7 print(predict) 8 print(plabel) 9 pass

このように、predict,plabelをprintしてみました、その結果が以下です。

Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
#epoch 0
train: 0 / 60
#epoch 1
train: 0 / 60
#epoch 2
train: 0 / 60
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
・・・
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
[[1.90071670e-02]
[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5
performance: nan
/usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:160: RuntimeWarning: invalid value encountered in double_scalars

これが何を意味しているのか、今後どのように変更を加えれば良いのか、模索中です、ヒントをください。

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/04/24 03:38

まあちなみに「過去の投稿と同じ質問ではない」です。 類似したものであれば、過去の質問で追記してます。
guest

回答2

0

[[1.90071670e-02]

[1.31633748e-02]
[1.80385474e-02]
[1.57785464e-02]
[2.16556495e-02]
[2.28404329e-02]
[2.20554863e-02]
[2.04877793e-02]
[1.74221735e-02]
[5.64875592e-05]]
5

これが何を意味しているのか、今後どのように変更を加えれば良いのか、模索中です、ヒントをください。

ここまで来ていてこれの意味がわからない理由がわかりませんが。

最初のリストは、ニューラルネットで与えたデータを判定した結果で、上から順に0~9である率です。 この中で最も大きな値のものをその与えたデータの判定結果としています。
この例でも、「2.28404329e-02」が最大なので、「5」になっています。

投稿2021/04/28 05:20

TakaiY

総合スコア13790

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

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

退会済みユーザー

退会済みユーザー

2021/04/29 03:35

これは分かりやすい、この数字の列の意味が分かりました。
guest

0

ベストアンサー

懲りずに回答してみましょう。

python

1 val = training_data_list[i].split(',') 2 idata = (np.asfarray(val[1:]) / 255.0 * 0.99) + 0.01

コードでは、val は文字列のリストなのに、あなたの手元にあるtest_data_listが数値のリストだってことで合わせるために文字列にしたいってことですよね?

ですが、そもそも、元のコードもこの2行めで、文字列を数値に変更してますから文字列に変更する必要などないのです。

python

1idata = (np.array(test_data_list) / 255.0 * 0.99) + 0.01

こんな感じにすればいいんじゃないでしょうかね?

ただ、

  • 元の式で、val[1:] となっているのは、MNISTのデータは先頭に正解の数値が入っているから。
  • 後ろの計算は、MNISTのデータの256階調の数値を 0-1 に変換している。

というところは考えてくださいね。

投稿2021/04/24 08:12

編集2021/04/24 08:26
TakaiY

総合スコア13790

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

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

退会済みユーザー

退会済みユーザー

2021/04/24 15:28 編集

ほう val = training_data_list[i].split(',') はいらず、 training_data_listはまだ特にいじらなくていいのかな・・・ 今度は行列の積定義関係のエラーが出ました・・・。 <ipython-input-13-52866e203f4a> in backprop(self, idata, tdata) 114 np.set_printoptions(threshold=10000) 115 print(o_i) --> 116 x_h = np.dot(self.w_ih, o_i) 117 o_h = self.af(x_h) 118 <__array_function__ internals> in dot(*args, **kwargs) ValueError: shapes (100,59) and (0,1) not aligned: 59 (dim 1) != 0 (dim 0) これがよく分からない・・・。定義できないというが、 コンマの数に合わせて、inodesを784から59に変えただけであるので、この部分はあまり関与していない気がする。 となると、for文を変えた関係かな・・・?
TakaiY

2021/04/24 14:59 編集

training_data_listが僕にはもはやどのデータを指しているのかわかなないのですが、たぶんそうでしょうね。
退会済みユーザー

退会済みユーザー

2021/04/24 17:27 編集

すいませんtrainingについては初歩的なミスをしており、 確かにtestと同様に処理できました、 後は行列計算定義の問題ですが・・・ inodes = 60(59に1を足した)にしたら、エラーが消えました! 出力結果は以下です。 Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True). #epoch 0 train: 0 / 60 #epoch 1 train: 0 / 60 #epoch 2 train: 0 / 60 #epoch 3 train: 0 / 60 #epoch 4 train: 0 / 60 #epoch 5 train: 0 / 60 #epoch 6 train: 0 / 60 #epoch 7 train: 0 / 60 #epoch 8 train: 0 / 60 #epoch 9 train: 0 / 60 performance: 1.0 あとはこれをいかにして、画像認識に持っていくか・・・全然分かりません、知恵をお貸しください。
退会済みユーザー

退会済みユーザー

2021/04/25 01:05 編集

ひとまず、 val[0]となっている2か所(学習、テスト)をidata[0]にして・・・ 次は何をするんだ。 0番目の数字を意味があるものに変えるのかな。
TakaiY

2021/04/25 05:09

書いたとおり、MNISTのデータのval[0]は正解なので、val[0]は正解データですよ。 学習用のデータをどのように準備したんでしょう。 それに合せて処理を変更すればいいだけですね。いずれにしても取りだして、 tdata[int(val[0])] = 0.99 こんな風に設定したり、 tlabel = int(val[0]) に取り出して正解の被告につかっているので、わざわざ入れなくてもいいんじゃないかな。
退会済みユーザー

退会済みユーザー

2021/04/26 01:09 編集

val[0]の必要性を考えたのは、このまま実行すると、performanceが0になったからです。 そりゃもちろん何が正解か分からないから、0になるわけですよね、 でも、そもそもこのプログラムを変えて使うわけだから、必要がないかも、と思っていたのですが、 なるほど、入れる必要はないと。 この記事のプログラムは精度測定するもので、 この、プログラム中のforwardとbackwardをどうに用いて、認識精度を上げて認識を行うプログラムを作りたいが・・・いまいちよく分からない、どのようにすべきでしょう。
TakaiY

2021/04/26 03:05

前にも説明しましたが、「この記事のプログラムは精度測定するもの」 ではありませんよ。結果として精度のみを結果として表示しているだけで、6000枚あるテストデータの判定を以下の場所ですべて行なっています。 predict = nn.feedforward(idata) plabel = np.argmax(predict) 判定結果が知りたければ、この情報を見ればいいのです。 また、idataのところにあなたの用意したデータを詳せてやれば、そのデータの判定結果を取得できます。 認識精度は層の数とか各パラメータとかをいじると変ります。 どこをどうすればどうなるかはデータにもよるのでやってみないとわからないでしょうね。 用意する教師データにも依存するので、どれだけ良い教師データを用意できるかも重要です。
退会済みユーザー

退会済みユーザー

2021/04/26 10:01

この「判定結果」というのがよく分かってないんですが、 これってtestdataがtrainingdataにいかに近いか、を示すものなんでしょうか? 判定というからには「何に近いか」が必要ですよね。
TakaiY

2021/04/26 12:19

そうですよ。 ごらんになっているサイトのプログラムが使っているMNISTのデータがどのようなものなのかご存知ですか? 0~9までの手書きの数字のデータ'のあつまりです。それが教師データ用に10000個、テスト用に6000個用意されているものです。 このプログラムで学習したニューラルネットで、テストデータが0~9のそれぞれにどのくらい近いか判定(predictに入っている)していて、 最も大きい値になったものを「判定結果」(plabel)としています。
退会済みユーザー

退会済みユーザー

2021/04/26 12:39

その場合、やはり正解かどうかのラベル、val[0]は必要になりませんかね?
TakaiY

2021/04/26 12:41

ラベルは必要ですよ。 ですが、それが、val[0] に入っている必要はありません。 そのデータを使うときにラベルがわかるようになっていればいいのです。 val[0]に入れておくのはわるくはないので、それがよければそうすれぼいいです。
退会済みユーザー

退会済みユーザー

2021/04/27 16:08

色々やって、自己解決もしてきたのですが、また壁が。 test_data_list.append([0] + diff(extract(teimg, 1)) + diff(extract(teimg, 2)) + diff(extract(teimg, 0))) # 略 と、test_dataについてもtraining同様の処理をする事にしました、ところが、 # テスト scoreboard = [] for record in test_data_list: idata = (np.array(test_data_list) / 255.0 * 0.99) + 0.01 predict = nn.feedforward(idata) plabel = np.argmax(predict) print(predict) print(plabel) pass のidataの行で、 TypeError Traceback (most recent call last) <ipython-input-79-2bed5580b45f> in <module>() 140 scoreboard = [] 141 for record in test_data_list: --> 142 idata = (np.array(test_data_list) / 255.0 * 0.99) + 0.01 143 predict = nn.feedforward(idata) 144 plabel = np.argmax(predict) TypeError: unsupported operand type(s) for /: 'list' and 'float' というエラーが出ます、これはどうすれば良いのでしょうか。
TakaiY

2021/04/28 05:24

test_data_listは、floatのリストでなければいけません。 たぶん、floatでなくリストが混っているんでしょう。
退会済みユーザー

退会済みユーザー

2021/04/29 05:29 編集

floatって浮動小数点型だから、整数も扱えるってことですよね? で、文字が入ってるってことだと思うんですが、その文字ってたぶん連番ですかね? 連番を数字に変換するのに良い方法はありますかね? tes_dataは以下のように作成しています。 def diff(x): imgrows, lenrows, imgcolumns, lencolumns = [], [], [], [] for (img, imgt) in zip(x, x.T): rows = img[(v_min<img)&(v_max>img)] columns = imgt[(v_min<imgt)&(v_max>imgt)] imgrows.append(rows) lenrows.append(len(rows)) imgcolumns.append(columns) lencolumns.append(len(columns)) return lenrows + lencolumns test_data_list.append([0] + diff(extract(teimg, 1)) + diff(extract(teimg, 2)) + diff(extract(teimg, 0))) # 略 たぶん、test_data_list.append([0] この部分が、0を文字として入力しているからエラーが出るんですかね、diff(extract(teimg, x))は全てlistなはずなので。 この連番を上手い事数字にするには・・・?forの中でしちゃだめなんですよね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問