gpt4 book ai didi

python - Keras 值错误 : Error when checking model target: expected dense_18

转载 作者:行者123 更新时间:2023-12-01 02:26:35 24 4
gpt4 key购买 nike

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

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

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

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

注意: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)的数组

最佳答案

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

密集层仅适用于最后一个维度,所有其他维度保持不变。由于您的输入是 (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'))

选项 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”)效果更好。

关于python - Keras 值错误 : Error when checking model target: expected dense_18,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47328397/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com