Python &引用;ValueError:激活不是合法参数;使用Keras分类器
我一直在玩Tensorflow和Keras,在尝试超参数调优时,我最终遇到了以下错误: “ValueError:激活不是合法参数” 关键是,我想在我的模型中尝试不同的激活函数,看看哪一个效果最好。 我有以下代码:Python &引用;ValueError:激活不是合法参数;使用Keras分类器,python,tensorflow,keras,scikit-learn,Python,Tensorflow,Keras,Scikit Learn,我一直在玩Tensorflow和Keras,在尝试超参数调优时,我最终遇到了以下错误: “ValueError:激活不是合法参数” 关键是,我想在我的模型中尝试不同的激活函数,看看哪一个效果最好。 我有以下代码: import pandas as pd import tensorflow as tf from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import GridS
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])
如果看到,则必须将激活指定为:
来自tensorflow.keras导入激活的
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
layers.Activation()
需要一个函数或字符串,例如'sigmoid'
,但您当前正在向其传递一个数组activations
。使用索引i
(或其他索引)访问激活功能,如激活[i]
您还可以将激活作为字符串直接传递到致密层,如下所示:
model.add(tf.keras.layers.Dense(nodes, activation=activations[i], input_dim=x_train.shape[1])))
我试过了,但还是遇到同样的问题。我也必须更改激活数组吗?@IzzyGiessen:嗨,我试过了,效果很好!你确定你已经替换了所有的
激活
层吗?我想是的。有没有办法在评论中分享我的代码?