質問編集履歴

6

2021/05/08 01:54

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -506,4 +506,6 @@
506
506
 
507
507
  ちょっとミスを見つけたんですが、テストの所一部record使わないとrecord使ってる意味がないですね、
508
508
 
509
+
510
+
509
- だミスあるかも知れなで、すぐには編集ません
511
+ まあ。。元はcsv読み込んでいのだら、コードでcsv作成して読み込んだ方が良いですかね色々ややこいし

5

追記しましたー。

2021/05/08 01:54

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -14,6 +14,80 @@
14
14
 
15
15
  from google.colab import drive
16
16
 
17
+
18
+
19
+
20
+
21
+ 中略(以下に書いたコード参照)
22
+
23
+
24
+
25
+ scoreboard_array = np.asarray(scoreboard)
26
+
27
+ print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
28
+
29
+ ```
30
+
31
+
32
+
33
+ 以下画像
34
+
35
+ 0.png~9.png
36
+
37
+ ![イメージ説明](e4eba86e1c5e4829b23d390423937c52.png)
38
+
39
+ 10.png~19.png
40
+
41
+ ![イメージ説明](5555d091671f64cf9b7b57ee4e388f35.png)
42
+
43
+ 20.png~29.png
44
+
45
+ ![イメージ説明](da47018600947164c60a2c475c7bc168.png)
46
+
47
+ 以下同様。
48
+
49
+ ![イメージ説明](ea1d58a032b2a5fc3d0b4d5f5eadbfad.png)
50
+
51
+ ![イメージ説明](d61d67edbceac0a92a4cff446de213ca.png)
52
+
53
+ ![イメージ説明](6a1ae91a8a6bc83ab4aae502c25725ca.png)
54
+
55
+ ![イメージ説明](af54edf1cce86248b854ad53f81667fe.png)
56
+
57
+ ![イメージ説明](64d64e6f0bdbcf3e0329d2cdbd61a9f8.png)
58
+
59
+ ![イメージ説明](dc1026fecda6aa5457e34aff36b065f1.png)
60
+
61
+ ![イメージ説明](5c87798f3b4c32fbd871afad7dc57bea.png)
62
+
63
+
64
+
65
+ 出力結果
66
+
67
+ Mounted at /content/drive
68
+
69
+ test_data_list [[0
70
+
71
+ 中略
72
+
73
+ /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:160: RuntimeWarning: invalid value encountered in double_scalars
74
+
75
+
76
+
77
+ plabelが判定結果の画像ファイル名前です、testファイルは50.pngそのものですので、5と出力させたいのですが、9になったり7になったりしてしまいます。
78
+
79
+
80
+
81
+
82
+
83
+ というか気づいたのですが、こちらのコード
84
+
85
+
86
+
87
+ ```python
88
+
89
+ from google.colab import drive
90
+
17
91
  drive.mount('/content/drive')
18
92
 
19
93
 
@@ -40,7 +114,7 @@
40
114
 
41
115
  # そこからNumpyのデータ空間(?)に持ってくる必要がある)
42
116
 
43
- tefilename = "50.png"
117
+ tefilename = "1.png"
44
118
 
45
119
  teimg = Image.open("drive/My Drive/mnist_dataset/" + tefilename)
46
120
 
@@ -132,7 +206,203 @@
132
206
 
133
207
 
134
208
 
