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

沿单特征行的Keras卷积

倪振海
2023-03-14

我有一个多类分类问题。假设我有一个特征矩阵:

A   B C D
1  -1 1 -6
2 0.5 0 11
7 3.7 1 1
4 -50 1 0

和标签:

LABEL
0
1
2
0
2

我想尝试使用Keras沿每个特征行应用卷积核。假设nb\u filter=2,batch\u size=3。所以我希望卷积层的输入形状是(3,4),输出形状是(3,3)(因为它适用于AB、BC、CD)。

下面是我对Keras的尝试(v1.2.1,Theano后端):

def CreateModel(input_dim, num_hidden_layers):
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Convolution1D, Flatten

    model = Sequential()
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    model.summary()
    return model

def OneHotTransformation(y):
    from keras.utils import np_utils
    return np_utils.to_categorical(y)

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]),
y_train = OneHotTransformation(y_train)

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500)

clf.fit(X_train, y_train)

形状:

print X_train.shape
print X_test.shape
print y_train.shape

输出:

(45561, 44)
(11391, 44)
(45561L,)

当我尝试运行此代码时,我得到和异常:

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (45561L, 3L)

我试图重塑y\U列车:

y_train = y_train.reshape(y_train.shape[0], 1, y_train.shape[1])

这给了我例外:

ValueError: Error when checking model target: expected dense_1 to have 3 dimensions, but got array with shape (136683L, 2L)
  1. 这种使用卷积1D的方法是否正确以实现我的目标?
  2. 如果#1是是,我如何修复我的代码?

我已经在这里阅读了许多github问题和一些问题(1、2),但它并没有真正起到帮助作用。

谢谢

更新1:根据马蒂亚斯·瓦尔登格罗的评论。以下是重塑“X”后和“y”一次编码后的形状:

print X_train.shape
print X_test.shape
print y_train.shape

输出:

(45561L, 1L, 44L)
(11391L, 1L, 44L)
(45561L, 3L)

更新2:再次感谢马蒂亚斯·瓦尔登格罗。X整形是在创建模型后完成的,以确保这是一个复制粘贴问题。代码应该如下所示:

def CreateModel(input_dim, num_hidden_layers):
    from keras.models import Sequential
    from keras.layers import Dense, Dropout, Convolution1D, Flatten

    model = Sequential()
    model.add(Convolution1D(nb_filter=10, filter_length=1, input_shape=(1, input_dim), activation='relu'))
    model.add(Dense(3, activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    model.summary()
    return model

def OneHotTransformation(y):
    from keras.utils import np_utils
    return np_utils.to_categorical(y)

clf = KerasClassifier(build_fn=CreateModel, input_dim=X_train.shape[1], num_hidden_layers=1, nb_epoch=10, batch_size=500)

X_train = X_train.values.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.values.reshape(X_test.shape[0], 1, X_test.shape[1]),
y_train = OneHotTransformation(y_train)

clf.fit(X_train, y_train)

共有1个答案

夏侯旻
2023-03-14

一维卷积的输入应具有维度(num\u采样、通道、宽度)。因此,这意味着您需要重塑X\U列和X\U测试,而不是y\U列:

X_train = X_train.reshape(X_train.shape[0], 1, X_train.shape[1])
X_test = X_test.reshape(X_test.shape[0], 1, X_test.shape[1])
 类似资料:
  • 我当前的Cucumber文件如下所示: 所以现在我想再添加几个场景,可能是在同一个文件中进行API测试。所以我想为此创建一个新特性,而不是使用Feature:Test Online application页面。这样我就不需要为API测试创建单独的特性文件。

  • 我的情况是,我希望一些对象实现一个特征,比如说“基本”,而其他一些对象将实现一个特征“超级”。Super trait还必须是< code>T : Base的泛型,这样我就可以根据它所专用的Base自动实现Super的各个部分。现在,这似乎可以很好地处理下面的小例子 我的问题与我的下一个要求有关,那就是我希望能够存储实现Super的对象向量,而不管它专门用于哪个Base。我的想法是创建一个涵盖所有超

  • 我读过这篇文章http://www.codeproject.com/Articles/143059/Neural-Network-for-Recognition-of-Handwritten-Di当我转到这个:第0层:是MNIST数据库中手写字符的灰度图像,填充到29x29像素。输入层有29x29=841个神经元。图层#1:是一个包含六(6)个要素地图的卷积图层。从第1层到前一层有13x13x6=

  • 我有以下简单的数据集。它由9个特征组成,是一个二元分类问题。特征向量的示例如下所示。每行都有相应的0,1标签。 我知道CNN被广泛用于图像分类,但我正试图将其应用于我手头的数据集。我正在尝试应用5个大小为2的过滤器。鉴于这些数据的形状,我一直致力于以正确的方式构建网络。这是我构建网络的功能。 最后,我还将调用一个测试函数来测试我创建的模型的准确性。下面的函数试图实现这一点 当我建立模型并通过训练函

  • 我在Keras有卷积神经网络。我需要知道每个图层中要素地图的尺寸。我的输入是28 x 28像素的图像。我知道有一种计算方法,但我不知道如何计算。下面是我使用Keras的代码片段。 最后,这就是我想画的。非常感谢。

  • 我正在使用卷积自动编码器。我的autoenoder配置有一个带stride(2,2)或avg pooling和relu激活的卷积层和一个带stride(2,2)或avg Unmooling和relu激活的反卷积层。 我用MNIST数据集训练自动编码器。 当我在第一个卷积层(20个过滤器,过滤器大小为3)后查看特征图时,我得到了一些黑色特征图,而学习到的过滤器不是黑色的。如果更改过滤器数量或过滤器大