簡體   English   中英

ValueError:檢查輸入時出錯:預期 conv1d_29_input 有 3 個維度,但得到了形狀為 (150, 1320) 的數組

[英]ValueError: Error when checking input: expected conv1d_29_input to have 3 dimensions, but got array with shape (150, 1320)

momentum_rate = 0.5
learning_rate = 0.1
neurons = 30

def convolutional_neural_network(x, y):
    print("Hyper-parameter values:\n")
    print('Momentum Rate =',momentum_rate,'\n')
    print('learning rate =',learning_rate,'\n')
    print('Number of neurons =',neurons,'\n')
    model = Sequential()
    #model.summary()
    model.add(Conv1D(input_shape=(X.shape[1],X.shape[0]),activation='relu',kernel_size = 1,filters = 64))
    
    model.add(Flatten())
    
    model.add(Dense(neurons,activation='relu')) # first hidden layer
    model.summary()
    model.add(Dense(neurons, activation='relu'))
    model.summary()# second hidden layer
    model.add(Dense(neurons, activation='relu'))
    model.summary()
    model.add(Dense(neurons, activation='relu'))
    model.summary()
    model.add(Dense(10, activation='softmax'))
    model.summary()
    sgd = optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=momentum_rate, nesterov=True)
    model.summary()
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy',tensorflow.keras.metrics.Precision()])
    model.summary()
    history = model.fit(X, y, validation_split=0.2, epochs=10)
    model.summary()
    print("\nTraining Data Statistics:\n")
    print("CNN Model with Relu Hidden Units and Cross-Entropy Error Function:")

print(convolutional_neural_network(X,y))

X 的形狀是 (150, 1320) y 的形狀是 (150,)

這是我得到的輸出:

Model: "sequential_36"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
conv1d_30 (Conv1D)           (None, 1320, 64)          9664      
_________________________________________________________________
flatten_21 (Flatten)         (None, 84480)             0         
_________________________________________________________________
dense_106 (Dense)            (None, 30)                2534430   
_________________________________________________________________
dense_107 (Dense)            (None, 30)                930       
_________________________________________________________________
dense_108 (Dense)            (None, 30)                930       
_________________________________________________________________
dense_109 (Dense)            (None, 30)                930       
_________________________________________________________________
dense_110 (Dense)            (None, 10)                310       
=================================================================
Total params: 2,547,194
Trainable params: 2,547,194
Non-trainable params: 0

ValueError: Error when checking input: expected conv1d_30_input to have 3 dimensions, but got array with shape (150, 1320)

Conv1D需要一個input_shape形式的(steps, input_dim)參見文檔)。 現在,如果我正確理解您的input_dim=1因為 1320 是樣本數,150 是數組的長度。 在這種情況下,更改input_shape=(X.shape[1], X.shape[2])

編輯:目前還不清楚你想做什么。 下面的代碼正在運行,並顯示了您網絡的預期形狀。 但請注意,我更改了 y 維度以匹配行數和輸出層。 我不確定 y 形狀 (150,) 代表什么。

X = tf.random.normal((1320,150,1))
y = tf.random.uniform((1320,10))

momentum_rate = 0.5
learning_rate = 0.1
neurons = 30

def convolutional_neural_network(x, y):
    print("Hyper-parameter values:\n")
    print('Momentum Rate =',momentum_rate,'\n')
    print('learning rate =',learning_rate,'\n')
    print('Number of neurons =',neurons,'\n')
    model = Sequential()
    #model.summary()
    model.add(Conv1D(input_shape=(X.shape[1], X.shape[2]),activation='relu',kernel_size = 1,filters = 64))
    
    model.add(Flatten())
    
    model.add(Dense(neurons,activation='relu')) # first hidden layer
    model.add(Dense(neurons, activation='relu'))
    model.add(Dense(neurons, activation='relu'))
    model.add(Dense(neurons, activation='relu'))
    model.add(Dense(10, activation='softmax'))
    sgd = optimizers.SGD(lr=learning_rate, decay=1e-6, momentum=momentum_rate, nesterov=True)
    model.compile(loss='categorical_crossentropy', optimizer=sgd, metrics=['accuracy'] )
    history = model.fit(X, y, validation_split=0.2, epochs=10)
    model.summary()
    print("\nTraining Data Statistics:\n")
    print("CNN Model with Relu Hidden Units and Cross-Entropy Error Function:")

print(convolutional_neural_network(X,y))

由於您的錯誤反映了您的輸入形狀是(150, 1320) 在評論中你說你有 1320 個樣本(行)和 150 個特征(列)。

讓我們制作一些具有上述形狀的臨時數據作為Xy

X = tf.random.uniform((150,1320))
y = tf.random.uniform((1320,10))  
#10 label for each sample which maybe a little strange, take care of it

現在我們有X與形狀(150,1320)y與形狀(1320,10)

由於我們有 1320 個樣本,它應該是第一個軸,我們必須將它轉置:

X = tf.transpose(X)

現在 X 形狀將是(1320,150)而不是(150,1320)

由於Conv1D 層需要輸入為batch_shape + (steps, input_dim) ,我們需要添加一個新維度。 所以:

X = tf.expand_dims(X,axis=2)
print(X.shape, y.shape)     # X.shape=(1320, 150, 1) y.shape=(1320,10)

然后,我們的 X 形狀為(1320,150,1)

現在,讓我們在Conv1D層中指定輸入形狀:

model.add(Conv1D(input_shape=(X.shape[1:]),activation='relu',kernel_size = 1,filters = 64))  

暫無
暫無

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

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