209
+ # 3層ニューラルネットワーク
210
+
211
+ class ThreeLayerNetwork:
212
+
213
+ # コンストラクタ
214
+
215
+ def __init__(self, inodes, hnodes, onodes, lr):
216
+
135
- 中略(以下に書いたコード参照)
217
+ # 各レイヤのノー
218
+
219
+ self.inodes = inodes
220
+
221
+ self.hnodes = hnodes
222
+
223
+ self.onodes = onodes
224
+
225
+
226
+
227
+ # 学習率
228
+
229
+ self.lr = lr
230
+
231
+
232
+
233
+ # 重みの初期化
234
+
235
+ self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes))
236
+
237
+ self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes))
238
+
239
+
240
+
241
+ # 活性化関数
242
+
243
+ self.af = AF.sigmoid
244
+
245
+ self.daf = AF.derivative_sigmoid
246
+
247
+
248
+
249
+ # 誤差逆伝搬
250
+
251
+ def backprop(self, idata, tdata):
252
+
253
+
254
+
255
+ # 縦ベクトルに変換
256
+
257
+ o_i = np.array(idata, ndmin=2).T
258
+
259
+ t = np.array(tdata, ndmin=2).T
260
+
261
+
262
+
263
+ # 隠れ層
264
+
265
+ x_h = np.dot(self.w_ih, o_i)
266
+
267
+ o_h = self.af(x_h)
268
+
269
+
270
+
271
+ # 出力層
272
+
273
+ x_o = np.dot(self.w_ho, o_h)
274
+
275
+ o_o = self.af(x_o)
276
+
277
+
278
+
279
+ # 誤差計算
280
+
281
+ e_o = (t - o_o)
282
+
283
+ e_h = np.dot(self.w_ho.T, e_o)
284
+
285
+
286
+
287
+ # 重みの更新
288
+
289
+ self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T)
290
+
291
+ self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T)
292
+
293
+
294
+
295
+ # 順伝搬
296
+
297
+ def feedforward(self, idata):
298
+
299
+ # 入力のリストを縦ベクトルに変換
300
+
301
+ o_i = np.array(idata, ndmin=2).T
302
+
303
+
304
+
305
+ # 隠れ層
306
+
307
+ x_h = np.dot(self.w_ih, o_i)
308
+
309
+ o_h = self.af(x_h)
310
+
311
+ print("o_h" ,o_h)
312
+
313
+
314
+
315
+ # 出力層
316
+
317
+ x_o = np.dot(self.w_ho, o_h)
318
+
319
+ print("x_o" ,x_o)
320
+
321
+ o_o = self.af(x_o)
322
+
323
+
324
+
325
+ return o_o
326
+
327
+
328
+
329
+ if __name__=='__main__':
330
+
331
+ # パラメータ
332
+
333
+ #inodes=784から59+1に変更
334
+
335
+ inodes = 20
336
+
337
+ hnodes = 100
338
+
339
+ onodes = 10
340
+
341
+ lr = 0.3
342
+
343
+
344
+
345
+ # ニューラルネットワークの初期化
346
+
347
+ nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr)
348
+
349
+
350
+
351
+ # 学習
352
+
353
+ epoch = 1
354
+
355
+ for e in range(epoch):
356
+
357
+ print('#epoch ', e)
358
+
359
+ data_size = len(training_data_list)
360
+
361
+ for i in range(data_size):
362
+
363
+ if i % 1000 == 0:
364
+
365
+ print(' train: {0:>5d} / {1:>5d}'.format(i, data_size))
366
+
367
+ idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01
368
+
369
+ # 変更の余地あり
370
+
371
+ tdata = np.zeros(onodes) + 0.01
372
+
373
+ tdata[training_data_list[i][0]] = 0.99
374
+
375
+ print("idata" ,idata)
376
+
377
+ print("tdata" ,tdata)
378
+
379
+ nn.backprop(idata, tdata)
380
+
381
+ pass
382
+
383
+ pass
384
+
385
+
386
+
387
+ # テスト
388
+
389
+ scoreboard = []
390
+
391
+ for record in test_data_list:
392
+
393
+ idata = (np.array(record[1:]) / 255.0 * 0.99) + 0.01
394
+
395
+ predict = nn.feedforward(idata)
396
+
397
+ plabel = np.argmax(predict)
398
+
399
+ np.set_printoptions(threshold=10000)
400
+
401
+ print("predict=o_o" ,predict)
402
+
403
+ print("plabel" ,plabel)
404
+
405
+ pass
136
406
 
137
407
 
138
408
 
@@ -142,452 +412,76 @@
142
412
 
143
413
  ```
144
414
 
145
-
146
-
147
- 以下画像
148
-
149
- 0.png~9.png
150
-
151
- ![イメージ説明](e4eba86e1c5e4829b23d390423937c52.png)
152
-
153
- 10.png19.png
154
-
155
- ![イメージ説明](5555d091671f64cf9b7b57ee4e388f35.png)
156
-
157
- 20.png~29.png
158
-
159
- ![イメージ説明](da47018600947164c60a2c475c7bc168.png)
160
-
161
- 以下同様。
162
-
163
- ![イメージ説明](ea1d58a032b2a5fc3d0b4d5f5eadbfad.png)
164
-
165
- ![イメージ説明](d61d67edbceac0a92a4cff446de213ca.png)
166
-
167
- ![イメージ説明](6a1ae91a8a6bc83ab4aae502c25725ca.png)
168
-
169
- ![イメージ説明](af54edf1cce86248b854ad53f81667fe.png)
170
-
171
- ![イメージ説明](64d64e6f0bdbcf3e0329d2cdbd61a9f8.png)
172
-
173
- ![イメージ説明](dc1026fecda6aa5457e34aff36b065f1.png)
174
-
175
- ![イメージ説明](5c87798f3b4c32fbd871afad7dc57bea.png)
176
-
177
-
178
-
179
- 出力結果
180
-
181
- Mounted at /content/drive
182
-
183
- test_data_list [[0
415
+ の出力結果が以下のようになるわけですが、
416
+
417
+
418
+
419
+ Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
420
+
421
+ test_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
422
+
423
+ training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10], [1, 10, 8, 5, 5, 7, 7, 8, 7, 3, 4, 10, 10, 6, 6, 1, 1, 3, 8, 9, 10], [2, 10, 4, 3, 8, 7, 6, 6, 7, 2, 2, 10, 6, 5, 4, 3, 3, 2, 4, 8, 10], [3, 10, 4, 2, 7, 6, 5, 7, 5, 3, 5, 10, 7, 5, 6, 4, 4, 1, 2, 5, 10], [4, 10, 7, 6, 5, 5, 5, 2, 2, 7, 8, 10, 7, 6, 6, 6, 2, 1, 1, 8, 10], [5, 10, 3, 8, 7, 3, 5, 7, 4, 3, 9, 10, 7, 3, 5, 5, 5, 4, 4, 6, 10], [6, 10, 5, 5, 7, 3, 3, 5, 4, 4, 8, 10, 5, 3, 3, 5, 4, 4, 3, 7, 10], [7, 10, 2, 4, 7, 7, 7, 7, 7, 7, 10, 10, 9, 7, 5, 4, 4, 5, 6, 8, 10], [8, 8, 4, 4, 4, 4, 2, 5, 4, 4, 8, 10, 5, 2, 3, 4, 4, 2, 2, 5, 10], [9, 10, 4, 2, 5, 5, 3, 4, 6, 4, 7, 10, 7, 3, 2, 4, 4, 4, 2, 4, 10]]
424
+
425
+ #epoch 0
426
+
427
+ train: 0 / 10
428
+
429
+ idata [0.04882353 0.02552941 0.01776471 0.02552941 0.02552941 0.02552941
430
+
431
+ 0.02552941 0.02552941 0.02552941 0.04105882 0.04882353 0.02552941
432
+
433
+ 0.01776471 0.01776471 0.03329412 0.03329412 0.01776471 0.01776471
434
+
435
+ 0.02552941 0.04882353]
436
+
437
+ tdata [0.99 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]
184
438
 
185
439
  中略
186
440
 
441
+ tdata [0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.99]
442
+
443
+ o_h [[0.44149295]
444
+
445
+ [0.47443682]
446
+
447
+ 中略
448
+
449
+ [0.5014706 ]]
450
+
451
+ x_o [[ -2.09106513]
452
+
453
+ 中略
454
+
455
+ [ -2.25102428]]
456
+
457
+ predict=o_o [[1.09968282e-01]
458
+
459
+ 中略
460
+
461
+ [9.52611495e-02]]
462
+
463
+ plabel 6
464
+
465
+ performance: nan
466
+
187
- /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:160: RuntimeWarning: invalid value encountered in double_scalars
467
+ /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:162: RuntimeWarning: invalid value encountered in double_scalars
188
-
189
-
190
-
468
+
469
+
470
+
191
- plabelが判定結果の画像ファイル名前です、testファイルは50.pngそのものですので5と出させたいのですが9になっ7になたりししまます。
471
+ まあつまり、training画像番号0しか入してない画像番号は存在しない3になってお、これは毎度引かかっているlist in list構造問題であり、
192
-
193
-
194
-
195
-
196
-
197
- というか気づいたのですが、こちらのコード
198
-
199
-
200
472
 
201
473
  ```python
