Вы должны переместить вычисления T
внутри цикла, иначе они всегда будут иметь одно и то же постоянное значение, то есть постоянные потери.
Другое дело - инициализировать theta
различными значениями по индексам, в противном случае из-за симметричной природы задачи градиент одинаков для каждого индекса.
Другое дело, что вам нужен нулевой градиент, потому что backward
просто накапливает их.
Это, кажется, работает:
def phaseOptimize(n, s = 48000, nsteps = 1000):
learning_rate = 1e-1
theta = torch.zeros([n, 1], requires_grad=True)
theta.data[0][0] = 1
l = torch.linspace(0, 2 * np.pi, s)
t = torch.stack([l] * n)
for jj in range(nsteps):
T = t + theta
loss = T.sin().sum(0).pow(2).sum() / s
loss.backward()
theta.data -= learning_rate * theta.grad.data
theta.grad.zero_()
Я на самом деле никогда не потрудился выяснять, как извлечь биты из использования XML-документов HaXML; HXT удовлетворил все мои потребности.
{-# LANGUAGE Arrows #-}
import Data.Maybe
import Text.XML.HXT.Arrow
type Name = String
type Value = String
data LocalizedString = LS Name Value
getLocalizedStrings :: String -> Maybe [LocalizedString]
getLocalizedStrings = (.) listToMaybe . runLA $ xread >>> getRoot
atTag :: ArrowXml a => String -> a XmlTree XmlTree
atTag tag = deep $ isElem >>> hasName tag
getRoot :: ArrowXml a => a XmlTree [LocalizedString]
getRoot = atTag "root" >>> listA getElem
getElem :: ArrowXml a => a XmlTree LocalizedString
getElem = atTag "elem" >>> proc x -> do
name <- getAttrValue "name" -< x
value <- getChildren >>> getText -< x
returnA -< LS name value
Вы, вероятно, хотели бы немного больше проверки ошибок (т.е. не просто лениво использовать atTag
как я; на самом деле проверьте это <root>
корень, <elem>
прямой потомок, и т.д.), но это работает просто великолепно на Вашем примере.
Теперь, если Вы нуждаетесь в представлении к Стрелкам, к сожалению, я не знаю никого хорошего. Я сам изучил это "брошенный в океан, чтобы изучить, как плавать" путь.
Что-то, что может быть полезно для учета, то, что proc
/-<
синтаксис является просто сахаром для основных операций стрелки (arr
, >>>
, и т.д.), точно так же, как do
/<-
просто сахар для основных операций монады (return
, >>=
, и т.д.). Следующее эквивалентно:
getAttrValue "name" &&& (getChildren >>> getText) >>^ uncurry LS
proc x -> do
name <- getAttrValue "name" -< x
value <- getChildren >>> getText -< x
returnA -< LS name value
Используйте один из XML-пакетов.
Самые популярные в порядке,
FWIW, HXT походит на излишество, где простой TagSoup сделает :)
Вот моя вторая попытка (после того, как, получая некоторый хороший вход от других) с TagSoup:
module Xml where
import Data.Char
import Text.HTML.TagSoup
type SName = String
type SValue = String
data LocalizedString = LS SName SValue
deriving Show
getLocalizedStrings :: String -> [LocalizedString]
getLocalizedStrings = create . filterTags . parseTags
where
filterTags :: [Tag] -> [Tag]
filterTags = filter (\x -> isTagOpenName "elem" x || isTagText x)
create :: [Tag] -> [LocalizedString]
create (TagOpen "elem" [("name", name)] : TagText text : rest) =
LS name (trimWhiteSpace text) : create rest
create (_:rest) = create rest
create [] = []
trimWhiteSpace :: String -> String
trimWhiteSpace = dropWhile isSpace . reverse . dropWhile isSpace . reverse
main = do
xml <- readFile "xml.xml" -- xml.xml contains the xml in the original question.
putStrLn . show . getLocalizedStrings $ xml
Первая попытка продемонстрировала наивное (и дефектный) метод для обрезки пробела прочь строки.