2个以上类别的Tensorflow神经网络

Posted

技术标签:

【中文标题】2个以上类别的Tensorflow神经网络【英文标题】:Tensorflow Neural Network with more than 2 categories 【发布时间】:2020-08-16 18:43:04 【问题描述】:

所以我看了一个关于 udemy 的 tensorflow 教程并决定自己尝试一下,他说如果你想要超过 2 个类别,请将激活更改为“softmax”,将单位更改为 4,因为我有 4 个不同的类别可能属于(更改从 0:1 到 1:4),如果“y”中只有 2 个不同的值,一切正常,但一旦我将其更改为 4 个单位和 4 个类别,我就会出错:

ValueError: 检查目标时出错:预期dense_3 的形状为(4,),但得到的数组的形状为(1,)

即使将其改回形状“1”也只会导致类别为真或假

我在 y 中的数据集:

import numpy as np

dataset = np.load('/Users/alex/desktop/ANN_dataset_for_brightness.npy')
X = dataset[:, 0:17]
y = dataset[:, 17:19]

for i in range (27):
    if y[i] == 400:
        y[i] = 4
    elif y[i] == 300:
        y[i] = 3
    elif y[i] == 200:
        y[i] = 2
    elif y[i] == 100:
        y[i] = 1




from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)


# Importing the Keras libraries and packages
from keras.models import Sequential
from keras.layers import Dense

# Initialising the ANN
classifier = Sequential()

# Adding the input layer and the first hidden layer // input dim for input layer
classifier.add(Dense(activation="relu", input_dim=17, units=6, kernel_initializer="uniform"))

# Adding the second hidden layer
classifier.add(Dense(activation="relu", units=6, kernel_initializer="uniform"))


这里有问题

# units = categories, softmax = more than 2
classifier.add(Dense(activation="softmax", units=4, kernel_initializer="uniform"))







# Compiling the ANN
classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])

# Fitting the ANN to the Training set
classifier.fit(X_train, y_train, batch_size = 27, nb_epoch = 100)

# Part 3 - Making the predictions and evaluating the model

# Predicting the Test set results
y_pred = classifier.predict(X_test)
y_pred = (y_pred > 0.5)

# Making the Confusion Matrix
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)

【问题讨论】:

我认为你应该一次性对标签进行编码 - 我不确定 【参考方案1】:

对于多类任务,您的 y_train 和 y_test 必须是 one-hot-encoded。这意味着它们必须具有维度 (number_of_samples, 4),其中 4 表示类的数量。

您需要在训练测试拆分之前将 tensorflow.keras.utils.to_categorical 应用于它们。

y = to_categorical(y, 4)

参考:https://www.tensorflow.org/api_docs/python/tf/keras/utils/to_categorical

【讨论】:

tf.keras.utils.to_categorical(y, 4) 和 y = tf.keras.utils.to_categorical(y, 4) 带来:索引 4 超出轴 1 的范围,大小为 4 y 的形状是什么(在 to_categorical 之前)? y = tf.keras.utils.to_categorical(y, num_classes=None, dtype='float64') 所以“无”类工作正常

以上是关于2个以上类别的Tensorflow神经网络的主要内容,如果未能解决你的问题,请参考以下文章

基于 Tensorflow 2.x 实现多层卷积神经网络,实践 Fashion MNIST 服装图像识别

基于 Tensorflow 2.x 实现多层卷积神经网络,实践 Fashion MNIST 服装图像识别

基于 Tensorflow 2.x 实现多层卷积神经网络,实践 Fashion MNIST 服装图像识别

TensorFlow 卷积神经网络--卷积层

使用tensorflow创建一个简单的神经网络

前馈神经网络练习:使用tensorflow进行葡萄酒种类识别