首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >conv1D中的形状尺寸

conv1D中的形状尺寸
EN

Stack Overflow用户
提问于 2017-04-13 15:44:02
回答 5查看 56.5K关注 0票数 67

我试着建立一个只有一层的CNN,但我有一些问题。事实上,编译器告诉我

ValueError:检查模型输入时的错误:期望conv1d_1_input具有三维,但得到形状为(569,30)的数组

这是密码

代码语言:javascript
复制
import numpy
from keras.models import Sequential
from keras.layers.convolutional import Conv1D

numpy.random.seed(7)

datasetTraining = numpy.loadtxt("CancerAdapter.csv",delimiter=",")
X = datasetTraining[:,1:31]
Y = datasetTraining[:,0]
datasetTesting = numpy.loadtxt("CancereEvaluation.csv",delimiter=",")
X_test = datasetTraining[:,1:31]
Y_test = datasetTraining[:,0]

model = Sequential()
model.add(Conv1D(2,2,activation='relu',input_shape=X.shape))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X, Y, epochs=150, batch_size=5)
scores = model.evaluate(X_test, Y_test)

print("\n%s: %.2f%%" % (model.metrics_names[1], scores[1]*100))
EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2017-04-13 18:27:28

td;lr您需要重塑您的数据才能使Conv1d有意义的空间维数:

代码语言:javascript
复制
X = np.expand_dims(X, axis=2) # reshape (569, 30) to (569, 30, 1) 
# now input can be set as 
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))

本质上重塑了如下所示的数据集:

代码语言:javascript
复制
features    
.8, .1, .3  
.2, .4, .6  
.7, .2, .1  

至:

代码语言:javascript
复制
[[.8
.1
.3],

[.2,
 .4,
 .6
 ],

[.7,
 .2,
 .1]]

解释与示例

通常卷积作用于空间维数。核在产生张量的维数上“被下放”。在Conv1D的情况下,内核通过每个示例的“步骤”维度传递。

您将看到Conv1D在NLP中使用,其中steps是句子中的许多单词(填充到固定的最大长度)。这些单词将被编码为长度为4的向量。

下面是一个例句:

代码语言:javascript
复制
jack   .1   .3   -.52   |
is     .05  .8,  -.7    |<--- kernel is `convolving` along this dimension.
a      .5   .31  -.2    |
boy    .5   .8   -.4   \|/

在这种情况下,我们将输入设置为conv的方式:

代码语言:javascript
复制
maxlen = 4
input_dim = 3
model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))

在您的情况下,您将把这些特征作为空间维度来处理,每个特征的长度为1。

下面是您的数据集中的一个示例

代码语言:javascript
复制
att1   .04    |
att2   .05    |  < -- kernel convolving along this dimension
att3   .1     |       notice the features have length 1. each
att4   .5    \|/      example have these 4 featues.

我们将Conv1D示例设置为:

代码语言:javascript
复制
maxlen = num_features = 4 # this would be 30 in your case
input_dim = 1 # since this is the length of _each_ feature (as shown above)

model.add(Conv1D(2,2,activation='relu',input_shape=(maxlen, input_dim))

正如您所看到的,您的数据集必须重新调整为(569,30,1),使用:

代码语言:javascript
复制
X = np.expand_dims(X, axis=2) # reshape (569, 30, 1) 
# now input can be set as 
model.add(Conv1D(2,2,activation='relu',input_shape=(30, 1))

下面是一个可以运行的完整示例(我将使用功能API)

代码语言:javascript
复制
from keras.models import Model
from keras.layers import Conv1D, Dense, MaxPool1D, Flatten, Input
import numpy as np

inp =  Input(shape=(5, 1))
conv = Conv1D(filters=2, kernel_size=2)(inp)
pool = MaxPool1D(pool_size=2)(conv)
flat = Flatten()(pool)
dense = Dense(1)(flat)
model = Model(inp, dense)
model.compile(loss='mse', optimizer='adam')

print(model.summary())

# get some data
X = np.expand_dims(np.random.randn(10, 5), axis=2)
y = np.random.randn(10, 1)

# fit model
model.fit(X, y)
票数 135
EN

Stack Overflow用户

发布于 2018-10-19 15:06:35

我亦曾在其他职位提及这点:

要将形状(nrows, ncols)的常用特征表数据输入到Keras的Conv1d,需要执行以下两个步骤:

代码语言:javascript
复制
xtrain.reshape(nrows, ncols, 1)
# For conv1d statement: 
input_shape = (ncols, 1)

例如,采用虹膜数据集的前4个特征:

看到通常的格式及其形状:

代码语言:javascript
复制
iris_array = np.array(irisdf.iloc[:,:4].values)
print(iris_array[:5])
print(iris_array.shape)

输出显示通常的格式及其形状:

代码语言:javascript
复制
[[5.1 3.5 1.4 0.2]
 [4.9 3.  1.4 0.2]
 [4.7 3.2 1.3 0.2]
 [4.6 3.1 1.5 0.2]
 [5.  3.6 1.4 0.2]]

(150, 4)

以下代码更改了格式:

代码语言:javascript
复制
nrows, ncols = iris_array.shape
iris_array = iris_array.reshape(nrows, ncols, 1)
print(iris_array[:5])
print(iris_array.shape)

上述代码数据格式及其形状的输出:

代码语言:javascript
复制
[[[5.1]
  [3.5]
  [1.4]
  [0.2]]

 [[4.9]
  [3. ]
  [1.4]
  [0.2]]

 [[4.7]
  [3.2]
  [1.3]
  [0.2]]

 [[4.6]
  [3.1]
  [1.5]
  [0.2]]

 [[5. ]
  [3.6]
  [1.4]
  [0.2]]]

(150, 4, 1)

这对于Keras的Conv1d来说很好。对于input_shape (4,1)是必需的。

票数 8
EN

Stack Overflow用户

发布于 2019-06-05 11:55:25

我有一个稀疏矩阵作为输入,所以如果不将它转换成常规数组,我就无法重新塑造它。

解决办法是使用角面整形层:

代码语言:javascript
复制
from keras.layers.core import Reshape

...
model = Sequential()
model.add(Reshape((X.shape[1], 1), input_shape=(X.shape[1], )))
model.add(Conv1D(2,2,activation='relu'))
...
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43396572

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档