【问题标题】:"ValueError: activation is not a legal parameter" with Keras classifier带有 Keras 分类器的“ValueError:激活不是合法参数”
【发布时间】:2021-03-02 15:49:25
【问题描述】:

我一直在使用 Tensorflow 和 Keras,在尝试超参数调整时终于得到了以下错误: “ValueError:激活不是合法参数”

关键是我想在我的模型中尝试不同的激活函数,看看哪一个效果最好。 我有以下代码:

import pandas as pd 
import tensorflow as tf 
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.model_selection import GridSearchCV
import numpy as np

ds = pd.read_csv(
    "https://storage.googleapis.com/download.tensorflow.org/data/abalone_train.csv",
    names=["Length", "Diameter", "Height", "Whole weight", "Shucked weight",
           "Viscera weight", "Shell weight", "Age"])
print(ds)

x_train = ds.copy()
y_train = x_train.pop('Age')
x_train = np.array(x_train)

def create_model(layers, activations):
    model = tf.keras.Sequential()
    for i, nodes in enumerate(layers):
        if i == 0:
            model.add(tf.keras.layers.Dense(nodes, input_dim=x_train.shape[1]))
            model.add(layers.Activation(activations))
            model.add(Dropout(0.3))
        else:
            model.add(tf.keras.layers.Dense(nodes))
            model.add(layers.Activation(activations))
            model.add(Dropout(0.3))

    model.add(tf.keras.layers.Dense(units=1, kernel_initializer='glorot_uniform'))
    model.add(layers.Activation('sigmoid'))
    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
    return model

model = KerasClassifier(build_fn=create_model, verbose=0)

layers = [[20], [40,20], [45, 30, 15]]
activations = ['sigmoid', 'relu']
param_grid = dict(layers=layers, activation=activations, batch_size = [128, 256], epochs=[30])
grid = GridSearchCV(estimator=model, param_grid=param_grid, cv=5)

grid_result = grid.fit(x_train, y_train)

print(grid_result.best_score_,grid_reslult.best_params_)

pred_y = grid.predict(x_test)
y_pred = (pred_y > 0.5)

cm=confusion_matrix(y_pred, y_test)
score=accuracy_score(y_pred, y_test) 

model.fit(x_train, y_train, epochs=30, callbacks=[cp_callback])
#steps_per_epoch
model.evaluate(x_test, y_test, verbose=2)

probability_model = tf.keras.Sequential([
    model,
    tf.keras.layers.Softmax()
]) 

probability_model(x_test[:100])

【问题讨论】:

    标签: python tensorflow keras scikit-learn


    【解决方案1】:

    如果您看到here,则必须将激活指定为:

    from tensorflow.keras import activations layers.Activation(activations.relu)

    现在,你有:

    activations = ['sigmoid', 'relu']

    所以,这就是值错误的原因。

    你应该把你的代码改成这样:

    model.add(tf.keras.layers.Dense(nodes, activation=activations[i], input_dim=x_train.shape[1]))
    

    因此,删除激活层:model.add(layers.Activation(activations)),改为在每个层内使用激活。

    例子:

    def create_model(layers, activations):
        model = tf.keras.Sequential()
        for i in range(2):
            if i == 0:
                model.add(tf.keras.layers.Dense(2, activation=activations[i], input_dim=x_train.shape[1]))
                model.add(tf.keras.layers.Dropout(0.3))
            else:
                model.add(tf.keras.layers.Dense(2, activation=activations[i]))
                model.add(tf.keras.layers.Dropout(0.3))
    
        model.add(tf.keras.layers.Dense(units=1, activation='sigmoid', kernel_initializer='glorot_uniform'))
        model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
        return model
    

    【讨论】:

    • 我试过了,但我仍然遇到同样的问题。我是否也必须更改激活数组?
    • @IzzyGiessen:你好,我试过了,效果很好!你确定你已经替换了所有Activation层吗?
    • 我想是的。有没有办法在 cmets 中分享我的代码?
    【解决方案2】:

    layers.Activation() 需要一个函数或一个字符串,例如'sigmoid',但您当前正在向它传递一个数组activations。使用您的索引i(或其他索引)访问激活函数,如activations[i]

    您也可以将激活作为字符串直接传递给密集层,如下所示:

     model.add(tf.keras.layers.Dense(nodes, activation=activations[i], input_dim=x_train.shape[1])))
    

    【讨论】:

      猜你喜欢
      • 2021-05-14
      • 1970-01-01
      • 2017-11-03
      • 2018-08-14
      • 2019-01-31
      • 2019-09-16
      • 2016-12-25
      • 2019-04-02
      • 1970-01-01
      相关资源
      最近更新 更多