【问题标题】:'Sequential' object has no attribute 'loss' - When I used GridSearchCV to tuning my Keras model“顺序”对象没有属性“损失” - 当我使用 GridSearchCV 调整我的 Keras 模型时
【发布时间】:2019-08-15 09:23:40
【问题描述】:

我正在使用tensorflowkeras构建一个简单的MNIST分类模型,我想微调我的模型,所以我选择sklearn.model_selection.GridSearchCV

但是,当我调用fit 函数时,它说:

AttributeError: 'Sequential' object has no attribute 'loss'

我将我的代码与其他人的代码进行了比较,但仍然无法弄清楚原因。唯一的区别是我使用tensorflow.keras 而不是keras

这是我的代码:

从 tensorflow.keras.models 导入顺序,模型 从 tensorflow.keras.layers 导入 Input、Dense、Activation、Dropout、BatchNormalization 从 tensorflow.keras.datasets 导入 mnist 从 tensorflow.keras.wrappers.scikit_learn 导入 KerasClassifier 从 sklearn.model_selection 导入 GridSearchCV ... ... ... def get_model(dropout_rate=0.2, hidden_​​units=512): 模型=顺序() model.add(Dropout(dropout_rate, input_shape=(28*28,))) model.add(密集(hidden_​​units,激活='relu')) model.add(BatchNormalization()) model.add(辍学(dropout_rate)) model.add(密集(hidden_​​units,激活='relu')) model.add(BatchNormalization()) model.add(辍学(dropout_rate)) model.add(密集(hidden_​​units,激活='relu')) model.add(BatchNormalization()) model.add(辍学(dropout_rate)) model.add(密集(10,激活='softmax')) 返回模型 模型 = KerasClassifier(build_fn=get_model, batch_size=128, epochs=10) para_dict = {'dropout_rate':[0.2,0.5,0.8], 'hidden_​​units':[128,256,512,1024]} clf = GridSearchCV(model, para_dict, cv=5, score='accuracy') clf.fit(x_train, y_train)

谢谢!

【问题讨论】:

  • 在您的 build_model 中,您还没有添加损失函数。这样做:model.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy'])

标签: python tensorflow keras


【解决方案1】:

上面的build_model 函数不会配置您的model 进行训练。您已添加loss 和其他参数。

您可以使用keras顺序方法compile编译模型。 https://keras.io/models/sequential/

所以你的 build_model 函数应该是:

loss = 'binary_crossentropy' #https://keras.io/optimizers
optimizer = 'adam'           #https://keras.io/losses
metrics = ['accuracy']
def get_model(dropout_rate=0.2, hidden_units=512):
    model = Sequential()
    model.add(Dropout(dropout_rate, input_shape=(28*28,)))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(hidden_units, activation='relu'))
    model.add(BatchNormalization())
    model.add(Dropout(dropout_rate))
    model.add(Dense(10, activation='softmax'))
    model.compile(optimizer = optimizer, loss = loss, metrics = metrics)
    return model

【讨论】:

  • 谢谢!但是我遇到了一个新问题,当我调用fit 函数时,我的模型可以完成训练但无法评估。新的例外是ValueError: Classification metrics can't handle a mix of multilabel-indicator and multiclass targets。我的y_trainto_categorical函数生成的onehot向量,我的loss是categorical_crossentropy,metric是accuracy。
  • 你有多标签分类问题吗? @TomLeung 因为不希望使用 softmax 进行多标签分类。您可以使用所有 keras 损失函数作为指标。喜欢metrics = ['categorical_crossentropy']。这只是一个建议。
  • 我正在处理一个 MNIST 分类问题(10 类),我的最后一层使用了softmax 激活,我的损失是categorical_crossentropy。但最后我设法通过将我的 y_train 从 onehot 向量转换为单个整数标签来运行 fit 函数。我不明白为什么sklearn 不接受 onehot 向量作为标签,也不接受使用 categorical_crossentropy 度量的线性激活和使用准确度度量的 softmax 激活之间的区别。能详细解释一下吗?
  • @NihalSangeeth 在第一层使用 drop out 听起来是不是一种最佳实践?我的意思是在第一个密集层之前?为什么不追求它?
  • 我只是在回答 OP 的问题,但可见层上的辍学并不少见,尽管我不确定这里的动机。可见层上的辍学意味着您忽略了一定百分比的输入。基本上你是在采样。
猜你喜欢
  • 2021-02-01
  • 2020-05-23
  • 1970-01-01
  • 2020-01-20
  • 1970-01-01
  • 2019-05-21
  • 1970-01-01
  • 2020-07-02
相关资源
最近更新 更多