1. 程式人生 > >python人工神經網路

python人工神經網路

人工神經網路在模組keras中,實現步驟如下:

#bp人工神經網路的實現

#1、讀取資料

#2、匯入對應模組,keras.models  Sequential(建立模型)  |keras.layers.core Dense(建立層)  Activation

#3、Sequential建立模型

#4、Dense建立層

#5、Activation啟用函式

#6、compile模型編譯

#7、fit(訓練)學習

#8、驗證(測試,分類預測)

使用人工神經網路實現課程銷量的預測

#資料讀取與整理
import pandas as pda
import numpy
fname='E:/programCode/lesson.csv'
dataf=pda.read_csv(fname)
x=dataf.iloc[:,1:5].as_matrix()#iloc[:,1:5]提取所有行,1到4列
y=dataf.iloc[:,5].as_matrix()
for i in range(0,len(x)):
    for j in range(0,len(x[i])):
        thisdata=x[i][j]
        if(thisdata=='是' or thisdata=='高' or thisdata=='多'):
            x[i][j]=int(1)
        else:
            x[i][j]=-1

for i in range(0,len(y)):
    thisdata=y[i]
    if(thisdata=='高'):
        y[i]=1
    else:
        y[i]=-1

#容易錯的地方:直接輸入x,y訓練
#正確的做法:轉化好格式,將x,y轉化為資料框,然後在轉換為陣列並指定格式
xf=pda.DataFrame(x)
yf=pda.DataFrame(y)

x2=xf.as_matrix().astype(int)
y2=yf.as_matrix().astype(int)

#使用人工神經網路模型

from keras.models import Sequential
from keras.layers.core import Dense,Activation

model=Sequential()#建立模型
#輸入層
model.add(Dense(10,input_dim=len(x2[0])))#10代表輸入層節點個數,input_dim代表多少特徵
model.add(Activation('relu'))#啟用函式
#輸出層
model.add(Dense(1,input_dim=1))
model.add(Activation('sigmoid'))
#模型的編譯
model.compile(loss='binary_crossentropy',optimizer='adam')#loss損失函式,optimizer求解方法,class_mode指定模式
#訓練
model.fit(x2,y2,nb_epoch=1000,batch_size=100)#nb_epoch指定學習的次數,batch_size指定p的大小
#預測分類
rst=model.predict_classes(x).reshape(len(x))
print(rst)

人工神經網路實現手寫體數字識別

#資料讀取與整理
#載入資料
import numpy  
import operator
from os import listdir
import pandas as pda
def datatoarray(fname):
    arr=[]
    fh=open(fname)
    #因為圖片文字是32乘32的,將每一個畫素點的值都放入一個長度為1024的列表中
    for i in range(0,32):
        thisline=fh.readline()
        for j in range(0,32):
            arr.append(int(thisline[j]))
    return arr

#取檔案的字首
def seplabel(fname):
    filestr=fname.split('.')[0]
    label=int(filestr.split('-')[0])
    #print(label)
    return label

#建立訓練資料
def traindata():
    labels=[]
    tranfile=listdir('E:/programCode/手寫數字識別實驗')#listdir()得到所有的檔名
    num=len(tranfile)
    #行的長度1024,每一行儲存一個檔案
    #用一個數組儲存所有訓練資料,行:檔案總數,列:1024
    trainarr=numpy.zeros((num,1024))
    for i in range(0,num):
        thisfname=tranfile[i]
        thislabel=seplabel(thisfname)
        labels.append(thislabel)
        trainarr[i,:]=datatoarray('E:/programCode/手寫數字識別實驗/'+thisfname)
    return trainarr,labels

trainarr,labels=traindata()
xf=pda.DataFrame(trainarr)
yf=pda.DataFrame(labels)
tx2=xf.as_matrix().astype(int)
ty2=yf.as_matrix().astype(int)

#使用人工神經網路模型

from keras.models import Sequential
from keras.layers.core import Dense,Activation

model=Sequential()#建立模型
#輸入層
model.add(Dense(10,input_dim=len(tx2[0])))#10代表輸入層節點個數,input_dim代表多少特徵
model.add(Activation('relu'))#啟用函式
#輸出層
model.add(Dense(1,input_dim=1))
model.add(Activation('sigmoid'))
#模型的編譯
model.compile(loss='mean_squared_error',optimizer='adam')#loss損失函式,optimizer求解方法,class_mode指定模式
#訓練
model.fit(tx2,ty2,nb_epoch=1000,batch_size=6)#nb_epoch指定學習的次數,batch_size指定p的大小
#預測分類
rst=model.predict_classes(tx2).reshape(len(tx2))
print(rst)