Guest User

Untitled

a guest
Jul 19th, 2018
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.86 KB | None | 0 0
  1. #from __future__ import print_function
  2. import numpy as np
  3. from keras.callbacks import EarlyStopping
  4. from keras.datasets import cifar10
  5. from keras.models import Sequential, model_from_json, Model
  6. from keras.layers.core import Dense, Dropout, Flatten
  7. from keras.layers.convolutional import Conv2D
  8. from keras.optimizers import Adam
  9. from keras.layers.pooling import MaxPooling2D
  10. from keras.utils import to_categorical
  11.  
  12. (X_train, Y_train), (X_test, Y_test) = cifar10.load_data()
  13.  
  14. X_train = X_train.astype('float32')
  15. X_test = X_test.astype('float32')
  16. X_train /= 255
  17.  
  18. X_test /= 255
  19. Y_train = to_categorical(Y_train)
  20. Y_test = to_categorical(Y_test)
  21.  
  22. # randomly permute label data
  23. order = np.random.permutation(10)
  24. Y_train = Y_train[:,order]
  25. Y_test = Y_test[:,order]
  26.  
  27. # Загружаем данные об архитектуре сети
  28. json_file = open("CNN_cifar10.json", "r")
  29. loaded_model_json = json_file.read()
  30. json_file.close()
  31. # Создаем модель
  32. loaded_model = model_from_json(loaded_model_json)
  33. # Загружаем сохраненные веса в модель
  34. loaded_model.load_weights("CNN_cifar10.h5")
  35. # Freezing all layers
  36. for layer in loaded_model.layers:
  37. layer.trainable = False
  38. # Leaving only convolutional part of the network
  39. model_bottom = Model
  40. (input=loaded_model.input,output=loaded_model.layers[-4].output)
  41. # select part of the data for training
  42. ind_train = np.in1d(np.sum(Y_train[:,0:5],axis=1),1) # select indices
  43. for the required digits
  44. ind_test = np.in1d(np.sum(Y_test[:,0:5],axis=1),1)
  45. X04_train = X_train[ind_train,:,:,:]
  46. X04_test = X_test[ind_test,:,:,:]
  47. y04_train = Y_train[ind_train,0:5]
  48. y04_test = Y_test[ind_test,0:5]
  49.  
  50. # add new layers to the pretrained bottom
  51. model04 = Sequential()
  52. model04.add(model_bottom)
  53. model04.add(Dense(1024, activation='relu'))
  54. model04.add(Dropout(0.5))
  55. model04.add(Dense(5, activation='softmax'))
  56. model04.compile(loss='categorical_crossentropy',
  57. optimizer=Adam(lr=0.0001, decay=1e-6),metrics=['accuracy'])
  58. model04.fit(X04_train, y04_train,batch_size=128,shuffle=True,
  59. epochs=250,validation_split=0.1,
  60. callbacks=[EarlyStopping(min_delta=0.001, patience=3)])
  61. scores = model04.evaluate(X04_test, y04_test, verbose=0)
  62. print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))
  63.  
  64. # select part of the data for training
  65. ind_train = np.in1d(np.sum(Y_train[:,5:10],axis=1),1) # select indices
  66. for the required digits
  67. ind_test = np.in1d(np.sum(Y_test[:,5:10],axis=1),1)
  68. X59_train = X_train[ind_train,:,:,:]
  69. X59_test = X_test[ind_test,:,:,:]
  70. y59_train = Y_train[ind_train,5:10]
  71. y59_test = Y_test[ind_test,5:10]
  72.  
  73. # add new layers to the pretrained bottom
  74. model59 = Sequential()
  75. model59.add(model_bottom)
  76. model59.add(Dense(1024, activation='relu'))
  77. model59.add(Dropout(0.5))
  78. model59.add(Dense(5, activation='softmax'))
  79. model59.compile(loss='categorical_crossentropy',
  80. optimizer=Adam(lr=0.0001, decay=1e-6),metrics=['accuracy'])
  81. model59.fit(X59_train,
  82.  
  83. y59_train,batch_size=128,shuffle=True,epochs=250,
  84. validation_split=0.1,callbacks=[EarlyStopping(min_delta=0.001,
  85. patience=3)])
  86. scores = model59.evaluate(X59_test, y59_test, verbose=0)
  87. print("Точность работы на тестовых данных: %.2f%%" % (scores[1]*100))
  88. # construct fused network
  89. modelF = Sequential()
  90. modelF.add(model_bottom)
  91. modelF.add(Dense(1024,activation="relu"))
  92. modelF.add(Dense(10,activation="softmax"))
  93. # sum weights of the first level (is there better way to implement it
  94. in keras?)
  95. weights = []
  96. weights.append(model59.layers[-3].get_weights()
  97. [0]+model04.layers[-3].get_weights()[0]) # sum kernel weights
  98. weights.append(model59.layers[-3].get_weights()
  99. [1]+model04.layers[-3].get_weights()[1]) # sum biases
  100. modelF.layers[-2].set_weights(weights)
  101. # concatebate weights of the output level
  102. weights = []
  103. weights.append(np.hstack((model04.layers[-1].get_weights()
  104. [0],model59.layers[-1].get_weights()[0]))) # concatenate weights
  105. weights.append(np.hstack((model04.layers[-1].get_weights()
  106. [1],model59.layers[-1].get_weights()[1]))) # concatenate biases
  107. modelF.layers[-1].set_weights(weights)
  108. modelF.compile(loss='categorical_crossentropy',optimizer=Adam(lr=0.0001,
  109. decay=1e-6),metrics=['accuracy'])
  110.  
  111. #test the performance of the fused network
  112. score = modelF.evaluate(X_test,Y_test,verbose=1) # test model accuracy
  113. print('Test accuracy for the fused network:', score[1])
Add Comment
Please, Sign In to add comment