当前位置: 首页 > 知识库问答 >
问题:

Keras 1D CNN:如何正确指定尺寸?

公孙棋
2023-03-14

所以,我想做的是使用这里获得的开普勒数据对系外行星和非系外行星进行分类。数据类型是维度为(num_of_samples,3197)的时间序列。我发现这可以通过在Keras中使用1D卷积层来完成。但是我一直在弄乱维度并得到以下错误

检查模型输入时出错:预期conv1d_1_input有形状(无,3197,1),但得到了带有形状的数组(1, 570, 3197)

因此,问题是:

1.数据(training_set和test_set)是否需要转换为3D张量?如果是,正确的维度是多少?

2.什么是正确的输入形状?我知道我有一个功能的3197个时间步长,但是留档没有指定他们是使用TF还是theano后端,所以我仍然头疼。

顺便说一下,我正在使用TF后端。非常感谢您的帮助!谢谢

"""
Created on Wed May 17 18:23:31 2017

@author: Amajid Sinar
"""

import matplotlib.pyplot as plt
import pandas as pd
plt.style.use("ggplot")
import numpy as np

#Importing training set
training_set = pd.read_csv("exoTrain.csv")
X_train = training_set.iloc[:,1:].values
y_train = training_set.iloc[:,0:1].values

#Importing test set
test_set = pd.read_csv("exoTest.csv")
X_test = test_set.iloc[:,1:].values
y_test = test_set.iloc[:,0:1].values

#Scale the data
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.fit_transform(X_test)

#Convert data into 3d tensor
X_train = np.reshape(X_train,(1,X_train.shape[0],X_train.shape[1]))
X_test = np.reshape(X_test,(1,X_test.shape[0],X_test.shape[1]))


#Importing convolutional layers
from keras.models import Sequential
from keras.layers import Convolution1D
from keras.layers import MaxPooling1D
from keras.layers import Flatten
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers.normalization import BatchNormalization

#Convolution steps
#1.Convolution
#2.Max Pooling
#3.Flattening
#4.Full Connection

#Initialising the CNN
classifier = Sequential()

#Input shape must be explicitly defined, DO NOT USE (None,shape)!!!
#1.Multiple convolution and max pooling
classifier.add(Convolution1D(filters=8, kernel_size=11, activation="relu", input_shape=(3197,1)))
classifier.add(MaxPooling1D(strides=4))
classifier.add(BatchNormalization())
classifier.add(Convolution1D(filters=16, kernel_size=11, activation='relu'))
classifier.add(MaxPooling1D(strides=4))
classifier.add(BatchNormalization())
classifier.add(Convolution1D(filters=32, kernel_size=11, activation='relu'))
classifier.add(MaxPooling1D(strides=4))
classifier.add(BatchNormalization())
#classifier.add(Convolution1D(filters=64, kernel_size=11, activation='relu'))
#classifier.add(MaxPooling1D(strides=4))


#2.Flattening
classifier.add(Flatten())


#3.Full Connection
classifier.add(Dropout(0.5))
classifier.add(Dense(64, activation='relu'))
classifier.add(Dropout(0.25))
classifier.add(Dense(64, activation='relu'))
classifier.add(Dense(1, activation='sigmoid'))

#Configure the learning process
classifier.compile(optimizer="adam", loss="binary_crossentropy", metrics=["accuracy"])

#Train!
classifier.fit_generator(X_train, steps_per_epoch=X_train.shape[0], epochs=1, validation_data=(X_test,y_test))

score = classifier.evaluate(X_test, y_test)

共有2个答案

方鸿振
2023-03-14

假设你的数据的形状是,

>>> data.shape()
(m, n)

因此,您应该添加一个新轴作为通道轴,

>>> data = data[..., np.newaxis]
>>> data.shape()
(m, n, 1)
郎恺
2023-03-14

>

  • 是的,数据集应该是3d张量。

    正确的输入形状(对于tensorflow后端)是(sample\u number、sample\u size、channel\u number)。您可以从错误消息中检查“预期维度为(None,3197,1)”。

    “None”表示任意大小的维度,因为它预期是训练中使用的样本数。

    因此,在您的情况下,正确的形状是(570、3197、1)。

    如果您碰巧使用theano后端,您应该将通道维度放在首位:(sample_number、channel_number、sample_size)或在您的特殊情况下

    (570,1, 3197)

  •  类似资料:
    • 假设我有一个应用程序,其中REST API更新产品的价格。 我想使用微米计来公开新价格作为指标。我无法理解微米计留档应该如何完成。 唯一对我有效的DoubleFunction是在我的ProductService中创建一个新方法来返回它的价格。这似乎是我想公开作为指标的每一条数据的开销。 我这里缺少什么?为什么不足以更新Gauge?

    • 对于我在Java中创建的GUI应用程序,我有以下内容: 一个JFrame,设置为最小大小为(300,200) 一个JSplitPane,其中包含: 在左侧,最小大小为(100,0)的JScrollPane(包含JTree)(我只想将宽度限制为200) 在右边,一个最小大小为(200,0)的JPanel 在以下情况下,尺寸不会给我带来任何问题: 向左调整JSplitPane的大小(到JScrollP

    • 问题内容: 我正在尝试通过以下方式为我的docker容器明确指定IP地址: 我收到以下错误: 我真的不在乎端口10000。我的目标是选择一个特定的容器IP,并将端口9000和9090暴露给主机。 我看了其他一些问题,但没有看到明确的语法来做到这一点 问题答案: 该参数用于将端口从容器转发到主机,而不用于分配IP。 没有简单的方法将固定IP分配给Docker容器,我强烈建议您不要尝试。而是重新架构您

    • 我有一段使用Codahale度量的旧代码。我想把它换成千分尺。我可以切换简单的对象,但我在重现某些Codahale特定对象的功能时会遇到一些问题。 我很好地切换到简单的对象,但我在复制某些特定于Codahale对象的功能时遇到了一些困难。在这方面,我没有发现任何令人满意的比较。我是基于文档和文章,但仍然没有运气。我不知道我想做的事是否可能。 例如,以微米为单位,这看起来如何? 或者只是一个简单的弦

    • 我最近读了很多关于DNS的书,甚至在堆栈溢出上搜索信息,但是我似乎找不到这个。如果一路上有错误,请纠正我。 假设我想去example.com.我理解DNS工作方式的方式是 > 它在本地客户机上查找缓存的记录。如果缓存中有记录,一切都很好。如果没有,则移动到步骤2。 向Internet服务提供商(ISP)提供的DNS解析程序请求域名。 如果DNS解析器具有域名记录缓存,则返回IP地址,一切正常。如果

    • 问题内容: 无论屏幕大小如何,我都想使用Swift代码在我的应用程序中正确定位项目。例如,如果我希望按钮的宽度为屏幕宽度的75%,则可以做为按钮的宽度。我发现可以通过在Objective-C中确定 不幸的是,我不确定如何将其转换为Swift。有人有主意吗? 谢谢! 问题答案: 在Swift 3.0中 快点做:做这样的事情: 那么您可以像这样访问宽度和高度: 如果您想要屏幕宽度的75%,则可以执行以