В дополнение к тому, что упомянул Фабио о проверке типа слоя и ReLU, являющегося активирующим, а не обучаемым слоем, поскольку речь идет об инициализации, вы можете выполнить весовую инициализацию в самом методе __init__, как это сделано здесь:
https://github.com/pytorch/vision/blob/master/torchvision/models/vgg.py
def __init__(self, features, num_classes=1000,...):
----snip---
self._initialize_weights()
def _initialize_weights(self):
if isinstance(m, nn.Linear):
m.weight.data.normal_(0.0, 1)
Основным источником проблем, с которыми я сталкивался при работе со строками Unicode, является смешивание строк в кодировке utf-8 со строками Unicode.
Например, рассмотрим следующие сценарии.
two.py
# encoding: utf-8
name = 'helló wörld from two'
one.py
# encoding: utf-8
from __future__ import unicode_literals
import two
name = 'helló wörld from one'
print name + two.name
Результат запуска python one.py
:
Traceback (most recent call last):
File "one.py", line 5, in <module>
print name + two.name
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 4: ordinal not in range(128)
В этом примере two.name
- это кодировка utf-8 строка (не unicode), поскольку она не импортировала unicode_literals
, а one.name
является строкой Unicode. Когда вы смешиваете оба, python пытается декодировать закодированную строку (предполагая, что это ascii) и преобразовывает ее в unicode, и терпит неудачу. Это сработало бы, если бы вы сделали print name + two.name.decode ('utf-8')
.
То же самое может произойти, если вы закодируете строку и попытаетесь смешать их позже. Например, это работает:
# encoding: utf-8
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Вывод:
DEBUG: <html><body>helló wörld</body></html>
Но после добавления импорта unicode_literals
он НЕ:
# encoding: utf-8
from __future__ import unicode_literals
html = '<html><body>helló wörld</body></html>'
if isinstance(html, unicode):
html = html.encode('utf-8')
print 'DEBUG: %s' % html
Вывод:
Traceback (most recent call last):
File "test.py", line 6, in <module>
print 'DEBUG: %s' % html
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 16: ordinal not in range(128)
Сбой, поскольку 'DEBUG:% s'
является строкой Unicode, и поэтому python пытается декодировать html
. Для исправления печати можно использовать несколько способов: print str ('DEBUG:% s')% html
или print 'DEBUG:% s'% html.decode ('utf-8' )
.
Я надеюсь, что это поможет вам понять потенциальные ошибки при использовании Unicode-строк.
Я обнаружил, что если вы добавите директиву unicode_literals
, вы также должны добавить что-то вроде:
# -*- coding: utf-8
в первую или вторую строку вашего файла .py. В противном случае строки, такие как:
foo = "barré"
приводят к ошибке, такой как:
SyntaxError: Non-ASCII character '\xc3' in file mumble.py on line 198, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Также в версии 2.6 (до python 2.6.5 RC1 +) литералы юникода плохо работают с аргументами ключевого слова ( issue4978 ):
Например, работает следующий код без unicode_literals, но с ошибкой TypeError: ключевые слова должны быть строкой
, если используется unicode_literals.
>>> def foo(a=None): pass
...
>>> foo(**{'a':1})
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() keywords must be strings