![](/img/trans.png)
[英]tensorflow,keras ValueError: Error when checking target: expected dense_3
[英]Keras ValueError: Error when checking model target: expected dense_18
我已經做完了,只是堅持在KERAS中訓練我的NN模型。 這是我的情況。
我有一個文件夾,我那里有30個CSV文件,所有名稱都不同。
現在,我正在分類。
注意: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:檢查模型目標時出錯:預期density_10具有3個維,但數組的形狀為(30,3)
標簽數組的形狀為(30,3)
,而模型則期望為(None, 5000, 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:
如果這些線形成一個序列(時間序列),並且您想以某種方式學習此序列的演變方式,那么通過LSTM
層更改Dense
層可能會獲得更好的結果。 除最后一個以外,所有這些都應使用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”一起使用時效果更好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.