我的資料(重塑后):
X_train= numpy_array,形狀:(21000, 2297, 1)X_val= numpy_array,形狀:(9000, 2297, 1)
兩個陣列都包含時間序列。由于填充,所有時間序列的長度均為 2297。
我的模型:
model = keras.Sequential()
model.add(Conv1D(32, 2, activation='relu', input_shape=(2297, 1))) # input_shape = (n_columns, 1)
model.add(Dropout(0.2))
model.add(Conv1D(256, 2, activation='relu'))
model.add(Dropout(0.2))
model.add(Conv1D(32, 2, activation='relu'))
model.add(Flatten())
model.add(Dense(1))
model.compile(optimizer=Adam(learning_rate = 0.001), loss = 'mse', metrics = ['mae', 'mse'])
model.summary()
history = model.fit(X_train, y_train, epochs=10, validation_data=(X_val, y_val), verbose=1)
我的問題:
如果我保持上述input_shape()陳述,模型運行良好,但需要很長時間才能訓練。我猜,這是因為不傳遞批次大小會使模型使用全批次。那正確嗎?
我想傳遞一個批量大小,以便在每個步驟中只對我的一小部分資料進行網路訓練。根據這篇文章和這篇文章,我的資料的正確輸入順序是:
input_shape=(batch size, time steps, 1)
但是,假設我想要的批量大小 = 1000。然后,我的第一個 Conv1D 層如下所示(模型的其余部分保持如上所示):
model = keras.Sequential()
model.add(Conv1D(32, 2, activation='relu', input_shape=(1000, 2297, 1))) # input_shape = (batch_size, n_columns, 1) ...
并引發以下錯誤:
ValueError: Input 0 of layer conv1d_3 is incompatible with the layer: expected ndim=3, found ndim=4. Full shape received: [None, 1000, 2297, 1]
為什么會這樣,如何正確傳遞批量大小?
uj5u.com熱心網友回復:
在撰寫代碼的第一個版本中,您撰寫正確。
如何正確傳遞批量大小?
我們不需要傳遞我們batch_size的input_shape模型。我們可以batch_size在model.fit(..., batch_size=1000).
如果您的模型需要很長時間才能訓練:
- 確保訓練你的模型
GPU. - 您可以使用較小的 filter_size。(您
filter=256在第二個 Conv1d 層中使用。我只使用 filter = 16 或 32) - 您可以使用更大的步幅。(在 Conv1D 中,
strides=1默認情況下。我使用 strides = 2) - 您可以使用較小的 kernel_size。(你使用
kernel_size=2它就可以了。)
完整代碼:(訓練時間為 10 epochs -> 10 sec)
import tensorflow as tf
import numpy as np
X_train = np.random.rand(21000,2297,1)
y_train = np.random.randint(0,2,21000)
X_val = np.random.rand(9000,2297,1)
y_val = np.random.randint(0,2,9000)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Conv1D(filters = 16,
kernel_size = 2,
strides = 2,
activation='relu', input_shape=(2297, 1)))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(filters = 32,
kernel_size = 2,
strides = 2,
activation='relu'))
model.add(tf.keras.layers.Dropout(0.2))
model.add(tf.keras.layers.Conv1D(16, 2, activation='relu'))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(1))
model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.001),
loss = 'mse', metrics = ['mae', 'mse'])
model.summary()
history = model.fit(X_train, y_train,
batch_size=128,
epochs=10,
validation_data=(X_val, y_val),
verbose=1)
輸出:
Model: "sequential_8"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv1d_21 (Conv1D) (None, 1148, 16) 48
dropout_12 (Dropout) (None, 1148, 16) 0
conv1d_22 (Conv1D) (None, 574, 32) 1056
dropout_13 (Dropout) (None, 574, 32) 0
conv1d_23 (Conv1D) (None, 573, 16) 1040
flatten_6 (Flatten) (None, 9168) 0
dense_6 (Dense) (None, 1) 9169
=================================================================
Total params: 11,313
Trainable params: 11,313
Non-trainable params: 0
_________________________________________________________________
Epoch 1/10
165/165 [==============================] - 3s 13ms/step - loss: 0.2608 - mae: 0.5008 - mse: 0.2608 - val_loss: 0.2747 - val_mae: 0.4993 - val_mse: 0.2747
Epoch 2/10
165/165 [==============================] - 2s 13ms/step - loss: 0.2521 - mae: 0.4991 - mse: 0.2521 - val_loss: 0.2865 - val_mae: 0.4993 - val_mse: 0.2865
Epoch 3/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2499 - mae: 0.4969 - mse: 0.2499 - val_loss: 0.2988 - val_mae: 0.4991 - val_mse: 0.2988
Epoch 4/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2484 - mae: 0.4952 - mse: 0.2484 - val_loss: 0.2850 - val_mae: 0.4993 - val_mse: 0.2850
Epoch 5/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2481 - mae: 0.4926 - mse: 0.2481 - val_loss: 0.2650 - val_mae: 0.5001 - val_mse: 0.2650
Epoch 6/10
165/165 [==============================] - 2s 9ms/step - loss: 0.2457 - mae: 0.4899 - mse: 0.2457 - val_loss: 0.2824 - val_mae: 0.4998 - val_mse: 0.2824
Epoch 7/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2432 - mae: 0.4856 - mse: 0.2432 - val_loss: 0.2591 - val_mae: 0.5005 - val_mse: 0.2591
Epoch 8/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2426 - mae: 0.4824 - mse: 0.2426 - val_loss: 0.2649 - val_mae: 0.5009 - val_mse: 0.2649
Epoch 9/10
165/165 [==============================] - 2s 10ms/step - loss: 0.2392 - mae: 0.4781 - mse: 0.2392 - val_loss: 0.2693 - val_mae: 0.5009 - val_mse: 0.2693
Epoch 10/10
165/165 [==============================] - 1s 9ms/step - loss: 0.2366 - mae: 0.4733 - mse: 0.2366 - val_loss: 0.2688 - val_mae: 0.5012 - val_mse: 0.2688
筆記:
- 我使用亂數作為輸入。
Samples = 21000,batch_size=128-> 每個時期的訓練樣本 =21000/128 = 164.06 ~= 165
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/487680.html
上一篇:Errno2沒有這樣的檔案或目錄
