[英]Correct Conv1D layers shape for 2d classification data
我的数据集(我们进行二进制分类的网络流量数据集)-
X_train 和 y_train 的形状是 (45447, 25) (45447,)
我正在研究的 model -
# 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)将二维阵列重新整形为 3d -
X_train = X_train.reshape(45447,25,1)
y_train=y_train.reshape(45447,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))
我仍然无法运行我的 model ..它不断给出形状错误。 请帮助我了解 model 的形状。
我认为您必须从 input_shape 中删除批次并添加 1 作为长度或特征:
model.add(Conv1D(filters=64, kernel_size=3, activation='relu', input_shape=(n_features , 1)))
对于 output 层,使用一个带有 softmax 激活的单元密集单元是没有意义的,将 output 单元的数量更改为:
n_outputs = your_number_of_categories
input_shape
应该是X_train.shape[1:]
。 由于标签以整数形式提供,因此损失 function 应该是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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.