Keras ValueError:检查模型目标时出错:expect dense_18

时间:2017-11-16 11:22:10

标签: python python-3.x numpy neural-network keras

我已经完成了,只是坚持在KERAS训练我的NN模型。 这是我的情况。

  1. 我有一个文件夹,我有30个CSV文件,所有名称都不同。

  2. 现在,我正在进行分类。

  3. 每个CSV文件(读取数组dfs后的5000,3,如下所示,本身就是一个训练实例,所以我有30个CSV的30个训练实例)。
  4. 文件名是标签,我想分类。这些是3个独特的标签,使用一个热编码。
  5. 我对输入形状感到困惑,以及如何以正确的形状重塑我的训练数据dfs。
  6. 注意:30个观察结果是CSV文件本身为5000,3 dim和filename是标签。

    这是我的代码和错误。

    import os
    import glob
    import pandas as pd
    import numpy as np
    from keras.preprocessing.text import one_hot
    from keras.models import Sequential
    from keras.layers import Dense
    
    path = os.getcwd()
    file_list = glob.glob(path + '/*.csv')
    dfs=np.array([pd.read_csv(fp).values for fp in file_list])
    
    dfs.shape
    # (30, 5000, 3)
    
    from sklearn.preprocessing import OneHotEncoder
    # define class labels
    
    labels = np.array([1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,3,3,3,3,3,3,3,3,3,3])
    
    onehot_encoder = OneHotEncoder(sparse=False)
    integer_encoded = labels.reshape(len(labels), 1)
    onehot_encoded = onehot_encoder.fit_transform(integer_encoded)
    
    len(onehot_encoded)
    print(onehot_encoded)
    # 30
    array([[ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  1.,  0.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.],
           [ 0.,  0.,  1.]])
    
    
    
    
    model = Sequential()
    model.add(Dense(24, input_shape=(5000,3), activation='relu'))
    model.add(Dense(8))
    model.add(Dense(3, activation='sigmoid'))
    # compile the model
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['acc'])
    
    # summarize the model
    print(model.summary())
    
    
    
    # fit the model
    model.fit(dfs, onehot_encoded, epochs=50, verbose=2)
    

    错误: ValueError:检查模型目标时出错:期望dense_10有3个维度,但得到的数组有形状(30,3)

1 个答案:

答案 0 :(得分:2)

您的标签数组的形状为(30,3),而您的模型期望它为(None, 5000, 3)。 - 始终检查model.summary()以了解形状发生了什么。

Dense图层仅适用于最后一个维度,保持所有其他维度不变。由于您的输入为(None, 5000, 3),因此所有Dense图层仅转换最后一个维度并保持5000不变。

在模型的某个时刻,您必须摆脱额外的尺寸,以便匹配您的标签(None, 3)

有许多可能性,但最佳选择取决于您希望模型如何解释数据。

选项1:

如果所有5000行完全独立且性质不同(并且模型不应该学习这些行之间的任何常见行为),您可以在模型的开头添加Flatten()图层,所以它会立即成为(None, 15000)

model.add(Flatten(input_shape=(5000,3))) #first layer in the model

选项2:

现在,如果5000行共享一些共同点,并且您的模型应该将它们视为具有相同性质的不同样本,请将Flatten()层放在最后Dense之前的model = Sequential() model.add(Dense(24, input_shape=(5000,3), activation='relu')) model.add(Dense(8)) #the flatten layer comes here: model.add(Flatten()) model.add(Dense(3, activation='sigmoid')) 层。 }。

示例:

Dense

选项3:

如果这些行正在形成序列(时间序列),并且您想以某种方式了解此序列如何演变,那么您可能会更好地将LSTM图层更改为return_sequences = True }图层。除了最后一个,所有这些都应该使用model = Sequential() model.add(LSTM(24, return_sequences=True,input_shape=(5000,3))) model.add(LSTM(8,return_sequences=True)) #here there are many possibilities as well, one of them being just another LSTM layer without return sequences: model.add(LSTM(3,return_sequences=False)) model.add(Activation('sigmoid'))

示例:

{{1}}

我在单独的图层中使用了激活功能,因为LSTM通常可以更好地使用默认激活功能,这就是' tanh'