Keras 准备向1D CNN馈送数据
我在为1-D CNN重塑数据时遇到问题: 我正在从一个包含24325行的csv文件加载数据(培训和测试数据集)。每行是256个数字的向量-自变量加上11个预期结果数字(标签)[0,0,0,0,1,0,0,0,0,0] 我正在使用TensorFlow后端。 代码如下所示:Keras 准备向1D CNN馈送数据,keras,convolution,Keras,Convolution,我在为1-D CNN重塑数据时遇到问题: 我正在从一个包含24325行的csv文件加载数据(培训和测试数据集)。每行是256个数字的向量-自变量加上11个预期结果数字(标签)[0,0,0,0,1,0,0,0,0,0] 我正在使用TensorFlow后端。 代码如下所示: import matplotlib.pyplot as plt import pandas as pd import numpy as np #Importing training set
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
#Importing training set
training_set = pd.read_csv("Data30.csv")
X_train = training_set.iloc[:20000, 3 :-11].values
y_train = training_set.iloc[:20000, -11:-1].values
#Importing test set
test_set = pd.read_csv("Data30.csv")
X_test = training_set.iloc[ 20001:, 3 :-11].values
y_test = training_set.iloc[ 20001:, -11:].values
X_train /= np.max(X_train) # Normalise data to [0, 1] range
X_test /= np.max(X_test) # Normalise data to [0, 1] range
print("X_train.shape[0] = " + str(X_train.shape[0]))
print("X_train.shape[1] = " + str(X_train.shape[1]))
print("y_train.shape[0] = " + str(y_train.shape[0]))
print("y_train.shape[1] = " + str(y_train.shape[1]))
print("X_test.shape[0] = " + str(X_test.shape[0]))
print("X_test.shape[1] = " + str(X_test.shape[1]))
这就是我得到的:
X_列形状[0]=20000
X_train.shape=256
y_列形状[0]=20000
y_train.shape=11
X_检验.形状[0]=4325
X_test.shape=256
这是整形的结果:
X_列形状[0]=1
X_列车形状=20000
X_检验.形状[0]=1
X_测试形状=4325
这是我得到的错误:
回溯(最近一次呼叫最后一次):
文件“C:/Conda/ML_Folder/CNN Data30.py”,第85行,在
分类器.fit_生成器(X_序列,每_历元的步数=10,历元=10,验证_数据=(X_测试,y_测试))
文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”,第87行,在包装器中
返回函数(*args,**kwargs)
文件“C:\Conda\lib\site packages\keras\models.py”,第1121行,在fit_generator中
初始_历元=初始_历元)
文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”,第87行,在包装器中
返回函数(*args,**kwargs)
文件“C:\Conda\lib\site packages\keras\engine\training.py”,第1978行,在fit\u generator中
val_x,val_y,val_样品重量)
文件“C:\Conda\lib\site packages\keras\engine\training.py”,第1378行,在用户数据中
异常(前缀为“输入”)
文件“C:\Conda\lib\site packages\keras\engine\training.py”,第144行,输入数据
str(array.shape))
ValueError:检查输入时出错:预期conv1d_1_输入具有形状(无,256,1),但获得具有形状(14325,256)的数组
你能帮我修复代码吗?形状应该是(批量大小、长度、通道)
所以:(20000256,1)
和(20000,11)
详细信息:您的最后一个Dense
必须输出11,因此:Dense(11,…)
形状应该是(批大小、长度、通道)
所以:(20000256,1)
和(20000,11)
细节:您最后一次的
Dense
必须输出11,因此:Dense(11,…)
谢谢您,丹尼尔!现在唯一剩下的问题是分类器.fit_生成器的格式(训练集,每个历元的步数=100,nb_历元=200,验证数据=(X_测试,y_测试),验证步骤=40)据我所知,Keras Api 2.0已更改,它需要每个历元的步骤数
作为每个历元从生成器提取的批次数。基本上,每个历元的步骤=每个历元的样本数/批量大小。然而,我仍然不明白在我的情况下什么是正确的参数!TypeError:“DataFrame”对象不是迭代器回溯(上次调用):文件“C:/Conda/ML_Folder/CNN Data30.py”,第94行,在验证中(步骤=40)文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”,第87行,在包装器返回函数(*args,**kwargs)文件“C:\Conda\lib\site packages\keras\models.py”,第1121行,在fit_generator initial_epoch=initial_epoch)文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”的第87行,包装器返回函数(*args,**kwargs)文件“C:\Conda\lib\site packages\keras\engine\training.py”的第2011行,在fit_generator generator\u output=next(output_generator)中StopIteration似乎training\u set
是一个名为dataframe的对象。您必须有一个生成器
。一个特定的python对象。但是,如果training\u set
是您所有的数据,并且您希望立即对其进行训练,则可以使用fit
而不是fit\u generator
。谢谢您,丹尼尔!现在唯一剩下的问题是分类器.fit_生成器的格式(训练集,每个历元的步数=100,nb_历元=200,验证数据=(X_测试,y_测试),验证步骤=40)据我所知,Keras Api 2.0已更改,它需要每个历元的步骤数
作为每个历元从生成器提取的批次数。基本上,每个历元的步骤=每个历元的样本数/批量大小。然而,我仍然不明白在我的情况下什么是正确的参数!TypeError:“DataFrame”对象不是迭代器回溯(上次调用):文件“C:/Conda/ML_Folder/CNN Data30.py”,第94行,在验证中(步骤=40)文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”,第87行,在包装器返回函数(*args,**kwargs)文件“C:\Conda\lib\site packages\keras\models.py”,第1121行,在fit_generator initial_epoch=initial_epoch)文件“C:\Conda\lib\site packages\keras\legacy\interfaces.py”的第87行,包装器返回函数(*args,**kwargs)文件“C:\Conda\lib\site packages\keras\engine\training.py”的第2011行,在fit_generator generator\u output=next(output_generator)中StopIteration似乎training\u set
是一个名为dataframe的对象。您必须有一个生成器
。一个特定的python对象。但是,如果training\u set
是所有数据的集合,并且您希望立即对其进行训练,则可以使用fit
而不是fit\u generator
。
#Convert data into 3d tensor
# Old Version
# 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]))
**# New Correct Version based on the Answer:**
X_train = np.reshape(X_train,( X_train.shape[0],X_train.shape[1], 1 ))
X_test = np.reshape(X_test,( X_test.shape[0],X_test.shape[1], 1 ))
print("X_train.shape[0] = " + str(X_train.shape[0]))
print("X_train.shape[1] = " + str(X_train.shape[1]))
print("X_test.shape[0] = " + str(X_test.shape[0]))
print("X_test.shape[1] = " + str(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
#Initialising the CNN
classifier = Sequential()
#1.Multiple convolution and max pooling
classifier.add(Convolution1D(filters=8, kernel_size=11, activation="relu", input_shape=( 256, 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(training_set,
steps_per_epoch= 100,
nb_epoch = 200,
validation_data = (X_test,y_test),
validation_steps = 40)
score = classifier.evaluate(X_test, y_test)