def prepare_sequences(notes, num_pitch): # 从midi中读取的notes和所有音符的数量 """ 为神经网络提供好要训练的序列 """ sequence_length = 100 # 序列长度 # 得到所有不同音高的名字 pitch_names = sorted(set(item for item in notes)) # 把notes中的所有音符做集合操作,去掉重复的音,然后按照字母顺序排列 # 创建一个字典,用于映射 音高 和 整数 pitch_to_int = dict((pitch, num) for num, pitch in enumerate(pitch_names)) # 枚举到pitch_name中 # 创建神经网络的输入序列和输出序列 network_input = [] network_output = [] for i in range(0, len(notes) - sequence_length, 1): # 循环次数,步长为1 sequence_in = notes[i:i + sequence_length] # 每次输入100个序列,每隔长度1取下一组,例如:(0,100),(1,101),(50,150) sequence_out = notes[i + sequence_length] # 真实值,从100开始往后 network_input.append([pitch_to_int[char] for char in sequence_in]) # 列表生成式 # 把sequence_in中的每个字符转为整数(pitch_to_int[char])放到network_input network_output.append(pitch_to_int[sequence_out]) # 把sequence_out的一个字符转为整数 n_patterns = len(network_input) # 输入序列长度 # 将输入序列的形状转成神经网络模型可以接受的 network_input = np.reshape(network_input, (n_patterns, sequence_length, 1)) # 输入,要改成的形状 # 将输入标准化,归一化 network_input = network_input / float(num_pitch) # 将期望输出转换成{0,1}布尔矩阵,配合categorical_crossentrogy误差算法的使用 network_output = tf.keras.utils.to_categorical(network_output) # keras中的这个方法可以将一个向量传进去转成布尔矩阵,供交叉熵的计算 return network_input, network_output
时间: 2024-04-27 17:23:03 浏览: 7
这段代码是用于为神经网络提供训练序列的函数,输入参数包括midi中读取的音符列表和所有音符的数量。函数首先会将所有不同的音高名字按字母顺序排列,并创建一个字典用于将音高映射到整数。接下来,函数会根据给定的序列长度,将输入的音符列表划分为许多长度为序列长度的片段,每次取下一组的步长为1。对于每个片段,函数会将其转换为整数列表,并将接下来一个音符转换为整数作为真实值。最后,函数将输入和期望输出进行标准化和转换,以便于神经网络的训练和计算交叉熵误差。
相关问题
def create_inout_sequences(input_data, tw):
def create_inout_sequences(input_data, tw) 是一个函数,它接受两个参数 input_data 和 tw。
input_data 是输入的数据,可以是一个列表、数组或其他数据结构。该参数表示原始数据,用于生成输入和输出序列。
tw 是一个整数参数,表示时间窗口的大小。时间窗口是用来定义输入序列和输出序列的长度。
该函数的作用是将输入数据 input_data 划分为输入序列和输出序列。输入序列的长度是时间窗口 tw,输出序列的长度是 1。函数返回一个包含输入序列和输出序列的列表。
具体实现时,函数根据时间窗口大小 tw,从输入数据 input_data 中截取连续的 tw 个元素作为一个输入序列,然后将该输入序列的下一个元素作为输出序列的值。这样,每个输入序列都会有一个对应的输出序列。
例如,假设输入数据 input_data 为 [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],时间窗口 tw 为 3,则生成的输入序列和输出序列分别为:
输入序列 [1, 2, 3],输出序列 4
输入序列 [2, 3, 4],输出序列 5
输入序列 [3, 4, 5],输出序列 6
输入序列 [4, 5, 6],输出序列 7
输入序列 [5, 6, 7],输出序列 8
输入序列 [6, 7, 8],输出序列 9
输入序列 [7, 8, 9],输出序列 10
最后,将所有生成的输入序列和输出序列存储在列表中并返回。
def preprocess_data(data): # 将音符和和弦分开 notes, chords = [], [] for seq in data: notes.append(seq[:, :NUM_CLASSES]) chords.append(seq[:, NUM_CLASSES:]) notes = np.array(notes) chords = np.array(chords) # 对音符序列进行one-hot编码 notes = to_categorical(notes, num_classes=NUM_CLASSES) # 对和弦序列进行编码 chords = np.argmax(chords, axis=-1) # 对音符和和弦序列进行填充 notes = pad_sequences(notes, maxlen=SEQ_LEN, padding='pre', truncating='pre') chords = pad_sequences(chords, maxlen=SEQ_LEN, padding='pre', truncating='pre') return notes, chords
这是一个用于预处理音符和和弦数据的函数,其中有几个步骤:
1. 将原始数据中的音符和和弦分开存储。
2. 对音符序列进行 one-hot 编码,使其可以被神经网络直接处理。
3. 对和弦序列进行编码,将其转换为整数表示。
4. 对音符和和弦序列进行填充,使它们的长度一致,便于神经网络进行处理。
函数的输入是原始数据,输出是经过预处理后的音符和和弦序列。其中,NUM_CLASSES 表示音符或和弦的数量,SEQ_LEN 表示序列的长度。