簡體   English   中英

Keras Conv1D ValueError:層順序的輸入 0 與層不兼容::預期 min_ndim=3,發現 ndim=2

[英]Keras Conv1D ValueError: Input 0 of layer sequential is incompatible with the layer: : expected min_ndim=3, found ndim=2

我有一個數據集,它不是時間序列。 每個輸入(行)是一個長度為 684 的數組/向量(它不是時間序列)。 我想在 Conv1D keras 中使用它。 但每次它都說它需要更多的維度。 你能建議一種使用 Conv1D 的方法嗎? 我想應用輸入而不依賴於以前的數據,例如時間序列。 所以我實現了一個解決方案,比如將數據條目的大小設置為 [342,2] 而不是 [684,1],但它不起作用。 我願意接受您對替代解決方案的建議和您的幫助。

當我使用密集層而不是 conv1d 時它工作正常。 實際上,我只需要以某種方式使其適應 conv1d 輸入。

舉個例子:

from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.utils import to_categorical
import time
import numpy as np
from sklearn.model_selection import train_test_split
import pandas as pd
import tensorflow as tf

verbose, epochs, batch_size = 0, 10, 100


df = pd.DataFrame(np.random.randint(0,3,(1000,685)))
x=df[df.columns[1:]] 
y=df[df.columns[1]] 


train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.15, random_state=17)

train_y = to_categorical(train_y)
test_y = to_categorical(test_y)

n_features, n_outputs = train_x.shape[1], train_y.shape[1]
    
                
model = Sequential()
#model.add(Dense(n_features, activation='relu'))
#model.add(Dropout(0.25))
model.add(tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(684,1)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Dense(50, activation= 'relu'))
model.add(Dropout(0.2))
model.add(Dense(20, activation= 'relu'))
model.add(Dropout(0.2))
model.add(Dense(n_outputs, activation='softmax'))

t=time.time()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history=model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
_, accuracy = model.evaluate(test_x, test_y, batch_size=batch_size, verbose=verbose)


print(accuracy)

它給出錯誤:ValueError:層順序的輸入0與層不兼容::預期的min_ndim = 3,發現ndim = 2。 收到的完整形狀:[無,684]

我有一個數據集,它不是時間序列。 每個輸入(行)是一個長度為 684 的數組/向量(它不是時間序列)。 我想在 Conv1D keras 中使用它。 但每次它都說它需要更多的維度。 你能建議一種使用 Conv1D 的方法嗎? 我想應用輸入而不依賴於以前的數據,例如時間序列。 所以我實現了一個解決方案,比如將數據條目的大小設置為 [342,2] 而不是 [684,1],但它不起作用。 我願意接受您對替代解決方案的建議和您的幫助。

當我使用密集層而不是 conv1d 時它工作正常。 實際上,我只需要以某種方式使其適應 conv1d 輸入。

舉個例子:

from keras.layers.convolutional import Conv1D
from keras.layers.convolutional import MaxPooling1D
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.utils import to_categorical
import time
import numpy as np
from sklearn.model_selection import train_test_split
import pandas as pd
import tensorflow as tf

verbose, epochs, batch_size = 0, 10, 100


df = pd.DataFrame(np.random.randint(0,3,(1000,685)))
x=df[df.columns[1:]] 
y=df[df.columns[1]] 


train_x, test_x, train_y, test_y = train_test_split(x, y, test_size=0.15, random_state=17)

train_y = to_categorical(train_y)
test_y = to_categorical(test_y)

n_features, n_outputs = train_x.shape[1], train_y.shape[1]
    
                
model = Sequential()
#model.add(Dense(n_features, activation='relu'))
#model.add(Dropout(0.25))
model.add(tf.keras.layers.Conv1D(filters=32, kernel_size=3, activation='relu', input_shape=(684,1)))
model.add(Dropout(0.5))
model.add(MaxPooling1D(pool_size=2))
model.add(Dense(50, activation= 'relu'))
model.add(Dropout(0.2))
model.add(Dense(20, activation= 'relu'))
model.add(Dropout(0.2))
model.add(Dense(n_outputs, activation='softmax'))

t=time.time()
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
history=model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size, verbose=verbose)
_, accuracy = model.evaluate(test_x, test_y, batch_size=batch_size, verbose=verbose)


print(accuracy)

它給出錯誤:ValueError:層順序的輸入0與層不兼容::預期的min_ndim = 3,發現ndim = 2。 收到的完整形狀:[無,684]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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