В Haskell, как Вы извлекаете строки из XML-документа?

Вы должны переместить вычисления 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_()
7
задан Tim Stewart 17 March 2009 в 13:59
поделиться

4 ответа

Я на самом деле никогда не потрудился выяснять, как извлечь биты из использования 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
6
ответ дан 6 December 2019 в 21:20
поделиться

Используйте один из XML-пакетов.

Самые популярные в порядке,

  1. haxml
  2. hxt
  3. xml-свет
  4. hexpat
3
ответ дан 6 December 2019 в 21:20
поделиться

FWIW, HXT походит на излишество, где простой TagSoup сделает :)

2
ответ дан 6 December 2019 в 21:20
поделиться

Вот моя вторая попытка (после того, как, получая некоторый хороший вход от других) с 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

Первая попытка продемонстрировала наивное (и дефектный) метод для обрезки пробела прочь строки.

1
ответ дан 6 December 2019 в 21:20
поделиться
Другие вопросы по тегам:

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