https://teratail.com/questions/315284#reply-439497
URLを参考にして、プログラムを実行すると、以下のエラー文がでて推論できません。考えられる原因はなんでしょうか。
エラー文
File "C:\Users\username\Desktop\output\capture.py", line 106, in <module>
y = network(x, t)
File "C:\Users\username\Desktop\output\capture.py", line 16, in network
h = PF.binary_connect_affine(x, name='BinaryConnectAffine')
TypeError: binary_connect_affine() missing 1 required positional argument: 'n_outmaps'
プログラム
import nnabla as nn
import nnabla.functions as F
import nnabla.parametric_functions as PF
from nnabla.utils.data_iterator import data_iterator_csv_dataset
import os
import cv2
from datetime import datetime
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
def network(x, y, test=False):
# Input:x -> 3,250,250
# BinaryConnectAffine -> 100
h = PF.binary_connect_affine(x,(100), name='BinaryConnectAffine')
# BatchNormalization
h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization')
# ReLU
h = F.relu(h, True)
# BinaryConnectAffine_2
h = PF.binary_connect_affine(h,(100), name='BinaryConnectAffine_2')
# BatchNormalization_2
h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization_2')
# ReLU_2
h = F.relu(h, True)
# BinaryConnectAffine_3
h = PF.binary_connect_affine(h,(100), name='BinaryConnectAffine_3')
# BatchNormalization_3
h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization_3')
# ReLU_3
h = F.relu(h, True)
# BinaryConnectAffine_4 -> 26
h = PF.binary_connect_affine(h, (26), name='BinaryConnectAffine_4')
# BatchNormalization_4
h = PF.batch_normalization(h, (1,), 0.9, 0.0001, not test, name='BatchNormalization_4')
# Softmax
h = F.softmax(h)
# CategoricalCrossEntropy -> 1
#h = F.categorical_cross_entropy(h, y)
return h
class_names = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z']
cap = cv2.VideoCapture(0) # 任意のカメラ番号に変更する
new_dir_path = "./realtime/"
os.makedirs(new_dir_path, exist_ok=True)
#カメラスタート
while True:
ret, frame = cap.read()
cv2.imshow("camera", frame)
k = cv2.waitKey(1)&0xff # キー入力を待つ
if k == ord('p'):
# 「p」キーで画像を保存
date = datetime.now().strftime("%Y%m%d_%H%M%S")
path = new_dir_path + date +".png"
cv2.imwrite(path, frame)
image_gs = cv2.imread(path)
path = new_dir_path + date +".png"
dst = cv2.resize(image_gs,(250,250))
cv2.imwrite(path, dst)
f = pd.DataFrame(columns=["x:data","y:data"])
xdata = path
ydata = 0
new_name = pd.Series([xdata,ydata],index=f.columns)
f = f.append(new_name, ignore_index=True)
f.to_csv('valu.csv',index=False,header = True )
test_data = data_iterator_csv_dataset("C:\\Users\\username\\Desktop\\output\\valu.csv",1,shuffle=False,normalize=True)
path = new_dir_path + "test" +".png"
cv2.imwrite(path, frame)
image_gs = cv2.imread(path)
path = new_dir_path + date +".png"
dst = cv2.resize(image_gs,(250,250))
cv2.imwrite(path, dst)
f = pd.DataFrame(columns=["x:data","y:data"])
xdata = path
ydata = 0
new_name = pd.Series([xdata,ydata],index=f.columns)
f = f.append(new_name, ignore_index=True)
f.to_csv('valu.csv',index=False,header = True )
test_data = data_iterator_csv_dataset("C:\\Users\\username\\Desktop\\output\\valu.csv",1,shuffle=False,normalize=True)
#ネットワークの構築
nn.clear_parameters()
x = nn.Variable((1,3,250,250))
t = nn.Variable((1,1))
y = network(x, t)
nn.load_parameters('C:\\Users\\username\\Desktop\\output\\yubidata.files\\20210113_161413\\results.nnp')
print("load model")
for i in range(test_data.size):
x.d, t.d = test_data.next()
y.forward()
print(y.d[0])
print(np.argmax(y.d[0]))
print(class_names[np.argmax(y.d[0])])
elif k == ord('q'):
# 「q」キーが押されたら終了する
break
# キャプチャをリリースして、ウィンドウをすべて閉じる
cap.release()
cv2.destroyAllWindows()
ネットワーク構造
学習結果
学習時に使った画像のパス AからZのフォルダ
CSVファイルの中身 変更後
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
考えられる原因
「n_outmaps」を指定してないから
TypeError: binary_connect_affine() missing 1 required positional argument: 'n_outmaps'
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.34%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2021/01/13 14:50
2021/01/13 14:58 編集
example
https://github.com/sony/nnabla-examples/blob/master/mnist-collection/classification_bnn.py
2021/01/13 15:20
2021/01/13 15:29
「PF.binary_connect_affine(c2, 50)」
とか
「PF.binary_connect_affine(c3, 10)」
とかの「10」とか「50」みたいに、適切な数値を書いたらいいのではないんですか?
2021/01/13 17:02
2021/01/13 17:04
2021/01/13 17:32 編集
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\get_file_handle.py", line 25, in get_file_handle_load
f = zipfile.ZipFile(path, 'r')
File "C:\Users\username\anaconda3\lib\zipfile.py", line 1250, in __init__
self.fp = io.open(file, filemode)
OSError: [Errno 22] Invalid argument: '\u202aC:\\Users\\username\\Desktop\\output\\yubidata.files\\20210113_161413\\results.nnp'
2021/01/13 17:43
y = network(x, t)
よりも後だから、数値を入れたことによってnetwork()のエラーが無くなって次に進んで、別のエラーが出た、ということでは??
(この質問は解決した)
あと、新たなエラーは、「C:\\...」の左に「\u202a」という余計なものが付いてるからでは??
2021/01/13 19:16
2021/01/13 19:20 編集
【追記】これはもう要らないです
2021/01/13 19:28 編集
と似てますけど、この方はコピペしてたのを手入力で入力し直したら直った、とのこと
ソースファイルに、見えない文字が紛れ込んでるのかな
2021/01/14 12:59
h = PF.binary_connect_affine(h, (100), name='BinaryConnectAffine_2')
h = PF.binary_connect_affine(h, (100), name='BinaryConnectAffine_3')
h = PF.binary_connect_affine(h(26,),name='BinaryConnectAffine_4')
に設定すると動きました。
ですが、全部認識結果が「I」になります。
1回目
\yubidata.files\20210112_183426\results.nnp
load model
[0.0515764 0.03382783 0.03344674 0.04046948 0.04542958 0.03339774
0.02917062 0.03195586 0.06075697 0.05417511 0.03260745 0.02741679
0.03162789 0.05240215 0.02787241 0.04017822 0.02635443 0.04595985
0.03558886 0.0456812 0.03325438 0.03321949 0.03107332 0.038652530.04287406 0.04103065]
8
I
\yubidata.files\20210112_183426\results.nnp
2回目
load model
[0.0515764 0.03382783 0.03344674 0.04046948 0.04542958 0.03339774
0.02917062 0.03195586 0.06075697 0.05417511 0.03260745 0.02741679
0.03162789 0.05240215 0.02787241 0.04017822 0.02635443 0.04595985
0.03558886 0.0456812 0.03325438 0.03321949 0.03107332 0.03865253 0.04287406 0.04103065]
8
I
2021/01/14 13:07
結果が全く同じですけど
2021/01/14 13:09 編集
に設定すると動きました。
は、
h = PF.binary_connect_affine(h,(26),name='BinaryConnectAffine_4')
ではないですか?
「26,」のカンマが無いと動かないのですか?
PF.binary_connect_affine()のことを良く知らないので、外していたらごめんなさい
2021/01/14 13:19
何度撮っても全く同じ結果になります。
2021/01/14 13:21
でtestのデフォルト値がFalseなので、推論時はtest=Trueにしないといけないのではないでしょうか?
y = network(x, t)
↓
y = network(x, t, test=True)
2021/01/14 13:29
カメラのレンズを隠して、撮影画像が真っ黒になるようにして、やってみてください
もしそれでも同じ結果になるなら、根本的に何かおかしい
ただし、グラフを見ると学習はできているようなので、学習と推論のネットワークが同じものなら、ちゃんと画像を入力したら、その画像に応じた結果が出てくるはずですよね
(学習させたネットワークは、今推論に使ってるのと同じネットワークですよね?)
カメラで撮影した画像ではなく、学習に使った画像をどれか1枚選んで入力させたら、出力は変わりますか?
もしそれでもダメなら、学習時と条件が違うことになるので、その原因を探して直さないと
2021/01/14 13:29
load model
[9.7630862e-03 9.3023442e-02 7.2787539e-04 1.6614092e-04 2.2879975e-02
9.7277027e-04 4.3072455e-02 1.1534660e-02 9.7264547e-04 7.1016606e-03
2.4919666e-03 2.0865960e-01 3.0631697e-01 1.1173449e-03 2.1491932e-02
1.2046617e-01 2.7991775e-02 1.9179404e-03 1.7600974e-05 4.8410583e-02
9.7565830e-04 7.0870705e-03 6.6945809e-03 2.2743765e-02 3.7295003e-03
2.9672911e-02]
12
M
2021/01/14 13:55
「f.to_csv('C:\\Users\\username\\Desktop\\output\\valu.csv',index=False,header = True )」
を両方ともコメント化したら「valu.csv」が更新されないので、既存の「valu.csv」が使われますから、そこに学習時に使った画像のパスを書いておけば、それでの推論がされるはずですよね
その結果はどうなりますでしょうか?
学習に使った画像はたくさんあると思うので、それらをいろいろ変えて推論させたら、ちゃんと画像に応じて結果が変わりますでしょうか?
もしそれでうまくいかないなら、カメラで撮影した画像でも当然うまくいきません
2021/01/14 14:37
#f.to_csv('valu.csv',index=False,header = True )
ここまではわかりましたが、学習時に使った画像のパスはこのすぐ下に書くのですか?
2021/01/14 14:43
最後に実行したときの「valu.csv」が残ってますよね
それをエディタ等で開いて、そこに書いてある(最後にカメラ使って推論したときの画像パス)を、学習時に使った画像のパスに書き換えて、保存
(ファイル名や拡張子や、ファイルの文字コードや改行コード等は変えずに、内容のパスだけ書き換えて保存する)
2021/01/14 15:46
またエラーが。。。
```
File "C:\Users\username\Desktop\output\capture.py", line 79, in <module>
test_data = data_iterator_csv_dataset("C:\\Users\\username\\Desktop\\output\\valu.csv",1,shuffle=False,normalize=True)
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_iterator.py", line 581, in data_iterator_csv_dataset
return data_iterator(ds,
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_iterator.py", line 406, in data_iterator
ds = DataSourceWithFileCache(data_source=data_source,
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source.py", line 453, in __init__
self._create_cache()
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source.py", line 326, in _create_cache
self._store_data_to_cache_buffer(self._position)
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source.py", line 275, in _store_data_to_cache_buffer
self._save_cache_to_file()
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source.py", line 209, in _save_cache_to_file
pool.map(get_data, [(pos, q) for pos in self._cache_positions])
File "C:\Users\username\anaconda3\lib\multiprocessing\pool.py", line 364, in map
return self._map_async(func, iterable, mapstar, chunksize).get()
File "C:\Users\username\anaconda3\lib\multiprocessing\pool.py", line 771, in get
raise self._value
File "C:\Users\username\anaconda3\lib\multiprocessing\pool.py", line 125, in worker
result = (True, func(*args, **kwds))
File "C:\Users\username\anaconda3\lib\multiprocessing\pool.py", line 48, in mapstar
return list(map(*args))
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source.py", line 198, in get_data
d = self._data_source._get_data(pos)
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source_implements.py", line 430, in _get_data
return tuple(self._process_row(self._rows[self._order[position]]))
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source_implements.py", line 407, in _process_row
values[variable] = self._get_value(
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source_implements.py", line 425, in _get_value
with self._filereader.open(value) as f:
File "C:\Users\username\anaconda3\lib\contextlib.py", line 113, in __enter__
return next(self.gen)
File "C:\Users\username\anaconda3\lib\site-packages\nnabla\utils\data_source_loader.py", line 176, in open
f = open(filename, 'rb')
FileNotFoundError: [Errno 2] No such file or directory: 'C:\\Users\\username\\Desktop\\output\\A_1.png'
```
2021/01/14 16:02 編集
そんなファイル無い、って言われてますけど、
> 'C:\\Users\\username\\Desktop\\output\\A_1.png'
は合ってますか?
質問で画像で挙げてるcsvだとフォルダの区切りは「\」(円マーク一つ)ですが、今回修正した「valu.csv」もそれと同じですか?
2021/01/14 16:56
https://dl.sony.com/ja/community/
2021/01/14 18:23
binary_connect_affine()
でエラーが出る件は解決したのだから、ここで続けるのではなく、別の質問にしてください