簡體   English   中英

Keras ValueError:檢查模型目標時出錯:預期density_18

[英]Keras ValueError: Error when checking model target: expected dense_18

我已經做完了,只是堅持在KERAS中訓練我的NN模型。 這是我的情況。

  1. 我有一個文件夾,我那里有30個CSV文件,所有名稱都不同。

  2. 現在,我正在分類。

  3. 每個CSV文件(讀入數組dfs后的5000,3,如下所示)本身就是一個訓練實例,因此,我有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:檢查模型目標時出錯:預期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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM