【问题标题】:Correct Conv1D layers shape for 2d classification data为 2d 分类数据正确的 Conv1D 层形状
【发布时间】:2021-08-09 16:03:25
【问题描述】:

我的数据集(我们进行二进制分类的网络流量数据集)-

X_train 和 y_train 的形状是 (45447, 25) (45447,)

我正在研究的模型-

# fit and evaluate a model
import tensorflow as tf
def evaluate_model(X_train, y_train,X_test,y_test):

  X_train = X_train.reshape(45447,25,1)
  y_train=y_train.reshape(45447,1)
  verbose=0
  epochs=10
  batch_size = 32
  n_timesteps = X_train.shape[0]
  n_features= X_train.shape[1]
  print(n_timesteps,n_features)
  n_outputs = 1
  model = Sequential()
  model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_timesteps,n_features)))
  model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
  model.add(Dropout(0.5))
  model.add(MaxPooling1D(pool_size=2))
  model.add(Flatten())
  model.add(Dense(100, activation='relu'))
  model.add(Dense(n_outputs, activation='softmax'))
  model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  # fit network
  #train_data = tf.data.Dataset.from_tensor_slices((X_train, y_train))
  #valid_data = tf.data.Dataset.from_tensor_slices((X_test, y_test))

  model.fit(X_train, y_train,epochs=10, batch_size=32, verbose=0)
      # evaluate model
  #_, accuracy = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
  

# summarize scores
def summarize_results(scores):
    print(scores)
    m, s = mean(scores), std(scores)
    print('Accuracy: %.3f%% (+/-%.3f)' % (m, s))

# run an experiment
def run_experiment(repeats=10):
    # load data
    
    # repeat experiment
    scores = list()
    for r in range(repeats):
        score = evaluate_model(X_train, y_train,X_test,y_test)
        score = score * 100.0
        print('>#%d: %.3f' % (r+1, score))
        scores.append(score)
    # summarize results
    summarize_results(scores)

# run the experiment
run_experiment()

我尝试过的-

1)我尝试将 pandas 数据变成 numpy

2)将 2d 数组重新整形为 3d -

X_train = X_train.reshape(45447,25,1)
y_train=y_train.reshape(45447,1,1)
  1. 把数据做成tf对象-

    train_data = tf.data.Dataset.from_tensor_slices((X_train, y_train)) valid_data = tf.data.Dataset.from_tensor_slices((X_test, y_test))

我仍然无法运行我的模型..它不断给出形状错误。请帮我理解要给模型的形状。

【问题讨论】:

    标签: python tensorflow machine-learning keras


    【解决方案1】:

    我认为您必须从 input_shape 中删除批次并添加 1 作为长度或特征:

    model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_features , 1)))
    

    对于输出层,用softmax激活的一个unitdense cell是没有意义的,把输出单元的个数改成:

     n_outputs = your_number_of_categories
    

    【讨论】:

      【解决方案2】:

      input_shape 应该是 X_train.shape[1:]。损失函数应为sparse_categorical_accuracy,因为标签以整数形式提供。

      def evaluate_model(X_train, y_train,X_test,y_test):
      
        X_train = X_train.reshape(45447,25,1)
        y_train=y_train.reshape(45447,1)
        verbose=0
        epochs=10
        batch_size = 32
        n_outputs = 2
        model = Sequential()
        model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=X_train.shape[1:]))
        model.add(Conv1D(filters=64, kernel_size=3, activation='relu'))
        model.add(Dropout(0.5))
        model.add(MaxPooling1D(pool_size=2))
        model.add(Flatten())
        model.add(Dense(100, activation='relu'))
        model.add(Dense(n_outputs, activation='softmax'))
        model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
        # fit network
        model.fit(X_train, y_train,epochs=10, batch_size=32, verbose=0)
        # evaluate model
        _, accuracy = model.evaluate(X_test, y_test, batch_size=batch_size, verbose=0)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2020-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多