2017-11-15 33 views
9

मैं एक कंप्यूटर CentOS लिनक्स 1611/03/07 (कोर) ऑपरेटिंग सिस्टम होने पर अजगर 3.5.1 साथ काम कर रहा हूँ।pytorch, AttributeError: मॉड्यूल 'मशाल' कोई गुण नहीं है 'टेन्सर'

मैं पायटोर का उपयोग करने की कोशिश कर रहा हूं और मैं this tutorial के साथ शुरू कर रहा हूं।

दुर्भाग्य से, उदाहरण के # 4 लाइन मुसीबतों बनाता है:

>>> torch.Tensor(5, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: module 'torch' has no attribute 'Tensor' 

मैं इस त्रुटि को समझ में नहीं कर सकते हैं ... मशाल में निश्चित रूप से 'मशाल' एक विशेषता 'टेन्सर' होता है। मशाल में एक ही आदेश काम करता है।

मैं इस समस्या को कैसे हल कर सकता हूं?

+0

'>>> मदद (मशाल)' या '>>> torch' या' >>> dir (मशाल) ', आदि यदि आप अधिक जानकारी की तुलना में हमें –

+0

यहाँ यह है है:' पैकेज मशाल पर सहायता: NAME मशाल पैकेज सामग्री फ़ाइल (बिल्ट-इन) (अंत) '' –

+0

>>> मशाल <मॉड्यूल 'मशाल' (नाम स्थान)> '' –

उत्तर

11

आपके द्वारा चलाए जा रहे पायथन बाइनरी में torch स्थापित नहीं है। यह मॉड्यूल खोज पथ पर torch नाम के एक निर्देशिका है, और यह रूप में एक namespace package व्यवहार किया जाता है:

$ pwd 
/some/path 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ModuleNotFoundError: No module named 'torch' 
$ mkdir torch 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
<module 'torch' (namespace)> 
_NamespacePath(['/some/path/torch']) 

उस में एक __init__.py फ़ाइल वर्तमान के बिना किसी भी निर्देशिका, अपने मॉड्यूल खोज पथ पर स्थित है, माना जाएगा एक नामस्थान के रूप में, प्रदान किए गए किसी भी अन्य पायथन मॉड्यूल या उस नाम से संकुल खोज पथ के साथ कहीं और पाए जाते हैं।

इसका मतलब यह है कि अगर torch अपने अजगर द्विआधारी के लिए स्थापित किया गया था, यह अगर वहाँ एक स्थानीय torch निर्देशिका है कोई फर्क नहीं पड़ता:

$ ls -ld torch/ 
drwxr-xr-x 2 mjpieters users 68 Nov 23 13:57 torch/ 
$ mkdir -p additional_path/torch/ 
$ touch additional_path/torch/__init__.py 
$ PYTHONPATH="./additional_path" python3 -c 'import os.path as p, sys; print(*(t for t in (p.join(e, "torch") for e in sys.path) if p.exists(t)), sep="\n")' 
torch 
/some/path/additional_path/torch 
$ PYTHONPATH="./additional_path" python3 -c 'import torch; print(torch); print(torch.__path__)' 
<module 'torch' from '/some/path/additional_path/torch/__init__.py'> 
['/some/path/additional_path/torch'] 

ऊपर से पता चलता है कि sys.path सूचियों torch निर्देशिका पहले, additional_path/torch द्वारा पीछा किया , लेकिन जब आप इसे आयात करने का प्रयास करते हैं तो बाद वाले को torch मॉड्यूल के रूप में लोड किया जाता है। ऐसा इसलिए है क्योंकि नामस्थान पैकेज लोड करने से पहले पायथन शीर्ष-स्तर मॉड्यूल और पैकेज को प्राथमिकता देता है।

आपको अपने वर्तमान पायथन बाइनरी के लिए सही ढंग से मशाल स्थापित करने की आवश्यकता है, project homepage देखें; जब pip का उपयोग कर आप के बजाय -m स्विच के साथ अजगर द्विआधारी का उपयोग करना चाहते हो सकता है:

python3.5 -m pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl 
python3.5 -m pip install torchvision 

तो pip3 मुखपृष्ठ निर्देश python3.5 -m pip के साथ प्रयोग की जगह; python3.5 आपके पायथन बाइनरी का पूरा मार्ग भी हो सकता है।

नवीनतम संस्करण के लिए सही download.pytorch.org यूआरएल का उपयोग करें।

आपको निर्देशिका को अलग-अलग स्थानांतरित करने की आवश्यकता नहीं है, लेकिन यदि आप यह जानना चाहते हैं कि यह कहां स्थित है, तो print(torch.__path__) का उपयोग करें जैसा मैंने ऊपर दिखाया है।

फिर, ध्यान दें कि यदि आप एक स्थानीय torch निर्देशिका में एक __init__.py फ़ाइल है , यह एक नियमित रूप से पैकेज हो जाता है और यह सामान्य site-packages स्थान में pip द्वारा इंस्टॉल किए गए पैकेज मुखौटा होगा। यदि आपके पास ऐसा पैकेज है, या स्थानीय torch.py सिंगल-फ़ाइल मॉड्यूल है, तो आपको उनको नाम बदलने की आवश्यकता है।निदान जानकारी उस मामले में अलग दिखता है:

$ pwd 
/some/path 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ModuleNotFoundError: No module named 'torch' 
$ mkdir torch 
$ touch torch/__init__.py # make it a package 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
<module 'torch' from '/some/path/torch/__init__.py'> 
['/some/path/torch'] 
$ rm -rf torch/ 
$ touch torch.py   # make it a module 
$ python3 -c 'import torch; print(torch); print(torch.__file__)' 
<module 'torch' from '/some/path/torch.py'> 
/some/path/torch.py 

नोट मतभेद; उपरोक्त नामस्थान पैकेज <module 'name' (namespace)> का उपयोग करता है, जबकि एक नियमित पैकेज ), while a plain module uses `का उपयोग करता है।

ऐसे पैकेज और मॉड्यूल (नामस्थान पैकेज नहीं) पहले पाए जाते हैं और खोज को रोकते हैं। यदि पाया गया पैकेज या मॉड्यूल वह नहीं है जिसे आप चाहते थे, तो आपको उन्हें अलग-अलग स्थानांतरित करने या उनका नाम बदलने की आवश्यकता है।

+0

धन्यवाद में हस्तक्षेप कर सकता है, लेकिन यह काम नहीं करता है। मैंने आपके सभी कदमों का पालन किया लेकिन कुछ भी नहीं बदला। अतिरिक्त विचार? –

+0

@ डेविड चेकको क्या आप अपने आउटपुट के साथ एक पास्ता या गिस्ट बना सकते हैं, इसलिए हम निदान कर सकते हैं कि क्या गलत हो रहा है? क्या 'python3.5 -m पाइप फ्रीज 'सूची मशाल बिल्कुल है? –

+0

यहाँ 'python3.5 -m -PIP freeze' के उत्पादन में है: फ्रीज numexpr == 2.6.1 numpy == 1.11.1 olefile == 0.44 पांडा' python3.5 -m पिप == 0.18.1 तकिया == 4.3.0 अजगर-dateutil == 2.5.3 pytz == 2016/06/01 PyYAML == 3.12 scikit सीखने == 0.17.1 scipy == 0.17.1 छह == 1.10। 0 टेबल == 3.2.3.1 मशाल == 0.2.0.post3 torchvision == 0.1.9' –

0

ऐसा लगता है कि नोटबुक python2 के साथ चल रहा है।
notebook file की metadata धारा (एक पाठ संपादक में खुला)

"metadata": { 
    "kernelspec": { 
    "display_name": "Python 2", 
    "language": "python", 
    "name": "python2" 
    }, 
    "language_info": { 
    "codemirror_mode": { 
    "name": "ipython", 
    "version": 2 
    }, 
    "file_extension": ".py", 
    "mimetype": "text/x-python", 
    "name": "python", 
    "nbconvert_exporter": "python", 
    "pygments_lexer": "ipython2", 
    "version": "2.7.13" 
    } 
} 
देखें


ठीक
1. सुनिश्चित IPython के लिए python3.5 कर्नेल/jupyter स्थापित किया गया है:
python3.5 -m ipykernel install --name python3.5.1

2. jupyter notebook चलाएं और नोटबुक में कर्नेल संस्करण बदलें:
enter image description here



या hackily <notebook.ipynb> सीधे (अनुशंसित नहीं) संपादित करें:

"metadata": { 
    "kernelspec": { 
    "display_name": "Python 3.5.1", 
    "language": "python", 
    "name": "python3.5.1" 
    }, 
    "language_info": { 
    "codemirror_mode": { 
    "name": "ipython", 
    "version": 3 
    }, 
    "file_extension": ".py", 
    "mimetype": "text/x-python", 
    "name": "python", 
    "nbconvert_exporter": "python", 
    "pygments_lexer": "ipython3", 
    "version": "3.5.1" 
    } 
} 
0

अजगर द्विआधारी है कि आप चल रहे हैं torch स्थापित नहीं है। यह मॉड्यूल खोज पथ पर torch नाम के एक निर्देशिका है, और यह रूप में एक namespace package व्यवहार किया जाता है:

$ pwd 
/some/path 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
Traceback (most recent call last): 
    File "<string>", line 1, in <module> 
ModuleNotFoundError: No module named 'torch' 
$ mkdir torch 
$ python3 -c 'import torch; print(torch); print(torch.__path__)' 
<module 'torch' (namespace)> 
_NamespacePath(['/some/path/torch']) 

उस में एक __init__.py फ़ाइल वर्तमान के बिना किसी भी निर्देशिका, अपने मॉड्यूल खोज पथ पर स्थित है, माना जाएगा एक नामस्थान के रूप में, प्रदान किए गए किसी भी अन्य पायथन मॉड्यूल या उस नाम से संकुल खोज पथ के साथ कहीं और पाए जाते हैं।

इसका मतलब यह है कि अगर torch अपने अजगर द्विआधारी के लिए स्थापित किया गया था, यह अगर वहाँ एक स्थानीय torch निर्देशिका है कोई फर्क नहीं पड़ता:

$ ls -ld torch/ 
drwxr-xr-x 2 mjpieters users 68 Nov 23 13:57 torch/ 
$ mkdir -p additional_path/torch/ 
$ touch additional_path/torch/__init__.py 
$ PYTHONPATH="./additional_path" python3 -c 'import os.path as p, sys; print(*(t for t in (p.join(e, "torch") for e in sys.path) if p.exists(t)), sep="\n")' 
torch 
/some/path/additional_path/torch 
$ PYTHONPATH="./additional_path" python3 -c 'import torch; print(torch); print(torch.__path__)' 
<module 'torch' from '/some/path/additional_path/torch/__init__.py'> 
['/some/path/additional_path/torch'] 

ऊपर से पता चलता है कि sys.path सूचियों torch निर्देशिका पहले, additional_path/torch द्वारा पीछा किया , लेकिन जब आप इसे आयात करने का प्रयास करते हैं तो बाद वाले को torch मॉड्यूल के रूप में लोड किया जाता है। ऐसा इसलिए है क्योंकि नामस्थान पैकेज लोड करने से पहले पायथन शीर्ष-स्तर मॉड्यूल और पैकेज को प्राथमिकता देता है।

आपको अपने वर्तमान पायथन बाइनरी के लिए सही ढंग से मशाल स्थापित करने की आवश्यकता है, project homepage देखें; जब pip का उपयोग कर आप के बजाय -m स्विच के साथ अजगर द्विआधारी का उपयोग करना चाहते हो सकता है:

python3.5 -m pip install http://download.pytorch.org/whl/cu80/torch-0.2.0.post3-cp35-cp35m-manylinux1_x86_64.whl 
python3.5 -m pip install torchvision 

तो pip3 मुखपृष्ठ निर्देश python3.5 -m pip के साथ प्रयोग की जगह; python3.5 आपके पायथन बाइनरी का पूरा मार्ग भी हो सकता है।

नवीनतम संस्करण के लिए सही download.pytorch.org यूआरएल का उपयोग करें।

आपको निर्देशिका को अलग-अलग स्थानांतरित करने की आवश्यकता नहीं है, लेकिन यदि आप यह जानना चाहते हैं कि यह कहां स्थित है, तो print(torch.__path__) का उपयोग करें जैसा मैंने ऊपर दिखाया है।

संबंधित मुद्दे