Какие-либо глюки с помощью unicode_literals в Python 2.6?

В дополнение к тому, что упомянул Фабио о проверке типа слоя и 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)

102
задан hippietrail 10 February 2016 в 03:47
поделиться

3 ответа

Основным источником проблем, с которыми я сталкивался при работе со строками 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-строк.

101
ответ дан 24 November 2019 в 04:34
поделиться

Я обнаружил, что если вы добавите директиву 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
13
ответ дан 24 November 2019 в 04:34
поделиться

Также в версии 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
16
ответ дан 24 November 2019 в 04:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: