cnn_train.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. import keras
  2. # -*- encoding:utf-8 -*-
  3. import numpy as np
  4. from keras.models import Sequential
  5. # 优化方法选用Adam(其实可选项有很多,如SGD)
  6. from keras.optimizers import Adam
  7. import random
  8. from keras.models import load_model
  9. from imblearn.over_sampling import RandomOverSampler
  10. from keras.utils import np_utils
  11. # 用于模型初始化,Conv2D模型初始化、Activation激活函数,MaxPooling2D是池化层
  12. # Flatten作用是将多位输入进行一维化
  13. # Dense是全连接层
  14. from keras.layers import Conv2D, Activation, MaxPool2D, Flatten, Dense
  15. def read_data(path):
  16. lines = []
  17. with open(path) as f:
  18. for x in range(20000):
  19. lines.append(eval(f.readline().strip()))
  20. random.shuffle(lines)
  21. print('读取数据完毕')
  22. d=int(0.95*len(lines))
  23. train_x=[s[:-2] for s in lines[0:d]]
  24. train_y=[s[-1] for s in lines[0:d]]
  25. test_x=[s[:-2] for s in lines[d:]]
  26. test_y=[s[-1] for s in lines[d:]]
  27. print('转换数据完毕')
  28. ros = RandomOverSampler(random_state=0)
  29. X_resampled, y_resampled = ros.fit_sample(np.array(train_x), np.array(train_y))
  30. print('数据重采样完毕')
  31. return X_resampled,y_resampled,np.array(test_x),np.array(test_y)
  32. train_x,train_y,test_x,test_y=read_data("D:\\data\\quantization\\stock6.log")
  33. train_x = train_x.reshape(train_x.shape[0], 1,80,5)
  34. test_x = test_x.reshape(test_x.shape[0], 1,80,5)
  35. # 加载数据
  36. # (X_train,Y_train),(X_test,Y_test) = mnist.load_data()
  37. model = Sequential()
  38. # model.add(Dense(units=635, input_dim=400, activation='relu'))
  39. # model.add(Dense(units=3, activation='softmax'))
  40. # model.compile(loss='categorical_crossentropy', optimizer="adam",metrics=['accuracy'])
  41. # 模型卷积层设计
  42. model.add(Conv2D(
  43. nb_filter=32, # 第一层设置32个滤波器
  44. nb_row=3,
  45. nb_col=20, # 设置滤波器的大小为5*5
  46. padding='same', # 选择滤波器的扫描方式,即是否考虑边缘
  47. input_shape=(1,80,5), # 设置输入的形状
  48. # batch_input_shape=(64, 1, 28, 28),
  49. ))
  50. # 选择激活函数
  51. model.add(Activation('relu'))
  52. # 设置下采样(池化层)
  53. model.add(MaxPool2D(
  54. pool_size=(4,1), # 下采样格为2*2
  55. strides=(2,2), # 向右向下的步长
  56. padding='same', # padding mode is 'same'
  57. ))
  58. # 使用Flatten函数,将输入数据扁平化(因为输入数据是一个多维的形式,需要将其扁平化)
  59. model.add(Flatten()) # 将多维的输入一维化
  60. model.add(Dense(1024)) # 全连接层1024个点
  61. model.add(Activation('relu'))
  62. # 在建设一层
  63. model.add(Dense(3)) # 输入是个类别
  64. model.add(Activation('softmax')) # 用于分类的softmax函数
  65. adam = Adam() # 学习速率lr=0.0001
  66. model.compile(optimizer=adam,
  67. loss='categorical_crossentropy',
  68. metrics=['accuracy'])
  69. print("Starting training ")
  70. h=model.fit(train_x, train_y, batch_size=64, epochs=10, shuffle=True)
  71. score = model.evaluate(test_x, test_y)
  72. print(score)
  73. print('Test score:', score[0])
  74. print('Test accuracy:', score[1])
  75. path="15min_cnn_seq.h5"
  76. model.save(path)
  77. model=None
  78. model=load_model(path)
  79. result=model.predict(test_x)
  80. print(result)
  81. print(test_y)