202
474
 
203
- from google.colab import drive
204
-
205
- drive.mount('/content/drive')
206
-
207
-
208
-
209
- import sys
210
-
211
- import numpy as np
212
-
213
-
214
-
215
- sys.path.append('/content/drive/My Drive')
216
-
217
-
218
-
219
- import ActivationFunction as AF
220
-
221
- from PIL import Image
222
-
223
-
224
-
225
- # PILで開いたうえでデータをNumpy形式にする
226
-
227
- # (例えばJPEGは圧縮されていてNumpyな配列になっていないので、
228
-
229
- # そこからNumpyのデータ空間(?)に持ってくる必要がある)
230
-
231
- tefilename = "1.png"
232
-
233
- teimg = Image.open("drive/My Drive/mnist_dataset/" + tefilename)
234
-
235
- teimg = teimg.resize((10, 10))
236
-
237
- teimg = np.asarray(teimg)
238
-
239
-
240
-
241
- def extract(x, y):
242
-
243
- # カラー画像の時Gだけ抜き取りたい
244
-
245
- if len(x.shape) == 3:
246
-
247
- h, w, ch = x.shape
248
-
249
-
250
-
251
- # RGBのGだけ抜き取りたい
252
-
253
- return x[:,:,y]
254
-
255
-
256
-
257
- v_max, v_min = 300, 200
258
-
259
-
260
-
261
- def diff(x):
262
-
263
- imgrows, lenrows, imgcolumns, lencolumns = [], [], [], []
264
-
265
- for (img, imgt) in zip(x, x.T):
266
-
267
- rows = img[(v_min<img)&(v_max>img)]
268
-
269
- columns = imgt[(v_min<imgt)&(v_max>imgt)]
270
-
271
- imgrows.append(rows)
272
-
273
- lenrows.append(len(rows))
274
-
275
- imgcolumns.append(columns)
276
-
277
- lencolumns.append(len(columns))
278
-
279
- return lenrows + lencolumns
280
-
281
-
282
-
283
- test_data_list = []
284
-
285
-
286
-
287
- test_data_list.append([0] + diff(extract(teimg, 1))) # 略
288
-
289
-
290
-
291
- print("test_data_list" ,test_data_list)
292
-
293
-
294
-
295
- # 見本データに対しても同様に
296
-
297
- # exについて同様に
298
-
299
- training_data_list = []
300
-
301
-
302
-
303
- for i in range(1):
304
-
305
- for e in range(1):
306
-
307
- trad = Image.open("drive/My Drive/mnist_dataset/" + str(10*i+e) + ".png")
308
-
309
- trad = trad.resize((10, 10))
310
-
311
- trad = np.asarray(trad)
312
-
313
- #g #b #r 抽出後diffしてappend
314
-
315
- training_data_list.append([i] + diff(extract(trad, 1))) # 略
316
-
317
-
318
-
319
- print("training_data_list" ,training_data_list)
320
-
321
-
322
-
323
- # 3層ニューラルネットワーク
324
-
325
- class ThreeLayerNetwork:
326
-
327
- # コンストラクタ
328
-
329
- def __init__(self, inodes, hnodes, onodes, lr):
330
-
331
- # 各レイヤーのノード数
332
-
333
- self.inodes = inodes
334
-
335
- self.hnodes = hnodes
336
-
337
- self.onodes = onodes
338
-
339
-
340
-
341
- # 学習率
342
-
343
- self.lr = lr
344
-
345
-
346
-
347
- # 重みの初期化
348
-
349
- self.w_ih = np.random.normal(0.0, 1.0, (self.hnodes, self.inodes))
350
-
351
- self.w_ho = np.random.normal(0.0, 1.0, (self.onodes, self.hnodes))
352
-
353
-
354
-
355
- # 活性化関数
356
-
357
- self.af = AF.sigmoid
358
-
359
- self.daf = AF.derivative_sigmoid
360
-
361
-
362
-
363
- # 誤差逆伝搬
364
-
365
- def backprop(self, idata, tdata):
366
-
367
-
368
-
369
- # 縦ベクトルに変換
370
-
371
- o_i = np.array(idata, ndmin=2).T
372
-
373
- t = np.array(tdata, ndmin=2).T
374
-
375
-
376
-
377
- # 隠れ層
378
-
379
- x_h = np.dot(self.w_ih, o_i)
380
-
381
- o_h = self.af(x_h)
382
-
383
-
384
-
385
- # 出力層
386
-
387
- x_o = np.dot(self.w_ho, o_h)
388
-
389
- o_o = self.af(x_o)
390
-
391
-
392
-
393
- # 誤差計算
394
-
395
- e_o = (t - o_o)
396
-
397
- e_h = np.dot(self.w_ho.T, e_o)
398
-
399
-
400
-
401
- # 重みの更新
402
-
403
- self.w_ho += self.lr * np.dot((e_o * self.daf(o_o)), o_h.T)
404
-
405
- self.w_ih += self.lr * np.dot((e_h * self.daf(o_h)), o_i.T)
406
-
407
-
408
-
409
- # 順伝搬
410
-
411
- def feedforward(self, idata):
412
-
413
- # 入力のリストを縦ベクトルに変換
414
-
415
- o_i = np.array(idata, ndmin=2).T
416
-
417
-
418
-
419
- # 隠れ層
420
-
421
- x_h = np.dot(self.w_ih, o_i)
422
-
423
- o_h = self.af(x_h)
424
-
425
-
426
-
427
- # 出力層
428
-
429
- x_o = np.dot(self.w_ho, o_h)
430
-
431
- o_o = self.af(x_o)
432
-
433
-
434
-
435
- return o_o
436
-
437
-
438
-
439
- if __name__=='__main__':
440
-
441
- # パラメータ
442
-
443
- #inodes=784から59+1に変更
444
-
445
- inodes = 20
446
-
447
- hnodes = 100
448
-
449
- onodes = 10
450
-
451
- lr = 0.3
452
-
453
-
454
-
455
- # ニューラルネットワークの初期化
456
-
457
- nn = ThreeLayerNetwork(inodes, hnodes, onodes, lr)
458
-
459
-
460
-
461
- # 学習
462
-
463
- epoch = 1
464
-
465
- for e in range(epoch):
466
-
467
- print('#epoch ', e)
468
-
469
- data_size = len(training_data_list)
470
-
471
- for i in range(data_size):
472
-
473
- if i % 1000 == 0:
474
-
475
- print(' train: {0:>5d} / {1:>5d}'.format(i, data_size))
476
-
477
- idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01
478
-
479
- # 変更の余地あり
480
-
481
- tdata = np.zeros(onodes) + 0.01
482
-
483
- tdata[training_data_list[i][0]] = 0.99
484
-
485
- print("idata" ,idata)
486
-
487
- print("tdata" ,tdata)
488
-
489
- nn.backprop(idata, tdata)
490
-
491
- pass
492
-
493
- pass
494
-
495
-
496
-
497
- # テスト
498
-
499
- scoreboard = []
500
-
501
- for record in test_data_list:
502
-
503
- idata = (np.array(test_data_list[0][1:]) / 255.0 * 0.99) + 0.01
504
-
505
475
  predict = nn.feedforward(idata)
506
476
 
507
- plabel = np.argmax(predict)
508
-
509
- np.set_printoptions(threshold=10000)
510
-
511
- print("predict" ,predict)
512
-
513
- print("plabel" ,plabel)
514
-
515
- pass
516
-
517
-
518
-
519
- scoreboard_array = np.asarray(scoreboard)
520
-
521
- print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
522
-
523
477
  ```
524
478
 
525
- の出力結果が以下のようになるわけですが、
526
-
527
-
528
-
529
- Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
530
-
531
- test_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
479
+ ここでfeedforwardしたidataが、idataつまりtarining_dataの1番目のlist(呼び方が分からない)のn番目(呼び方が分からない)を画像番号nに該当するとして計算しており、
480
+
481
+
532
482
 
533
483
  training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
534
484
 
535
- #epoch 0
536
-
537
- train: 0 / 1
538
-
539
- idata [0.04882353 0.02552941 0.01776471 0.02552941 0.02552941 0.02552941
540
-
541
- 0.02552941 0.02552941 0.02552941 0.04105882 0.04882353 0.02552941
542
-
543
- 0.01776471 0.01776471 0.03329412 0.03329412 0.01776471 0.01776471
544
-
545
- 0.02552941 0.04882353]
546
-
547
- tdata [0.99 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]
548
-
549
- predict [[9.64636153e-01]
550
-
551
- [2.99907387e-01]
552
-
553
- [1.16165869e-06]
554
-
555
- [9.99965583e-01]
556
-
557
- [1.79569353e-01]
558
-
559
- [1.86221042e-01]
560
-
561
- [1.19130905e-02]
562
-
563
- [1.09462110e-02]
564
-
565
- [1.15735189e-05]
566
-
567
- [3.39788516e-04]]
568
-
569
- plabel 3
570
-
571
- performance: nan
572
-
573
- /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:160: RuntimeWarning: invalid value encountered in double_scalars
574
-
575
-
576
-
577
- まあつまり、trainingは、画像番号0しか入力していないのに、画像番号は存在しない3になっており、これは毎度引っかかっているlist in list構造問題であり、
578
-
579
- ```python
580
-
581
- predict = nn.feedforward(idata)
582
-
583
- ```
584
-
585
- ここでfeedforwardしたidataが、idataつまりtarining_dataの1番目のlist(呼び方が分からない)のn番目(呼び方が分からない)を画像番号nに該当するとして計算しており、
586
-
587
-
588
-
589
- training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
590
-
591
485
 
592
486
 
593
487
  この10が画像番号0,4が画像番号1,2が画像番号2・・・となっているのですが、実際は、(最初のコードに書いたように)

4

ミス発見しました。

2021/05/08 01:03

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -607,3 +607,9 @@
607
607
 
608
608
 
609
609
  ・・・というかこれもう、元のプログラムに即して、画像からテキストファイルを作成し、そのテキストファイルを読み込む、みたいにした方がいいんでしょうか・・・?
610
+
611
+
612
+
613
+ ちょっとミスを見つけたんですが、テストの所一部record使わないとrecord使ってる意味がないですね、
614
+
615
+ まだミスあるかも知れないので、すぐには編集しません。

3

補足致しました。

2021/05/08 00:43

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -602,4 +602,8 @@
602
602
 
603
603
  これを画像番号2のデータ・・・
604
604
 
605
- として処理したいのですが、どうすればいいんでしょうか。
605
+ として処理したいのですが、どうすればいいんでしょうか。]
606
+
607
+
608
+
609
+ ・・・というかこれもう、元のプログラムに即して、画像からテキストファイルを作成し、そのテキストファイルを読み込む、みたいにした方がいいんでしょうか・・・?

2

追記致しました。

2021/05/07 13:20

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -1,3 +1,11 @@
1
+ 自分でニューラルネットワークを作ろう
2
+
3
+ https://qiita.com/takahiro_itazuri/items/d2bea1c643d7cca11352#comment-a59cd26161ee56ea1220
4
+
5
+ を元に作ったコードなんですが・・・。
6
+
7
+
8
+
1
9
  コードと出力結果はBA決定後、中略します。
2
10
 
3
11
 
@@ -124,6 +132,194 @@
124
132
 
125
133
 
126
134
 
135
+ 中略(以下に書いたコード参照)
136
+
137
+
138
+
139
+ scoreboard_array = np.asarray(scoreboard)
140
+
141
+ print('performance: ', scoreboard_array.sum() / scoreboard_array.size)
142
+
143
+ ```
144
+
145
+
146
+
147
+ 以下画像
148
+
149
+ 0.png~9.png
150
+
151
+ ![イメージ説明](e4eba86e1c5e4829b23d390423937c52.png)
152
+
153
+ 10.png~19.png
154
+
155
+ ![イメージ説明](5555d091671f64cf9b7b57ee4e388f35.png)
156
+
157
+ 20.png~29.png
158
+
159
+ ![イメージ説明](da47018600947164c60a2c475c7bc168.png)
160
+
161
+ 以下同様。
162
+
163
+ ![イメージ説明](ea1d58a032b2a5fc3d0b4d5f5eadbfad.png)
164
+
165
+ ![イメージ説明](d61d67edbceac0a92a4cff446de213ca.png)
166
+
167
+ ![イメージ説明](6a1ae91a8a6bc83ab4aae502c25725ca.png)
168
+
169
+ ![イメージ説明](af54edf1cce86248b854ad53f81667fe.png)
170
+
171
+ ![イメージ説明](64d64e6f0bdbcf3e0329d2cdbd61a9f8.png)
172
+
173
+ ![イメージ説明](dc1026fecda6aa5457e34aff36b065f1.png)
174
+
175
+ ![イメージ説明](5c87798f3b4c32fbd871afad7dc57bea.png)
176
+
177
+
178
+
179
+ 出力結果
180
+
181
+ Mounted at /content/drive
182
+
183
+ test_data_list [[0
184
+
185
+ 中略
186
+
187
+ /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:160: RuntimeWarning: invalid value encountered in double_scalars
188
+
189
+
190
+
191
+ plabelが判定結果の画像ファイル名前です、testファイルは50.pngそのものですので、5と出力させたいのですが、9になったり7になったりしてしまいます。
192
+
193
+
194
+
195
+
196
+
197
+ というか気づいたのですが、こちらのコード
198
+
199
+
200
+
201
+ ```python
202
+
203
+ from google.colab import drive
204
+
205
+ drive.mount('/content/drive')
206
+
207
+
208
+
209
+ import sys
210
+
211
+ import numpy as np
212
+
213
+
214
+
215
+ sys.path.append('/content/drive/My Drive')
216
+
217
+
218
+
219
+ import ActivationFunction as AF
220
+
221
+ from PIL import Image
222
+
223
+
224
+
225
+ # PILで開いたうえでデータをNumpy形式にする
226
+
227
+ # (例えばJPEGは圧縮されていてNumpyな配列になっていないので、
228
+
229
+ # そこからNumpyのデータ空間(?)に持ってくる必要がある)
230
+
231
+ tefilename = "1.png"
232
+
233
+ teimg = Image.open("drive/My Drive/mnist_dataset/" + tefilename)
234
+
235
+ teimg = teimg.resize((10, 10))
236
+
237
+ teimg = np.asarray(teimg)
238
+
239
+
240
+
241
+ def extract(x, y):
242
+
243
+ # カラー画像の時Gだけ抜き取りたい
244
+
245
+ if len(x.shape) == 3:
246
+
247
+ h, w, ch = x.shape
248
+
249
+
250
+
251
+ # RGBのGだけ抜き取りたい
252
+
253
+ return x[:,:,y]
254
+
255
+
256
+
257
+ v_max, v_min = 300, 200
258
+
259
+
260
+
261
+ def diff(x):
262
+
263
+ imgrows, lenrows, imgcolumns, lencolumns = [], [], [], []
264
+
265
+ for (img, imgt) in zip(x, x.T):
266
+
267
+ rows = img[(v_min<img)&(v_max>img)]
268
+
269
+ columns = imgt[(v_min<imgt)&(v_max>imgt)]
270
+
271
+ imgrows.append(rows)
272
+
273
+ lenrows.append(len(rows))
274
+
275
+ imgcolumns.append(columns)
276
+
277
+ lencolumns.append(len(columns))
278
+
279
+ return lenrows + lencolumns
280
+
281
+
282
+
283
+ test_data_list = []
284
+
285
+
286
+
287
+ test_data_list.append([0] + diff(extract(teimg, 1))) # 略
288
+
289
+
290
+
291
+ print("test_data_list" ,test_data_list)
292
+
293
+
294
+
295
+ # 見本データに対しても同様に
296
+
297
+ # exについて同様に
298
+
299
+ training_data_list = []
300
+
301
+
302
+
303
+ for i in range(1):
304
+
305
+ for e in range(1):
306
+
307
+ trad = Image.open("drive/My Drive/mnist_dataset/" + str(10*i+e) + ".png")
308
+
309
+ trad = trad.resize((10, 10))
310
+
311
+ trad = np.asarray(trad)
312
+
313
+ #g #b #r 抽出後diffしてappend
314
+
315
+ training_data_list.append([i] + diff(extract(trad, 1))) # 略
316
+
317
+
318
+
319
+ print("training_data_list" ,training_data_list)
320
+
321
+
322
+
127
323
  # 3層ニューラルネットワーク
128
324
 
129
325
  class ThreeLayerNetwork:
@@ -280,6 +476,8 @@
280
476
 
281
477
  idata = (np.array(training_data_list[i][1:]) / 255.0 * 0.99) + 0.01
282
478
 
479
+ # 変更の余地あり
480
+
283
481
  tdata = np.zeros(onodes) + 0.01
284
482
 
285
483
  tdata[training_data_list[i][0]] = 0.99
@@ -324,51 +522,19 @@
324
522
 
325
523
  ```
326
524
 
327
-
328
-
329
- 以下画像
330
-
331
- 0.png~9.png
332
-
333
- ![イメージ説明](e4eba86e1c5e4829b23d390423937c52.png)
334
-
335
- 10.png19.png
336
-
337
- ![イメージ説明](5555d091671f64cf9b7b57ee4e388f35.png)
338
-
339
- 20.png~29.png
340
-
341
- ![イメージ説明](da47018600947164c60a2c475c7bc168.png)
342
-
343
- 以下同様。
344
-
345
- ![イメージ説明](ea1d58a032b2a5fc3d0b4d5f5eadbfad.png)
346
-
347
- ![イメージ説明](d61d67edbceac0a92a4cff446de213ca.png)
348
-
349
- ![イメージ説明](6a1ae91a8a6bc83ab4aae502c25725ca.png)
350
-
351
- ![イメージ説明](af54edf1cce86248b854ad53f81667fe.png)
352
-
353
- ![イメージ説明](64d64e6f0bdbcf3e0329d2cdbd61a9f8.png)
354
-
355
- ![イメージ説明](dc1026fecda6aa5457e34aff36b065f1.png)
356
-
357
- ![イメージ説明](5c87798f3b4c32fbd871afad7dc57bea.png)
358
-
359
-
360
-
361
- 出力結果
362
-
363
- Mounted at /content/drive
364
-
365
- test_data_list [[0, 10, 3, 8, 7, 3, 5, 7, 4, 3, 9, 10, 7, 3, 5, 5, 5, 4, 4, 6, 10]]
366
-
367
- training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10], [1, 10, 8, 5, 5, 7, 7, 8, 7, 3, 4, 10, 10, 6, 6, 1, 1, 3, 8, 9, 10], [2, 10, 4, 3, 8, 7, 6, 6, 7, 2, 2, 10, 6, 5, 4, 3, 3, 2, 4, 8, 10], [3, 10, 4, 2, 7, 6, 5, 7, 5, 3, 5, 10, 7, 5, 6, 4, 4, 1, 2, 5, 10], [4, 10, 7, 6, 5, 5, 5, 2, 2, 7, 8, 10, 7, 6, 6, 6, 2, 1, 1, 8, 10], [5, 10, 3, 8, 7, 3, 5, 7, 4, 3, 9, 10, 7, 3, 5, 5, 5, 4, 4, 6, 10], [6, 10, 5, 5, 7, 3, 3, 5, 4, 4, 8, 10, 5, 3, 3, 5, 4, 4, 3, 7, 10], [7, 10, 2, 4, 7, 7, 7, 7, 7, 7, 10, 10, 9, 7, 5, 4, 4, 5, 6, 8, 10], [8, 8, 4, 4, 4, 4, 2, 5, 4, 4, 8, 10, 5, 2, 3, 4, 4, 2, 2, 5, 10], [9, 10, 4, 2, 5, 5, 3, 4, 6, 4, 7, 10, 7, 3, 2, 4, 4, 4, 2, 4, 10]]
525
+ の出力結果が以下のようになるわけですが、
526
+
527
+
528
+
529
+ Drive already mounted at /content/drive; to attempt to forcibly remount, call drive.mount("/content/drive", force_remount=True).
530
+
531
+ test_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
532
+
533
+ training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
368
534
 
