我已经完成了,只是坚持在KERAS训练我的NN模型。 这是我的情况。
我有一个文件夹,我有30个CSV文件,所有名称都不同。
现在,我正在进行分类。
注意: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)
答案 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'