【问题标题】:Keras ValueError: Error when checking model target: expected dense_18Keras ValueError:检查模型目标时出错:预期的dense_18
【发布时间】:2018-04-29 22:00:33
【问题描述】:

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

  1. 我有一个文件夹,里面有 30 个 CSV 文件,名称各不相同。

  2. 现在,我正在做分类。

  3. 每个 CSV 文件(如下所示读取数组 dfs 后的 5000,3 本身就是一个训练实例,因此我有 30 个训练实例用于 30 个 CSV)。
  4. 文件名是标签,我要分类。这些是 3 个唯一标签,使用一种热编码。
  5. 我对输入形状以及如何将我的训练数据 dfs 重塑为正确形状感到困惑。

注意:30 个观察值本身是 5000 个 CSV 文件,3 个暗淡,文件名是标签。

这是我的代码和错误。

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)

【问题讨论】:

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


    【解决方案1】:

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

    密集层仅在最后一个维度上起作用,而其他所有维度都保持不变。由于您的输入是(None, 5000, 3),因此您所有的密集层都只转换最后一个维度,而保持 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'))
    

    选项 3:

    如果这些线形成一个序列(时间序列),并且您想以某种方式了解这个序列是如何演变的,那么将Dense 层更改为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'))
    

    我在单独的层中使用了激活,因为 LSTM 通常在使用默认激活(即“tanh”)时效果更好。

    【讨论】:

    • 我想,你给了我很好的信息,我也有同样的期待。我做了选项1,它看起来不错。我不确定,如何用他们的输入参数做第二部分和第三部分。我对您的 LSTM 想法非常感兴趣,是的,我的数据与时间有关。请你写下那个块让我解释一下。我会成为这个星球上最幸福的人。谢谢
    • 非常感谢丹尼尔。这太好了。是的,我肯定会将此标记为正确的。只是一个问题,因为我使用一个 CSV 文件作为一个训练集 (5000,3) 维度。这个模型是理解这部分吗?我只有 30 个训练实例或 30 个 CSV 文件。请在评论中对我说“是”时查看我的问题。我只是在等那个。因为培训可能需要几个小时。我想立即将其标记为正确。还有什么选择吗,我可以保存所有这些权重并再次加载我的模型以从该保存的文件中进行测试。
    • 是的。当您的输入形状像(30,5000,3) 时,您使用input_shape=(5000,3) 是正确的。该模型将看到:30 independent sequences5000 time steps in each sequence3 input vars/features for each time step
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-07
    • 2018-07-25
    相关资源
    最近更新 更多