369
535
  #epoch 0
370
536
 
371
- train: 0 / 10
537
+ train: 0 / 1
372
538
 
373
539
  idata [0.04882353 0.02552941 0.01776471 0.02552941 0.02552941 0.02552941
374
540
 
@@ -380,115 +546,25 @@
380
546
 
381
547
  tdata [0.99 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]
382
548
 
383
- idata [0.04882353 0.04105882 0.02941176 0.02941176 0.03717647 0.03717647
384
-
385
- 0.04105882 0.03717647 0.02164706 0.02552941 0.04882353 0.04882353
386
-
387
- 0.03329412 0.03329412 0.01388235 0.01388235 0.02164706 0.04105882
388
-
389
- 0.04494118 0.04882353]
390
-
391
- tdata [0.01 0.99 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]
392
-
393
- idata [0.04882353 0.02552941 0.02164706 0.04105882 0.03717647 0.03329412
394
-
395
- 0.03329412 0.03717647 0.01776471 0.01776471 0.04882353 0.03329412
396
-
397
- 0.02941176 0.02552941 0.02164706 0.02164706 0.01776471 0.02552941
398
-
399
- 0.04105882 0.04882353]
400
-
401
- tdata [0.01 0.01 0.99 0.01 0.01 0.01 0.01 0.01 0.01 0.01]
402
-
403
- idata [0.04882353 0.02552941 0.01776471 0.03717647 0.03329412 0.02941176
404
-
405
- 0.03717647 0.02941176 0.02164706 0.02941176 0.04882353 0.03717647
406
-
407
- 0.02941176 0.03329412 0.02552941 0.02552941 0.01388235 0.01776471
408
-
409
- 0.02941176 0.04882353]
410
-
411
- tdata [0.01 0.01 0.01 0.99 0.01 0.01 0.01 0.01 0.01 0.01]
412
-
413
- idata [0.04882353 0.03717647 0.03329412 0.02941176 0.02941176 0.02941176
414
-
415
- 0.01776471 0.01776471 0.03717647 0.04105882 0.04882353 0.03717647
416
-
417
- 0.03329412 0.03329412 0.03329412 0.01776471 0.01388235 0.01388235
418
-
419
- 0.04105882 0.04882353]
420
-
421
- tdata [0.01 0.01 0.01 0.01 0.99 0.01 0.01 0.01 0.01 0.01]
422
-
423
- idata [0.04882353 0.02164706 0.04105882 0.03717647 0.02164706 0.02941176
424
-
425
- 0.03717647 0.02552941 0.02164706 0.04494118 0.04882353 0.03717647
426
-
427
- 0.02164706 0.02941176 0.02941176 0.02941176 0.02552941 0.02552941
428
-
429
- 0.03329412 0.04882353]
430
-
431
- tdata [0.01 0.01 0.01 0.01 0.01 0.99 0.01 0.01 0.01 0.01]
432
-
433
- idata [0.04882353 0.02941176 0.02941176 0.03717647 0.02164706 0.02164706
434
-
435
- 0.02941176 0.02552941 0.02552941 0.04105882 0.04882353 0.02941176
436
-
437
- 0.02164706 0.02164706 0.02941176 0.02552941 0.02552941 0.02164706
438
-
439
- 0.03717647 0.04882353]
440
-
441
- tdata [0.01 0.01 0.01 0.01 0.01 0.01 0.99 0.01 0.01 0.01]
442
-
443
- idata [0.04882353 0.01776471 0.02552941 0.03717647 0.03717647 0.03717647
444
-
445
- 0.03717647 0.03717647 0.03717647 0.04882353 0.04882353 0.04494118
446
-
447
- 0.03717647 0.02941176 0.02552941 0.02552941 0.02941176 0.03329412
448
-
449
- 0.04105882 0.04882353]
450
-
451
- tdata [0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.99 0.01 0.01]
452
-
453
- idata [0.04105882 0.02552941 0.02552941 0.02552941 0.02552941 0.01776471
454
-
455
- 0.02941176 0.02552941 0.02552941 0.04105882 0.04882353 0.02941176
456
-
457
- 0.01776471 0.02164706 0.02552941 0.02552941 0.01776471 0.01776471
458
-
459
- 0.02941176 0.04882353]
460
-
461
- tdata [0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.99 0.01]
462
-
463
- idata [0.04882353 0.02552941 0.01776471 0.02941176 0.02941176 0.02164706
464
-
465
- 0.02552941 0.03329412 0.02552941 0.03717647 0.04882353 0.03717647
466
-
467
- 0.02164706 0.01776471 0.02552941 0.02552941 0.02552941 0.01776471
468
-
469
- 0.02552941 0.04882353]
470
-
471
- tdata [0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.99]
472
-
473
- predict [[0.09394095]
549
+ predict [[9.64636153e-01]
474
-
550
+
475
- [0.00319134]
551
+ [2.99907387e-01]
476
-
552
+
477
- [0.66808832]
553
+ [1.16165869e-06]
554
+
478
-
555
+ [9.99965583e-01]
556
+
557
+ [1.79569353e-01]
558
+
559
+ [1.86221042e-01]
560
+
561
+ [1.19130905e-02]
562
+
479
- [0.99999112]
563
+ [1.09462110e-02]
480
-
481
- [0.99994398]
564
+
482
-
483
- [0.12350166]
565
+ [1.15735189e-05]
484
-
566
+
485
- [0.99984316]
567
+ [3.39788516e-04]]
486
-
487
- [0.0187543 ]
488
-
489
- [0.15001126]
490
-
491
- [0.19432732]]
492
568
 
493
569
  plabel 3
494
570
 
@@ -498,18 +574,32 @@
498
574
 
499
575
 
500
576
 
577
+ まあつまり、trainingは、画像番号0しか入力していないのに、画像番号は存在しない3になっており、これは毎度引っかかっているlist in list構造問題であり、
578
+
579
+ ```python
580
+
581
+ predict = nn.feedforward(idata)
582
+
583
+ ```
584
+
501
- plabel判定結果の画像ファイル名前です、testファイルは50.pngですので、5と出力させたいのです、9にったり7なったりしてしまいます。
585
+ ここでfeedforwardしたidataが、idataつまりtarining_data1番目list(呼び方が分からなn番目(呼び方分からい)を画像番号n該当するとして計算ており、
586
+
587
+
588
+
502
-
589
+ training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]]
590
+
591
+
592
+
503
- ころどころprintしているのは、コードの仕組みを知るめで深い意味はありません。
593
+ この10が画像番号0,4が画像番号1,2が画像番号2・・・なっているのですが、実際は、(最初のコードに書いように)
594
+
595
+
596
+
504
-
597
+ training_data_list [[0, 10, 4, 2, 4, 4, 4, 4, 4, 4, 8, 10, 4, 2, 2, 6, 6, 2, 2, 4, 10]
598
+
599
+ これを画像番号1のデータ
600
+
505
- 1つの画像から取り込む情報ですが、R,G,Bの三種類を取り込んだり、列、行を両方取り込んだりしましたが、結果はあまり変わりません。
601
+ [1, 10, 8, 5, 5, 7, 7, 8, 7, 3, 4, 10, 10, 6, 6, 1, 1, 3, 8, 9, 10]
506
-
602
+
507
- ところコドに致命的なエラーはないように思えます。
603
+ これを画像番号2タ・・・
508
-
509
- もっと、「似た数列を持つ画像は判定できるようにする」にはどのような改良を加えれば良いでしょうか。
604
+
510
-
511
- 活性化関数かを変えら変わるんでしょうか
605
+ して処理しいのですが、どうすればいいんでしょうか
512
-
513
-
514
-
515
- 何となく、まず考え付いたのが、乱数の影響が強いので、これを適切な乱数に変える、という点ですかね?

1

追記しました。

2021/05/07 13:11

投稿

退会済みユーザー
test CHANGED
File without changes
test CHANGED
@@ -509,3 +509,7 @@
509
509
  もっと、「似た数列を持つ画像は判定できるようにする」にはどのような改良を加えれば良いでしょうか。
510
510
 
511
511
  活性化関数とかを変えたら変わるんでしょうか?
512
+
513
+
514
+
515
+ 何となく、まず考え付いたのが、乱数の影響が強いので、これを適切な乱数に変える、という点ですかね?