如何修改Andrej Karpathy的Char RNN以使用非文本数据类型

我正在尝试修改Andrej Karpathy的Char RNN,以使用256维的8或16位向量,而不是文本。

我已经阅读了代码,但我不完全理解它在做什么。

代码可以在这里找到https://github.com/karpathy/char-rnn 我认为只需要修改这个文件https://github.com/karpathy/char-rnn/blob/master/util/CharSplitLMMinibatchLoader.lua 具体来说,需要修改以下部分

function CharSplitLMMinibatchLoader.text_to_tensor(in_textfile, out_vocabfile, out_tensorfile)
    local timer = torch.Timer()

    print('加载文本文件...')
    local cache_len = 10000
    local rawdata
    local tot_len = 0
    local f = assert(io.open(in_textfile, "r"))

    -- 创建词汇表(如果尚不存在)
    print('创建词汇表映射...')
    -- 将所有字符记录到一个集合中
    local unordered = {}
    rawdata = f:read(cache_len)
    repeat
        for char in rawdata:gmatch'.' do
            if not unordered[char] then unordered[char] = true end
        end
        tot_len = tot_len + #rawdata
        rawdata = f:read(cache_len)
    until not rawdata
    f:close()
    -- 将 unordered 表格排序到 ordered 表格中(即:keys 变为 1..N)
    local ordered = {}
    for char in pairs(unordered) do ordered[#ordered + 1] = char end
    table.sort(ordered)
    -- 反转 ordered 表格,以创建char->int映射
    local vocab_mapping = {}
    for i, char in ipairs(ordered) do
        vocab_mapping[char] = i
    end
    -- 使用所有数据构建张量
    print('将数据放入张量中...')
    local data = torch.ByteTensor(tot_len) -- 先存储在1D中,然后重新排列
    f = assert(io.open(in_textfile, "r"))
    local currlen = 0
    rawdata = f:read(cache_len)
    repeat
        for i=1, #rawdata do
            data[currlen+i] = vocab_mapping[rawdata:sub(i, i)] -- lua 不能使用[]进行字符串索引
        end
        currlen = currlen + #rawdata
        rawdata = f:read(cache_len)
    until not rawdata
    f:close()

    -- 保存预处理的输出文件
    print('保存 ' .. out_vocabfile)
    torch.save(out_vocabfile, vocab_mapping)
    print('保存 ' .. out_tensorfile)
    torch.save(out_tensorfile, data)
end

由于我不懂Python、Torch或Lua,所以有点迷茫。

点赞