柠檬味的袜子oh 2025-01-06 17:38 采纳率: 0%
浏览 7

SciKeras训练模型出错


def create_model(num_filters, kernel_size, vocab_size, embedding_dim, maxlen):
    model = keras.Sequential()
    model.add(keras.layers.Embedding(vocab_size, embedding_dim, input_length=maxlen))
    model.add(keras.layers.Conv1D(num_filters, kernel_size, activation='relu'))
    model.add(keras.layers.GlobalMaxPooling1D())
    model.add(keras.layers.Dense(10, activation='relu'))
    model.add(keras.layers.Dense (1,activation='softmax'))
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['accuracy'])

    return model



param_grid = {"num_filters":[32, 64, 128],
                  "kernel_size":[3, 5, 7],
                  "embedding_dim":[50],
                  "maxlen":[500]}


from scikeras.wrappers import KerasClassifier
from sklearn.model_selection import GridSearchCV

# 超参数
epochs = 20
embedding_dim = 50
maxlen = 500
output_file = 'data/output.txt'

# 参数选择
for source, frame in df.groupby('source'):
    print('Running grid search for data set :', source)
    sentences = df['sentence'].values
    y = df['label'].values

    sentences_train, sentences_test, y_train, y_test = train_test_split(
        sentences, y, test_size=0.25, random_state=1000)

    tokenizer = Tokenizer(num_words=5000)
    tokenizer.fit_on_texts(sentences_train)
    X_train = tokenizer.texts_to_sequences(sentences_train)
    X_test = tokenizer.texts_to_sequences(sentences_test)

    vocab_size = len(tokenizer.word_index) + 1

    X_train = pad_sequences(X_train, padding='post', maxlen=maxlen)
    X_test = pad_sequences(X_test, padding='post', maxlen=maxlen)

    # 参数空间

    param_grid = {"num_filters" : [32, 64, 128],
                      "kernel_size" : [3, 5, 7],
                      "vocab_size" : [vocab_size],
                      "embedding_dim" : [embedding_dim],
                      "maxlen" : [maxlen]}

    model = KerasClassifier(model=create_model,num_filters= 32 , kernel_size= 5 ,vocab_size=vocab_size, embedding_dim=embedding_dim, maxlen=maxlen,
                            epochs=epochs, batch_size=64,
                            verbose=1)
    grid = GridSearchCV(estimator=model, param_grid=param_grid,
                              cv=3, verbose=1, scoring='accuracy',error_score='raise')
    print("y_train shape:", y_train.shape)
    print("X_train shape:", X_train.shape)
    grid_result = grid.fit(X_train, y_train)

    # 测试结果
    test_accuracy = grid.score(X_test, y_test)

    with open(output_file, 'a') as f:
        s = ('Running {} data set\nBest Accuracy : '
             '{:.4f}\n{}\nTest Accuracy : {:.4f}\n\n')
        output_string = s.format(
            source,
            grid_result.best_score_,
            grid_result.best_params_,
            test_accuracy)
        print(output_string)
        f.write(output_string)

这是我的代码片段,明明定义了输出层,且我的y_train的形状也是对的,为何还是出错?


    raise AttributeError(
AttributeError: Sequential model 'sequential_7' has no defined outputs yet.. Did you mean: 'output'?
  • 写回答

2条回答 默认 最新

  • 道友老李 JWE233286一种基于机器视觉的水表指针读数识别及修正的方法 专利发明者 2025-01-06 17:40
    关注
    让【道友老李】来帮你解答,本回答参考通义千问大模型编写,并整理提供,如果还有疑问可以点击头像关注私信或评论。
    如果答案让您满意,请采纳、关注,非常感谢!
    在您的代码中,可能存在一个潜在的问题:您在创建模型时未明确指定输出层。在Keras中,您需要在模型中添加一个输出层,以便将模型的输出传递给损失函数和评估指标。尝试在您的create_model函数中添加一个输出层,如下所示:
    def create_model(num_filters, kernel_size, vocab_size, embedding_dim, maxlen):
        model = keras.Sequential()
        model.add(keras.layers.Embedding(vocab_size, embedding_dim, input_length=maxlen))
        model.add(keras.layers.Conv1D(num_filters, kernel_size, activation='relu'))
        model.add(keras.layers.GlobalMaxPooling1D())
        model.add(keras.layers.Dense(10, activation='relu'))
        model.add(keras.layers.Dense(1, activation='softmax'))
        
        # 添加输出层
        model.add(keras.layers.Dense(1, activation='sigmoid')) # 二分类输出层,activation可以根据问题类型进行调整
        model.compile(optimizer='adam',
                      loss='binary_crossentropy',
                      metrics=['accuracy'])
        
        return model
    

    通过添加一个输出层,您应该能够消除"Sequential model 'sequential_7' has no defined outputs yet"的错误。 如果问题仍然存在,您也可以检查X_train和y_train的维度是否正确,确保输入数据的形状与模型期望的输入形状匹配。您可以在打印y_train和X_train的形状后进行检查。

    评论

报告相同问题?

问题事件

  • 创建了问题 1月6日