keras学习笔记-bili莫烦
一、keras的backend設置
有兩種方式:
1.修改JSON配置文件
修改~/.keras/keras.json文件內容為:
{"iamge_dim_ordering":"tf","epsilon":1e-07,"floatx":"float32","backend":"tensorflow" }官方文檔解釋:
-  iamge_data_format:字符串,"channels_last"或"channels_first",該選項指定了Keras將要使用的維度順序,可通過keras.backend.image_data_format()來獲取當前的維度順序。對2D數據來說,"channels_last"假定維度順序為(rows,cols,channels)而"channels_first"假定維度順序為(channels, rows, cols)。對3D數據而言,"channels_last"假定(conv_dim1, conv_dim2, conv_dim3, channels),"channels_first"則是(channels, conv_dim1, conv_dim2, conv_dim3) 
-  epsilon:浮點數,防止除0錯誤的小數字 
- floatx:字符串,"float16",?"float32",?"float64"之一,為浮點數精度
- backend:字符串,所使用的后端,為"tensorflow"或"theano"
2.修改python環境變量中的?KERAS_BACKEND參數值
import os os.environ["KERAS_BACKEND"]="tensorflow"在這種情況下,效果只是臨時的,但可以總是寫在代碼的最前面,同樣可以達到目的。
二、使用keras實現線性回歸
import numpy as np import matplotlib.pyplot as plt# 按順序建立的model結構 from keras.models import Sequential # Dense是全連接層 from keras.layers import Dense# seed給定一個種子,利用同一個種子生成的隨機數每次都相同 np.random.seed(1337)# 從-1到1生成200個均間距數 X = np.linspace(-1, 1, 200) # 打亂數據 np.random.shuffle(X) # 生成Y,并添加隨機噪聲 Y = 0.5 * X + 2 + np.random.normal(0, 0.05, (200,)) # 畫散點圖 plt.scatter(X, Y) plt.show() # XY的前160個數據作為訓練數據,后40個數據作為測試數據 X_train, Y_train = X[:160], Y[:160] X_test, Y_test = X[160:], Y[160:]# 開始使用Keras創建網絡結構 model = Sequential() # 添加一個全連接層,該層的輸入維度是1,輸出維度也是1。 model.add(Dense(output_dim=1, input_dim=1))# 設置選擇的損失函數,還有優化器 model.compile(loss='mse', optimizer='sgd')# 開始訓練 print("Training ----------") for step in range(301):# 每次迭代都使用全部的訓練集cost = model.train_on_batch(X_train, Y_train)if step % 50 == 0:print("Train cost:", cost)# 開始測試 print("Testing -----------") cost = model.evaluate(X_test, Y_test, batch_size=40) print("Test cost:", cost) W, b = model.layers[0].get_weights() print("Weights=", W, "\nBiases=", b)# 畫出在測試集上的擬合情況 Y_predict = model.predict(X_test) # 畫出測試集的散點圖 plt.scatter(X_test, Y_test) # 畫出預測值對應的直線,顏色為紅色 plt.plot(X_test, Y_predict, color='g') plt.show()三、使用keras給mnist分類
# 解決報錯GPU運行報錯的問題 # 這里導入tf,用來修改tf后端的配置 import tensorflow as tf from keras.backend.tensorflow_backend import set_sessionconfig = tf.ConfigProto() # 將顯存容量調到只會使用30% config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 使用設置好的配置 set_session(tf.Session(config=config))import numpy as npnp.random.seed(1337) from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential # 導入全連接層和激活函數 from keras.layers import Dense, Activation # 導入優化器RMSprop from keras.optimizers import RMSprop(X_train, y_train), (X_test, y_test) = mnist.load_data() print(X_train.shape[0]) print(X_test.shape[0]) # 將數據由原本的shape-(60000,28,28)變為(60000,784),然后將數據縮放到0-1之間 X_train = X_train.reshape(X_train.shape[0], -1) / 255 X_test = X_test.reshape(X_test.shape[0], -1) / 255 # 將標簽數據變換為onehot模式,原本是用10進制數來表示的 y_train = np_utils.to_categorical(y_train) print(y_test) y_test = np_utils.to_categorical(y_test) print(y_test)# 可以在model中將各層放在一個列表中 model = Sequential([# 第一個全連接層,輸入784,輸出32Dense(output_dim=32, input_dim=784),Activation('relu'),# 不設置input_dim,會默認使用上一層的output_dimDense(10),Activation('softmax'), ]) # 這樣也可以 # model = Sequential() # model.add(Dense(32,input_dim=784)) # model.add(Activation('relu')) # model.add(Dense(10)) # model.add(Activation('softmax'))# 自己定義RMSprop rmsprop = RMSprop(lr=0.001, rho=0.9, epsilon=1e-08, decay=0.0)# 開始創建網絡,使用我們自己定義的rmsprop,如果想使用默認的RMSprop也可是使用 # optimizer = 'rmsprop'來指定。 model.compile(optimizer=rmsprop,# 使用交叉熵損失函數loss='categorical_crossentropy',# 指定在過程中需要額外計算的東西metrics=['accuracy'])# 開始訓練 print('Training ----------') # 使用fit來進行訓練,epochs指訓練幾輪,一輪就是train的全部數據,這里是60000 # 這里一個epochs可以訓練60000/32=1875輪,epochs=2,則一共訓練3750輪 # batch_size=32指每訓練一輪用多少數據,這個在顯存能放得下的情況下,越大越好 model.fit(X_train, y_train, epochs=1, batch_size=32)# 開始測試 print('\nTesting ----------') loss, accuracy = model.evaluate(X_test, y_test)print('test loss:', loss) print('test accuracy:', accuracy)注意前面GPU報錯的處理辦法。
四、使用keras的卷積網絡對mnist分類
# -*- coding:utf-8 -*- __author__ = 'Leo.Z'# 解決報錯GPU運行報錯的問題 # 這里導入tf,用來修改tf后端的配置 import tensorflow as tf from keras.backend.tensorflow_backend import set_session config = tf.ConfigProto() # 將顯存容量調到只會使用30% config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 使用設置好的配置 set_session(tf.Session(config=config))import numpy as npnp.random.seed(1337) from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import Dense, Activation, Convolution2D, MaxPooling2D, Flatten from keras.optimizers import Adam(X_train, y_train), (X_test, y_test) = mnist.load_data()# 改變結構,-1表示默認的樣本數,1表示channels這里是灰度圖片,28*28表示圖片大小 # 卷積網絡要使用圖片的格式 X_train = X_train.reshape(-1, 1, 28, 28) X_test = X_test.reshape(-1, 1, 28, 28) # 將標簽變換為onehot格式 y_train = np_utils.to_categorical(y_train, num_classes=10) y_test = np_utils.to_categorical(y_test, num_classes=10)model = Sequential() # 添加第一個卷積層,32個核,核尺寸為5*5,步長為1,填充為same,激活函數為relu,輸入為1*28*28 model.add(Convolution2D(filters=32,kernel_size=(5, 5),strides=1,padding='same',activation='relu',input_shape=(1, 28, 28) )) # 添加一個pool層,類型為Maxpooling,核尺寸為2*2,步長為2,填充為same model.add(MaxPooling2D(pool_size=(2, 2),strides=2,padding='same' )) # 添加第二個卷積層,64個核,大小為5*5,填充為same,激活函數為relu model.add(Convolution2D(filters=64,kernel_size=(5, 5),padding='same',activation='relu', )) # 添加Maxpooling層,尺寸為2*2,填充為same model.add(MaxPooling2D(pool_size=(2, 2),strides=2,padding='same' )) # 將得到的卷積層給抹平,然后提供給全連接層 model.add(Flatten()) # 添加一個全連接層,node為1024(輸出為1024) model.add(Dense(1024)) # 給第一個全連接層加一個激活函數relu model.add(Activation("relu")) # 添加第二個全連接層,node為10(輸出為10) model.add(Dense(10)) # 為第二個全連接層添加激活函數softmax作分類輸出 model.add(Activation("softmax"))# 使用adam優化器 adam = Adam(lr=1e-4)# 創建網絡,使用交叉熵損失函數,輸出accuracy model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])# 開始訓練,每個batch為32,跑一個epoch print("Training ----------") model.fit(X_train, y_train, epochs=1, batch_size=32) # 開始測試,輸出損失值和準確度 print("Testing ----------") loss, accuracy = model.evaluate(X_test, y_test)print("Loss:", loss) print("Accuracy:", accuracy)五、使用RNN來分類Mnist
# -*- coding:utf-8 -*- __author__ = 'Leo.Z'# 解決報錯GPU運行報錯的問題 # 這里導入tf,用來修改tf后端的配置 import tensorflow as tf from keras.backend.tensorflow_backend import set_sessionconfig = tf.ConfigProto() # 將顯存容量調到只會使用30% config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 使用設置好的配置 set_session(tf.Session(config=config))import numpy as npnp.random.seed(1337)from keras.datasets import mnist from keras.utils import np_utils from keras.models import Sequential from keras.layers import SimpleRNN, Activation, Dense from keras.optimizers import Adam# 一個圖片28行,我們看作是28個時間點 TIME_STEP = 28 # 輸入大小,就是每一行的像素點個數 INPUT_SIZE = 28 # 每一輪訓練的樣本數(圖片個數) BATCH_SIZE = 50 BATCH_INDEX = 0 # 輸出維度10 OUTPUT_SIZE = 10 # RNN單元中node個個數 CELL_SIZE = 50 # 學習率為0.001 LR = 0.001# 讀取數據 (X_train, y_train), (X_test, y_test) = mnist.load_data() # 數據預處理 # 將訓練數據和測試數據都轉換為 m*28*28,并且歸一化 X_train = X_train.reshape(-1, 28, 28) / 255 X_test = X_test.reshape(-1, 28, 28) / 255 y_train = np_utils.to_categorical(y_train, num_classes=10) y_test = np_utils.to_categorical(y_test, num_classes=10)model = Sequential()model.add(SimpleRNN(# 輸入一個batch的shape為50*28*28# 當使用batch_input_shape規定了batch大小后,測試時會要求滿足這個大小#batch_input_shape=(BATCH_SIZE, TIME_STEP, INPUT_SIZE),# 選擇使用input_shape,從而不影響測試時輸入大小input_shape=(TIME_STEP, INPUT_SIZE),units=CELL_SIZE,# tanh也是默認值activation='tanh' )) # 定義輸出層,輸出為10 model.add(Dense(OUTPUT_SIZE)) model.add(Activation('softmax'))adam = Adam(LR)model.compile(optimizer=adam,loss='categorical_crossentropy',metrics=['accuracy'])for step in range(4001):# 每次獲取一個batch_size的數據集X_batch = X_train[BATCH_INDEX:BATCH_INDEX + BATCH_SIZE, :, :]y_batch = y_train[BATCH_INDEX:BATCH_INDEX + BATCH_SIZE, :]# 訓練一次,返回costcost = model.train_on_batch(X_batch, y_batch)BATCH_INDEX += BATCH_SIZE# 如果訓練集跑完了一輪,將BATCH_INDEX置0,繼續跑BATCH_INDEX = 0 if BATCH_INDEX >= X_train.shape[0] else BATCH_INDEX# 每500測試一次,打印一次cost和accuracyif step % 500 == 0:cost, accuracy = model.evaluate(X_test, y_test, batch_size=10000, verbose=False)print("Cost:", cost, "Accuracy:", accuracy)六、使用LSTM來進行回歸
# -*- coding:utf-8 -*- __author__ = 'Leo.Z'# 解決報錯GPU運行報錯的問題 # 這里導入tf,用來修改tf后端的配置 import tensorflow as tf from keras.backend.tensorflow_backend import set_sessionconfig = tf.ConfigProto() # 將顯存容量調到只會使用30% config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 使用設置好的配置 set_session(tf.Session(config=config))import numpy as npnp.random.seed(1337)from keras.models import Sequential from keras.layers import LSTM, TimeDistributed, Dense from keras.optimizers import Adam import matplotlib.pyplot as pltBATCH_START = 0 # 每次20個數據為一個序列 TIME_STEPS = 20 # 一個批次為50個序列 BATCH_SIZE = 50 # 每個輸入為1,一個sin的值 INPUT_SIZE = 1 # 每個輸出也為1,一個cos的值 OUTPUT_SIZE = 1 # RNN循環單元中node個數量 CELL_SIZE = 20 # 學習率為0.006 LR = 0.006# 準備數據,每次獲取一個batch的數據,每個batch中的sin和cos是連續的 def get_batch():global BATCH_START, TIME_STEPS# 每一次batch對應X軸的數據,轉化為50*20xs = np.arange(BATCH_START, BATCH_START + TIME_STEPS * BATCH_SIZE).reshape((BATCH_SIZE, TIME_STEPS))# X對應的sin數據,50*20seq = np.sin(xs)# X對應的cos數據,50*20res = np.cos(xs)BATCH_START += TIME_STEPS# plt.plot(xs[0,:],res[0,:],'r',xs[0,:],seq[0,:],'b--')# plt.show()# 返回數據,格式為[50*20*1,50*20*1,50]return [seq[:, :, np.newaxis], res[:, :, np.newaxis], xs]model = Sequential()model.add(LSTM(batch_input_shape=(BATCH_SIZE, TIME_STEPS, INPUT_SIZE),units=CELL_SIZE,# 是否在RNN的每次循環中都做輸入,默認是False,即只在最后輸出結果return_sequences=True,# 兩次batch之間是否是有聯系的,即第一個batch的最后一部的輸出a是否作為第二個batch的第一個輸入stateful=True )) # 按時間分割的全鏈接,即對RNN的每一次循環都添加一個全連接進行輸出,輸出維度為1。 model.add(TimeDistributed(Dense(OUTPUT_SIZE)))adam = Adam(LR)model.compile(optimizer=adam,loss='mse')print("Train ----------") # 使用plt.ion開啟交互模式 plt.ion()for step in range(501):X_batch, y_batch, xs = get_batch()cost = model.train_on_batch(X_batch, y_batch)pred = model.predict(X_batch, BATCH_SIZE)# 避免在圖中重復的畫線,線嘗試刪除已經存在的線try:# 每次畫圖之前清空前面的圖形,不然就是累加 plt.clf()except Exception:passplt.plot(xs[0, :], y_batch[0].flatten(), 'r', xs[0, :], pred.flatten()[:TIME_STEPS], 'b--')# 暫停一下,否則會卡plt.pause(0.1)if step % 10 == 0:print('tiran cost: ', cost)七、使用keras實現自編碼(autoencoder)
# -*- coding:utf-8 -*- __author__ = 'Leo.Z'# 解決報錯GPU運行報錯的問題 # 這里導入tf,用來修改tf后端的配置 import tensorflow as tf from keras.backend.tensorflow_backend import set_sessionconfig = tf.ConfigProto() # 將顯存容量調到只會使用30% config.gpu_options.per_process_gpu_memory_fraction = 0.3 # 使用設置好的配置 set_session(tf.Session(config=config))import numpy as npnp.random.seed(1337)import matplotlib.pyplot as plt from keras.datasets import mnist # 這里直接使用Model,而沒有使用Sequential from keras.models import Model from keras.layers import Dense, Input# 導入matplotlib中的3D模塊 from mpl_toolkits import mplot3d# 導入數據,但在這個例子中,由于自編碼是屬于無監督,所以只需要X_train和X_test # y_test主要用于最后畫3D圖時用作顏色區分 (X_train, _), (X_test, y_test) = mnist.load_data()# 預處理數據,將數據全部歸一化為[-0.5,0.5]范圍 X_train = X_train.astype('float32') / 255. - 0.5 X_train = X_train.reshape((X_train.shape[0], -1)) X_test = X_test.astype('float32') / 255. - 0.5 X_test = X_test.reshape((X_test.shape[0], -1))# 我們確定將encoder的輸出維度定為3(畫3D圖) encoding_dim = 3# 定義輸入 input_img = Input(shape=(784,))# 定義encoder部分 encoded = Dense(128, activation='relu')(input_img) encoded = Dense(64, activation='relu')(encoded) encoded = Dense(10, activation='relu')(encoded) encoder_output = Dense(encoding_dim, )(encoded)# 定義decoder部分 decoded = Dense(10, activation='relu')(encoder_output) decoded = Dense(64, activation='relu')(decoded) decoded = Dense(128, activation='relu')(decoded) decoded = Dense(784, activation='tanh')(decoded)# 自編碼整體結構 autoencoder = Model(inputs=input_img, outputs=decoded) # 僅編碼部分 encoder = Model(inputs=input_img, outputs=encoder_output)# 構建 autoencoder.compile(optimizer='adam', loss='mse') # 訓練20epochs,每個batch為256,并打亂順序 autoencoder.fit(X_train, X_train, epochs=20, batch_size=256, shuffle=True)# 使用僅編碼部分結構來進行預測,即生成編碼后的3維數據 encoded_img = encoder.predict(X_test[1000:])# 使用3D繪圖 ax = plt.axes(projection='3d') # 畫3D圖(只畫了X_test中的前1000個點,避免卡) ax.scatter3D(encoded_img[:, 0], encoded_img[:, 1], encoded_img[:, 2], c=y_test[1000:], s=1) plt.show()八、模型保存和載入
?
from keras.models import Sequential from keras.models import load_model# 直接保存整個model # 使用HDF5格式保存需要安裝h5py包 model.save('my_model.h5') # 載入整個model model = load_model('my_model.h5')# 只保存weights model.save_weights('my_model_weights.h5') model.load_weights('my_model_weights.h5')# 只保存網絡結構 from keras.models import model_from_json json_string = model.to_json() model = model_from_json(json_string)?
轉載于:https://www.cnblogs.com/leokale-zz/p/11141496.html
總結
以上是生活随笔為你收集整理的keras学习笔记-bili莫烦的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: oled屏幕和amoled有什么区别,哪
- 下一篇: 打印两个字符串的公共字符
