在 Colab 和本地运行相同的代码会产生不同的结果。不涉及随机化或神经网络训练

问题描述 投票:0回答:2

我的代码在本地终端和 Google Colab 上产生不同的结果。但是,如果我在 Colab 上使用终端命令(即

!python test.py
)运行相同的代码,它会产生与本地相同的结果。与 Stack Overflow 上的另一篇文章不同,这段代码没有随机数发生器或神经网络训练内容,只有普通的旧函数。

项目简短描述:我正在尝试编写用于音乐生成的深度学习代码。我将音符(从萨克斯独奏)更改为固定长度的列表,并将相同小节的音符放在更大的列表中。我最终得到了一个列表(分数)列表(度量,不同长度)列表(笔记,固定长度)。要将其转换为张量,我必须使所有列表具有相同的长度,因此我决定在每个较短列表的末尾填充 [0, 0, 0, 0]。

在本地和 Colab 上使用终端命令,它会输出

hi
hello
以及成功填充零。但在使用本机运行按钮的 Colab 上,它仅打印
hello
并输出未填充的列表。

代码如下:

(data_transform.py)

from music21 import *

def mxl2list(mxlfile): #padded

    print('hi')
    parsed = converter.parse(mxlfile)
    myPiece = []

    measures = parsed[1] #measures[0] is an instrument, not a measure
    measures.pop(0)
    measures[-1].pop(-1)


    for m in measures: #for each measure
        myMeasure = []
        
        #Each note/rest has the following values, in order:
        #Pitch (integer, midi pitch constants, get with n.pitch.midi, 128 for rest)
        #Offset (float)
        #Duration (float, 0.0 for grace notes, get or set with n.quarterLength)
        #Tie (0 for no tie, 1 for tie start, 2 for tie stop, 3 for tie continue)

        for note in m:
            myNote = [0,0,0,0]

            try:
                if note.isRest or note.isNote:
                    pass
            except AttributeError:
                continue

            if note.isRest:
                myNote[0] = 128
            else:
                myNote[0] = note.pitch.midi
            
            myNote[1] = note.offset

            myNote[2] = note.quarterLength

            try:
                isTie = note.tie.type
                if isTie == "start":
                    myNote[3] = 1
                elif isTie == "stop":
                    myNote[3] = 2
                elif isTie == "continue":
                    myNote[3] = 3
            except AttributeError:
                myNote[3] = 0
            
            myMeasure.append(myNote)
        
        myPiece.append(myMeasure)

    #pad shorter length lists with zeros
    zeroList = [0, 0, 0, 0]
    listLen = []
    for measures in myPiece:
        listLen.append(len(measures))
    maxLen = max(listLen)
    for measures in myPiece:
        lenDiff = maxLen - len(measures)
        for i in range(lenDiff):
            measures.append(zeroList)

    return myPiece

(测试.py)

from data_transform import *

print('hello')
scoreList = mxl2list('musicxml/gs2.mxl')
print(scoreList)
python list google-colaboratory music21
2个回答
1
投票

默认情况下,Google Colab 安装了明显较旧版本的 music21。您可以通过以下方式将其升级到最新版本:

!pip install --upgrade music21

Colab 中 music21 的基本设置也将在笔记本中生成音乐符号,可以在以下位置找到:

https://colab.research.google.com/gist/mscuthbert/431dee45c01598a0c11bc27823bd1c5b/music21_setup.ipynb

与 Jupyter Notebook 不同的是,笔记本中的 MIDI 播放尚不可用。 (编辑:上面的链接现在有一个用于播放 MIDI 的解决方法)


0
投票

这可能不是OP发生的事情,但添加这个答案是为了其他人的利益:

如果您使用的是共享 Colab 笔记本,请确保您在其他人打开同一个笔记本进行编辑时没有工作。
对我来说,它导致的问题在单独工作时并不明显,似乎是因为共享同一个对象(pandas 数据帧),这听起来很疯狂。

© www.soinside.com 2019 - 2024. All rights reserved.