python - 1D CNN keras 形状错误
问题描述
我正在尝试将一维 CNN 拟合到我的数据中。数据由 MEL 频率组成,具有以下特征:
X_train.shape = (68251, 99)
y_train_hot.shape = (68251, 35)<-- one hot encoding with 35 output classes
当我尝试训练模型时,我收到以下代码的此值错误:
ValueError: Error when checking input: expected conv1d_5_input to have 3 dimensions, but got array with shape (68251, 99)
#hyperparameters
input_dimension = 68251
learning_rate = 0.0025
momentum = 0.85
hidden_initializer = random_uniform(seed=1)
dropout_rate = 0.2
# create model
model = Sequential()
model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=X_train.shape, activation='relu'))
model.add(Convolution1D(nb_filter=16, filter_length=1, activation='relu'))
model.add(Flatten())
model.add(Dropout(dropout_rate))
model.add(Dense(128, input_dim=input_dimension, kernel_initializer=hidden_initializer, activation='relu'))
model.add(Dropout(dropout_rate))
model.add(Dense(64, kernel_initializer=hidden_initializer, activation='relu'))
model.add(Dense(2, kernel_initializer=hidden_initializer, activation='softmax'))
sgd = SGD(lr=learning_rate, momentum=momentum)
model.compile(loss='binary_crossentropy', optimizer=sgd, metrics=['acc'])
model.fit(X_train, y_train_hot, epochs=5, batch_size=128)
predictions = model.predict_proba(X_test)
ans = pd.DataFrame(predictions)
ans = ans[0]
当我将 X_train 和 X_test 分别重塑为 (68251, 99, 1) 和 (17063, 99, 1) 时,出现以下错误:
ValueError: Input 0 is incompatible with layer conv1d_7: expected ndim=3, found ndim=4
解决方案
编辑
这次我实际上编译了你的模型,发现了一些问题并纠正了它们:
# create model
model = Sequential()
model.add(Convolution1D(nb_filter=32, filter_length=3, input_shape=(99, 1), activation='relu'))
model.add(Convolution1D(nb_filter=16, filter_length=1, activation='relu'))
model.add(Flatten())
model.add(Dropout(0.2))
model.add(Dense(128, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(64, activation='relu'))
model.add(Dense(35, activation='softmax'))
model.compile(loss='binary_crossentropy', optimizer='sgd', metrics=['acc'])
model.fit(X_train, y_train_hot, epochs=5, batch_size=128)
您的输出是 2 并且应该是 35,因为您有 35 个输出类,您的第一个 Dense 不需要 input_dim 因为形状将由前一层推断,并且输入形状是错误的。
希望这可以帮助
推荐阅读
- django - Q.DjangoRestFramework(无法将关键字“ContentType”解析为字段)
- python - 如何识别小键盘上的键被点击?
- xamarin.forms - 无法实现 NavigationPageRenderer 自定义渲染器 xamarin 表单
- php - 在使用 php 在 htaccess 中重写 url 后,无法在页面加载时从 cookie 中检索数组
- webpack - Webpack 动态 import() 和代理缓存
- java - 编写 WSDL 绑定
- c# - 从国际电话代码中查找区域设置
- python-3.x - 如何以pythonic方式从两个向量中获取以下矩阵?
- laravel-5 - 在 where 方法中使用原始查询会在查询生成中出错
- ios - 在 iOS ViewControllers 中替换部分功能的好策略