【问题标题】:Dimension of shape in conv1Dconv1D 中的形状尺寸
【发布时间】:2017-09-09 19:55:25
【问题描述】:

我尝试构建一个具有一层的 CNN,但我遇到了一些问题。 确实,编译器告诉我

ValueError:检查模型输入时出错:预期的 conv1d_1_input 有 3 个维度,但得到了形状为 (569, 30) 的数组

这是代码

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))

【问题讨论】:

    标签: python tensorflow keras deep-learning conv-neural-network


    【解决方案1】:

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

    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))
    

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

    features    
    .8, .1, .3  
    .2, .4, .6  
    .7, .2, .1  
    

    收件人:

    [[.8
    .1
    .3],
    
    [.2,
     .4,
     .6
     ],
    
    [.7,
     .2,
     .1]]
     
    

    说明和例子

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

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

    这是一个例句:

    jack   .1   .3   -.52   |
    is     .05  .8,  -.7    |<--- kernel is `convolving` along this dimension.
    a      .5   .31  -.2    |
    boy    .5   .8   -.4   \|/
    

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

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

    在您的情况下,您会将要素视为空间维度,每个要素的长度为 1。(见下文)

    这将是您数据集中的一个示例

    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 示例设置为:

    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) 使用:

    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))
    

    这是一个可以运行的完整示例(我将使用Functional API

    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)
    

    【讨论】:

    • 如果我有维度为 1x690 的数据,并且我实现了一个带有 40 个内核大小为 3 的过滤器的 Conv1D 层,当我查看该层的权重时,它说我有 40*690*3 的权重.我不确定我明白为什么会这样,我以为我只有 40*3 的重量?它如何输出一个 1x40 的形状?
    • @parsethis,实际上,即使没有重塑 X,您的功能示例也能正常工作。只有使用顺序方法,我才能重现错误。
    【解决方案2】:

    对于稀疏矩阵,在我的情况下,行:73196,列:101 在将稀疏矩阵通过array_ = sparse_matrix.A 转换为数组后,我使用了 numpy 的 reshape 函数,然后我使用了下面的代码

    x_train_all = np.reshape(array_ , (73196, 101,1))
    

    在输入层中我使用了以下代码:

    input2 = Input(shape=(101,1), dtype='float32', name='input2')
    

    【讨论】:

      【解决方案3】:

      我有一个稀疏矩阵作为输入,所以如果不转换为通常的数组,我就无法重塑它

      解决方案是使用 keras Reshape 层:

      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'))
      ...
      

      【讨论】:

      • 只有您的支持才让我编译。所有其他答案仍会将我带到原始错误: ValueError: Error when checks model input: expected conv1d_1_input to have 3 dimensions, but got array with shape (569, 30)
      【解决方案4】:

      我在其他帖子中也提到过:

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

      xtrain.reshape(nrows, ncols, 1)
      # For conv1d statement: 
      input_shape = (ncols, 1)
      

      例如,取 iris 数据集的前 4 个特征:

      查看常用格式及其形状:

      iris_array = np.array(irisdf.iloc[:,:4].values)
      print(iris_array[:5])
      print(iris_array.shape)
      

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

      [[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)
      

      以下代码改变格式:

      nrows, ncols = iris_array.shape
      iris_array = iris_array.reshape(nrows, ncols, 1)
      print(iris_array[:5])
      print(iris_array.shape)
      

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

      [[[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)

      【讨论】:

        【解决方案5】:

        如果无法查看更多细节,您的数据在预处理后的形状不正确。
        将 X 重塑为 3 个维度:

        np.reshape(X, (1, X.shape[0], X.shape[1]))
        

        【讨论】:

        • 我的数据集由 30 个属性、2 个类和 569 个值组成。我不明白我必须在哪里重塑我的 X
        • 您的数组0s 和1s 的值也是?
        • 在 X 数组中我有属性值,在 Y 中我只有 0 和 1。X 的形状是 (569, 30) 而 Y 是 (569,)
        • 您可以在预处理步骤之后重新调整阵列(如果有的话)。 X = np.array(X).reshape(1, X.shape[0], X.shape[1])
        猜你喜欢
        • 1970-01-01
        • 2018-12-07
        • 2022-08-29
        • 2021-08-11
        • 1970-01-01
        • 2018-08-24
        • 1970-01-01
        • 2019-05-25
        • 1970-01-01
        相关资源
        最近更新 更多