当前位置: 首页 > 知识库问答 >
问题:

使用Keras的同一神经网络进行分类和回归

薛弘济
2023-03-14

我想构建一个神经网络,同时输出一个分类标签和一个回归值。我想使用Keras来做到这一点。现在我的代码仅用于分类:

 mdl = Sequential()
 mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
 mdl.add(Dense(200, activation='relu'))
 mdl.add(Dense(100, activation='relu'))
 mdl.add(Dense(6, activation='softmax'))

 mdl.compile(loss='categorical_crossentropy', optimizer='sgd', metrics=['accuracy'])

 # early stopping implementation
 filepath="weights.best.hdf5"
 checkpoint = ModelCheckpoint(filepath, monitor='val_acc', verbose=1, 
 save_best_only=True, mode='max')
 early_stop = EarlyStopping(monitor='val_acc', patience=100, mode='max') 
 callbacks_list = [checkpoint, early_stop]


 # fit network
 history = mdl.fit(X_train, y_train, epochs=2000, batch_size=32, 
 validation_split=0.2, verbose=2, shuffle=True, callbacks=callbacks_list)

现在我在输出层上有一个softmax激活函数,对应于我用于分类的概率。如何修改此代码以同时输出表示回归问题的continuos值。我知道Keras函数API允许指定多输入和多输出网络。谁知道我该怎么做?

共有1个答案

伯洋
2023-03-14

您的代码可以直接转换为Keras函数API,如他们的文档所示。您需要更改顺序声明

mdl = Sequential()
mdl.add(Dense(100, activation='relu', input_dim=X_train.shape[1]))
mdl.add(Dense(200, activation='relu'))
mdl.add(Dense(100, activation='relu'))
mdl.add(Dense(6, activation='softmax'))

与其功能等效:

inputs = Input(shape=(X_train.shape[1],))
layer1 = Dense(100, activation='relu')(inputs)
layer2 = Dense(200, activation='relu')(layer1)
layer3 = Dense(100, activation='relu')(layer2)
classifier = Dense(6, activation='softmax')(layer3)
mdl = Model(inputs=inputs, outputs=classifier)

(通常人们只是对所有中间层重复使用相同的变量,甚至在文档示例中也会这样做,但这个IMHO更清楚一些)。

完成后,可以添加另一个输出层,该输出层从最后一个密集层3“分支”,并设置模型有两个输出,例如:

regression = Dense(1, activation='linear')(layer3)
mdl = Model(inputs=inputs, outputs=[classifier, regression])
 类似资料:
  • 鸟类启发人类飞翔,东洋参启发了魔术贴的发明,大自然启发人类实现了无数发明创造。通过研究大脑来制造智能机器,也符合这个逻辑。人工神经网络(ANN)就是沿着这条逻辑诞生的:人工神经网络是受大脑中的生物神经元启发而来的机器学习模型。但是,虽然飞机是受鸟儿启发而来的,飞机却不用挥动翅膀。相似的,人工神经网络和生物神经元网络也是具有不同点的。一些研究者甚至认为,应该彻底摒弃这种生物学类比:例如,用“单元”取

  • 我正在建立一个分类神经网络,以便对两个不同的类进行分类。 所以这是一个二元分类问题,我正尝试用一个前馈神经网络来解决这个任务。 但是网络是不能学习的,事实上,在训练过程中,网络的精度是不变的。 具体而言,数据集由以下人员组成: 65673行22列。 其中一列是具有值(0,1)的目标类,而其他21列是预测器。数据集是这样平衡的: null 可以看到也有NaN值,但我不能删除它,因为在其他列中有值0是

  • 我用两个输出神经元会得到更好的结果吗?(一个激活为“是音乐”,另一个激活为“不是音乐”)。 (您可以在这里看到这方面的C++源代码:https://github.com/mcmenaminadrian/musonet--尽管在任何给定的时间,公开回购中的内容可能并不完全是我在机器上使用的内容。)

  • 我正在建立一个简单的神经网络。数据是一个231长的向量,它是一个热编码的向量。每个231个长向量被分配一个8个长的热编码标签。 到目前为止,我的代码是: 问题是输出层是8个单位,但是我的标签不是单个单位,它们是一个热编码的8个长矢量。如何将此表示为输出? 错误消息是: 无法用非浮点dtype构建密集层 完全回溯:

  • 我经常读到,前馈和递归神经网络(RNNs)之间存在着根本的区别,这是由于前馈网络缺乏内部状态和短期记忆。乍一看,我觉得这似乎有理。 然而,当学习一个递归神经网络的反向传播通过时间算法时,递归网络转化为等价的前馈网络,如果我理解正确的话。 这就意味着,事实上没有根本的区别。为什么RNN在某些任务(图像识别、时间序列预测等)中比深度前馈网络表现得更好?

  • 文本分类是自然语言处理的一个常见任务,它把一段不定长的文本序列变换为文本的类别。本节关注它的一个子问题:使用文本情感分类来分析文本作者的情绪。这个问题也叫情感分析,并有着广泛的应用。例如,我们可以分析用户对产品的评论并统计用户的满意度,或者分析用户对市场行情的情绪并用以预测接下来的行情。 同搜索近义词和类比词一样,文本分类也属于词嵌入的下游应用。在本节中,我们将应用预训练的词向量和含多个隐藏层的双