import keras # -*- encoding:utf-8 -*- import numpy as np from keras.models import Sequential # 优化方法选用Adam(其实可选项有很多,如SGD) from keras.optimizers import Adam import random from keras.models import load_model from imblearn.over_sampling import RandomOverSampler from keras.utils import np_utils # 用于模型初始化,Conv2D模型初始化、Activation激活函数,MaxPooling2D是池化层 # Flatten作用是将多位输入进行一维化 # Dense是全连接层 from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Dense,Dropout from keras import regularizers def read_data(path): lines = [] with open(path) as f: for x in range(20000): lines.append(eval(f.readline().strip())) random.shuffle(lines) print('读取数据完毕') d=int(0.75*len(lines)) train_x=[s[:-2] for s in lines[0:d]] train_y=[s[-1] for s in lines[0:d]] test_x=[s[:-2] for s in lines[d:]] test_y=[s[-1] for s in lines[d:]] print('转换数据完毕') ros = RandomOverSampler(random_state=0) X_resampled, y_resampled = ros.fit_sample(np.array(train_x), np.array(train_y)) print('数据重采样完毕') return X_resampled,y_resampled,np.array(test_x),np.array(test_y) train_x,train_y,test_x,test_y=read_data("D:\\data\\quantization\\stock16_18d_train.log") train_x = train_x.reshape(train_x.shape[0], 1,77,6) test_x = test_x.reshape(test_x.shape[0], 1,77, 6) model = Sequential() # 模型卷积层设计 model.add(Conv2D( kernel_size=(5, 6), filters=64, padding='same', # 选择滤波器的扫描方式,即是否考虑边缘 input_shape=(1,77,6), # 设置输入的形状 # batch_input_shape=(64, 1, 28, 28), )) # 选择激活函数 model.add(Activation('relu')) # # 设置下采样(池化层) # model.add(MaxPool2D( # pool_size=(4,1), # 下采样格为2*2 # strides=(2,2), # 向右向下的步长 # padding='same', # padding mode is 'same' # )) # 使用Flatten函数,将输入数据扁平化(因为输入数据是一个多维的形式,需要将其扁平化) model.add(Flatten()) # 将多维的输入一维化 model.add(Dense(units=777, activation='relu', kernel_regularizer=regularizers.l1(0.003))) model.add(Dropout(0.2)) model.add(Dense(units=777, activation='relu')) model.add(Dense(units=777, activation='relu')) model.add(Dense(units=777, activation='relu',kernel_regularizer=regularizers.l1(0.002))) model.add(Dropout(0.2)) model.add(Dense(units=1024, activation='relu')) # 在建设一层 model.add(Dense(5)) # 输入是个类别 model.add(Activation('softmax')) # 用于分类的softmax函数 adam = Adam() # 学习速率lr=0.0001 model.compile(optimizer=adam, loss='categorical_crossentropy', metrics=['accuracy']) print("Starting training ") h=model.fit(train_x, train_y, batch_size=4096*2, epochs=50, shuffle=True) score = model.evaluate(test_x, test_y) print(score) print('Test score:', score[0]) print('Test accuracy:', score[1]) path="16_18d_cnn_seq.h5" model.save(path) model=None model=load_model(path) result=model.predict(test_x) print(result) print(test_y)