【问题标题】:two errors with neural network output神经网络输出的两个错误
【发布时间】:2020-11-14 20:14:22
【问题描述】:

大家好 我制作了一个神经网络模型来预测列标签

我做了以下步骤

df=pd.read_csv('fortest.csv',low_memory=False, error_bad_lines = False)
dataset = df.values
X = dataset[:,1:8]

X.shape
min_max_scaler =MinMaxScaler()
X_scale= min_max_scaler.fit_transform(X)
X_train, X_val_and_test, Y_train, Y_val_and_test = train_test_split(X_scale, Y, test_size=0.3)
X_val, X_test, Y_val, Y_test = train_test_split(X_val_and_test, Y_val_and_test, test_size=0.5)

# then make the neural using functional API

model = keras.Sequential()
model.add(layers.Dense(6, input_dim=6, activation='relu'))
model.add(layers.Dense(3, activation='relu',kernel_regularizer=regularizers.l2(0.01)))
model.add(layers.Dense(3, activation='relu'))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(1, activation='sigmoid', name='class'))
model.compile(loss='categorical_crossentropy',loss_weights={'class':0.5}, optimizer='adam', metrics=['accuracy'])
hist = model.fit(X_train, Y_train, batch_size=3, epochs=100, validation_data=(X_val, Y_val))


plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_acc'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='lower right')
plt.show()


plt.plot(hist.history['loss'])
plt.plot(hist.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Val'], loc='upper right')
plt.show()


model.evaluate(X_test, Y_test)[1]
y_pred = model.predict(X_test)

这段代码有两个问题 首先当我运行这部分时

 plt.plot(hist.history['accuracy'])
    plt.plot(hist.history['val_acc'])
    plt.title('Model accuracy')
    plt.ylabel('Accuracy')
    plt.xlabel('Epoch')
    plt.legend(['Train', 'Val'], loc='lower right')
    plt.show()

它引发错误,因为它没有识别 Val_acc 但它看到 val_loss > 为什么会这样?

当我尝试让 Y_pred 计算精度、召回率等时 使用以下代码

 y_pred = model.predict(X_test)

它给我 y_pred 作为一个连续变量,比如 (0.093,0.933) 而不是 (0 和 1) 所以它在计算任何指标时给我错误 >> 现在任何一个为什么会出现这些错误 任何帮助将不胜感激

【问题讨论】:

    标签: python python-3.x python-2.7 keras scikit-learn


    【解决方案1】:

    1- 使用loss=model.history.history 并在此字典中检查loss.keys() 的键以查看val_acc 是否存在。

    2-您的最后一层是 sigmoid 函数,sigmoid 函数的输出是 0 到 1 之间的概率。要使其成为二进制,您可以选择 2 种方式: -model.predict_classes(X_test) -predictions=y_pred>threshold 这给了你一个真假向量,你可以在度量中使用它。阈值是可选的,取决于上下文,但您可以使用 .5 作为通用阈值。

    【讨论】:

    • 1- 我使用你的建议,但它只是 dict_keys([])
    • 2- 对于第一个建议,它会引发以下错误 AttributeError: 'Functional' object has no attribute 'predict_classes'
    • 对于第二个建议,它有效,但它将预测转换为真假
    猜你喜欢
    • 1970-01-01
    • 2015-02-23
    • 2020-03-15
    • 2019-06-05
    • 2013-09-19
    • 1970-01-01
    • 2017-11-20
    • 2017-11-21
    相关资源
    最近更新 更多