【问题标题】:ValueError: Shapes (256, 263) and (256, 279) are incompatibleValueError:形状 (256, 263) 和 (256, 279) 不兼容
【发布时间】:2021-02-16 15:37:33
【问题描述】:

我正在使用 Music21 将 MIDI 文件转换为音符,然后准备序列,并将它们传递到网络。 (这是基于https://github.com/Skuldur/Classical-Piano-Composer

def generate():
    """ Generate a piano midi file """
    #load the notes used to train the model
    with open('data/notes', 'rb') as filepath:
        notes = pickle.load(filepath)

    # Get all pitch names
    pitchnames = sorted(set(item for item in notes))
    # Get all pitch names
    n_vocab = len(set(notes))

    network_input, normalized_input = prepare_sequences(notes, pitchnames, n_vocab)
    model = create_network(normalized_input, n_vocab)
    prediction_output = generate_notes(model, network_input, pitchnames, n_vocab)
    create_midi(prediction_output)

def prepare_sequences(notes, pitchnames, n_vocab):
    """ Prepare the sequences used by the Neural Network """
    # map between notes and integers and back
    note_to_int = dict((note, number) for number, note in enumerate(pitchnames))

    sequence_length = 100
    network_input = []
    output = []
    for i in range(0, len(notes) - sequence_length, 1):
        sequence_in = notes[i:i + sequence_length]
        sequence_out = notes[i + sequence_length]
        network_input.append([note_to_int[char] for char in sequence_in])
        output.append(note_to_int[sequence_out])

    n_patterns = len(network_input)

    # reshape the input into a format compatible with LSTM layers
    normalized_input = numpy.reshape(network_input, (n_patterns, sequence_length, 1))
    # normalize input
    normalized_input = normalized_input / float(n_vocab)

    return (network_input, normalized_input)

def create_network(network_input, n_vocab):
    """ create the structure of the neural network """
    model = Sequential()
    model.add(LSTM(
        512,
        input_shape=(network_input.shape[1], network_input.shape[2]),
        recurrent_dropout=0.3,
        return_sequences=True
    ))
    model.add(LSTM(512, return_sequences=True, recurrent_dropout=0.3,))
    model.add(LSTM(512))
    model.add(BatchNorm())
    model.add(Dropout(0.3))
    model.add(Dense(256))
    model.add(Activation('relu'))
    model.add(BatchNorm())
    model.add(Dropout(0.3))
    model.add(Dense(n_vocab))
    model.add(Activation('softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='rmsprop')

    # Load the weights to each node
    model.load_weights('weights.hdf5')

    return model

训练效果很好,但是在预测时我得到了:

ValueError: Shapes (256, 263) and (256, 279) are incompatible

【问题讨论】:

    标签: python keras valueerror music21


    【解决方案1】:

    找到了解决问题的方法:本质上,我使用的是预训练的模型权重,该权重使用了不同的数据集,这导致了值错误。要解决它,只需根据您自己的回调调用特定的权重文件: 例如

    filepath = "weights-improvement-{epoch:02d}-{loss:.4f}-bigger.hdf5"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-13
      • 2021-02-23
      • 1970-01-01
      • 2021-05-12
      • 2021-05-29
      • 1970-01-01
      相关资源
      最近更新 更多