【问题标题】:1D CNN Model using CSV File使用 CSV 文件的一维 CNN 模型
【发布时间】:2022-01-18 09:18:34
【问题描述】:

我正在研究使用质谱数据来构建 CNN 模型。我有 5 个不同的类,每个数据集有 2300 个读数。我确实需要一些帮助来检查我所做的是否正确以及方向是否正确!我附上了一张关于数据在 excel 上的样子的图片。 [excel数据:https://i.stack.imgur.com/b6Zot.png] 代码中添加了一些问题作为cmets,如果有人可以帮忙解释一下!

导入库和数据集

import numpy as np
import pandas as pd
import tensorflow as tf
dataset = pd.read_csv('CAP.data.csv')
X = dataset.iloc[:, :-1].values
y = dataset.iloc[:, -1].values
print(X.shape)
print(y.shape)

拆分训练和测试集

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
import keras
from keras.layers import Conv1D
from keras.layers import Dense, Activation, Flatten, Conv1D, Dropout, BatchNormalization, MaxPooling1D, LeakyReLU

ms_input_shape = (2300,3) #Could someone suggest how I should set the input shape to be?

model = keras.models.Sequential()
model.add(Conv1D(filters=6, kernel_size=21, strides=1, padding='same', activation='relu', input_shape= ms_input_shape,kernel_initializer=keras.initializers.he_normal()))
model.add(BatchNormalization()) #what is the purpose of this!
model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
model.add(Conv1D(filters=16, kernel_size=5, strides=1, padding='same',activation='relu'))
model.add(BatchNormalization())
model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
model.add(Flatten())
model.add(Dense(120, activation='relu'))
model.add(Dense(84))
model.add(Dense(5, activation='softmax'))
model.summary()

结果:

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv1d (Conv1D)             (None, 2300, 6)           384       
                                                                 
 batch_normalization (BatchN  (None, 2300, 6)          24        
 ormalization)                                                   
                                                                 
 max_pooling1d (MaxPooling1D  (None, 1150, 6)          0         
 )                                                               
                                                                 
 conv1d_1 (Conv1D)           (None, 1150, 16)          496       
                                                                 
 batch_normalization_1 (Batc  (None, 1150, 16)         64        
 hNormalization)                                                 
                                                                 
 max_pooling1d_1 (MaxPooling  (None, 575, 16)          0         
 1D)                                                             
                                                                 
 flatten (Flatten)           (None, 9200)              0         
                                                                 
 dense (Dense)               (None, 120)               1104120   
                                                                 
 dense_1 (Dense)             (None, 84)                10164     
                                                                 
 dense_2 (Dense)             (None, 5)                 425       
                                                                 
=================================================================
Total params: 1,115,677
Trainable params: 1,115,633
Non-trainable params: 44

为什么有 44 个不可训练的参数?

model.compile(optimizer=tf.keras.optimizers.Adam(),loss='categorical_crossentropy',metrics=['acc'])


callbacks_list = [
    keras.callbacks.ModelCheckpoint(
        filepath='best_model.{epoch:02d}-{val_loss:.2f}.h5',
        monitor='val_loss', save_best_only=True),
    keras.callbacks.EarlyStopping(monitor='acc', patience=1)]

BATCH_SIZE = 32 #I am not sure what batch size should I set for my case?
EPOCHS = 20

history = model.fit(X_train,
                    y_train,
                    batch_size=BATCH_SIZE,
                    epochs=EPOCHS,
                    callbacks=callbacks_list,
                    validation_split=0.2,
                    verbose=1)

我在运行历史记录中遇到了这个错误

ValueError: Exception encountered when calling layer "sequential_2" (type Sequential).
Input 0 of layer "conv1d_4" is incompatible with the layer: expected min_ndim=3, found ndim=2. Full shape received: (None, 2300)
Call arguments received:• inputs=tf.Tensor(shape=(None, 2300), dtype=float32) • training=True • mask=None

有人可以建议吗?

【问题讨论】:

    标签: python tensorflow machine-learning keras deep-learning


    【解决方案1】:

    Conv1D 期望输入形状为 3+D 的张量,形状为:batch_shape + (steps, input_dim)

    您需要为输入形状添加额外的尺寸。

    工作示例代码

    #from sklearn.model_selection import train_test_split
    #X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)
    from tensorflow import keras
    from tensorflow.keras.layers import Conv1D
    from tensorflow.keras.layers import Dense, Activation, Flatten, Conv1D, Dropout, BatchNormalization, MaxPooling1D, LeakyReLU
    import numpy as np
    
    ms_input_shape = (10,2300,3) #Could someone suggest how I should set the input shape to be?
    X_train = np.random.random((10,2300,3))
    y_train = np.random.random((10, 5))
    
    model = keras.models.Sequential()
    #model.add(tf.keras.layers.InputLayer())
    model.add(Conv1D(filters=6, kernel_size=21, strides=1, padding='same', activation='relu',input_shape= ms_input_shape[1:],kernel_initializer=keras.initializers.he_normal()))
    model.add(BatchNormalization()) #what is the purpose of this!
    model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
    model.add(Conv1D(filters=16, kernel_size=5, strides=1, padding='same',activation='relu'))
    model.add(BatchNormalization())
    model.add(MaxPooling1D(pool_size=2, strides=2, padding='same'))
    model.add(Flatten())
    model.add(Dense(120, activation='relu'))
    model.add(Dense(84))
    model.add(Dense(5, activation='softmax'))
    model.summary()
    

    输出

    Model: "sequential_1"
    _________________________________________________________________
     Layer (type)                Output Shape              Param #   
    =================================================================
     conv1d_5 (Conv1D)           (None, 2300, 6)           384       
                                                                     
     batch_normalization_5 (Batc  (None, 2300, 6)          24        
     hNormalization)                                                 
                                                                     
     max_pooling1d_3 (MaxPooling  (None, 1150, 6)          0         
     1D)                                                             
                                                                     
     conv1d_6 (Conv1D)           (None, 1150, 16)          496       
                                                                     
     batch_normalization_6 (Batc  (None, 1150, 16)         64        
     hNormalization)                                                 
                                                                     
     max_pooling1d_4 (MaxPooling  (None, 575, 16)          0         
     1D)                                                             
                                                                     
     flatten_1 (Flatten)         (None, 9200)              0         
                                                                     
     dense_3 (Dense)             (None, 120)               1104120   
                                                                     
     dense_4 (Dense)             (None, 84)                10164     
                                                                     
     dense_5 (Dense)             (None, 5)                 425       
                                                                     
    =================================================================
    Total params: 1,115,677
    Trainable params: 1,115,633
    Non-trainable params: 44
    ___________________________
    

    模型训练

    import tensorflow as tf
    model.compile(optimizer=tf.keras.optimizers.Adam(),loss='categorical_crossentropy',metrics=['acc'])
    
    
    callbacks_list = [
        keras.callbacks.ModelCheckpoint(
            filepath='best_model.{epoch:02d}-{val_loss:.2f}.h5',
            monitor='val_loss', save_best_only=True),
        keras.callbacks.EarlyStopping(monitor='acc', patience=1)]
    
    BATCH_SIZE = 32 #I am not sure what batch size should I set for my case?
    EPOCHS = 20
    
    history = model.fit(X_train,
                        y_train,
                        batch_size=BATCH_SIZE,
                        epochs=EPOCHS,
                        callbacks=callbacks_list,
                        validation_split=0.2,
                        verbose=1)
    

    输出

    Epoch 1/20
    1/1 [==============================] - 3s 3s/step - loss: 5.9319 - acc: 0.1250 - val_loss: 6.6557 - val_acc: 1.0000
    Epoch 2/20
    1/1 [==============================] - 0s 53ms/step - loss: 16.2454 - acc: 0.5000 - val_loss: 6.8568 - val_acc: 0.5000
    Epoch 3/20
    1/1 [==============================] - 0s 45ms/step - loss: 14.0361 - acc: 0.5000 - val_loss: 6.9775 - val_acc: 1.0000
    

    【讨论】:

      猜你喜欢
      • 2020-03-09
      • 2020-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2020-10-31
      • 1970-01-01
      • 2023-03-30
      相关资源
      最近更新 更多