tensorflow & keras

Mnist

模型定義

tf.keras.Sequential([
	tf.keras.layers.Flatten(input_shape=(28,28)),
	tf.keras.layers.Dense(hidden_layer_size,activation='rule'),
	tf.keras.layers.Dropout(0,1),
	tf.keras.layers.Dense(output_size,activation='softmax')
	])

keras層

  • Dense
    全連接層
  • Dropout
  • Embedding
    word2vec
  • flatten

優化算法及損失函數

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',
	metrics=['accuracy'])

可以使用下面命令看下模型的情況

# Total Params=128*784+128+(128*10+10)=101,770
model.summary()

文字識別

# 總的訓練次數,每次訓練全量數據,然後梯度下降調整參數
NUM_EPOCHS=10
# 數據歸一化
x_train,x_valid,x_test=x_train/255.0,x_valid/255.0,x_test/255.0
# verbose控制訓練過程中顯示參數
history=model.fit(x_train,y_train,epochs=NUM_EPOCHS,
validation_data=(x_valid,y_valid),verbose=2)

模型檢驗

test_loss,test_accuracy=model.evaluate(x_test,y_test)

CNN

Filter

每個卷積核會提取圖片某種特徵,相當於濾鏡
下面的卷積會銳化圖片

0 -1 0
-1 5 -1
0 -1 0

下面的卷積會檢查出邊緣

0 1 0
1 -4 1
0 1 0

pooling

池化操作主要是爲了降維,常見操作是提取最大值

1 1 2 4
5 6 7 8
3 2 1 0
1 2 3 4

按2*2卷積後

6 8
3 4

example

import

import numpy as np
import tersorflow as tf
import pandas as pd
from tensorflow import keras
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline

load data

npz=np.load(...)
x_train=npz['inputs'].astype(np.float)
y_train=npz['targets'].astype(np.int)

npz=np.load(...)
x_valid,y_valid=npz['inputs'].astype(np.float).npz('targets').astype(np.int)

# x_test,y_test

# 圖片其實是三維數據(顏色),所以下面需要帶上0
x_train[0].shape
from sklearn.preprocessing import StandardScaler
scaler=StandardScaler()
x_train_scaled=scaler.fit_transform(x_tratin.astype(np.float32).reshape(-1,1))
	.reshape(-1,28,28,1)
# x_valid_scaled x_test_scaled

設定神經網絡

model=keras.models.Sequential()
model.add(keras.layer.Conv2D(filters=32,padding='same',kernel_size=3,
	activation='selu',input_shape=(28,28,1)))
model.add(keras.layers.MaxPool2D(poo_size=)
model.add(keras.layers.Flatten())
model.add(keras.layer.Dense(128,activat='selu'))
model.add(keras.layer.Dense(10,activation='softmax'))

設定優化方法及損失函數

model.compile(optimizer='adam',loss='sparse_categorical_crossentropy',metrics=['accuracy'])
# 可以使用下列方法看下模型
model.summary()
Model:"sequential"
---------------------------------------------------------------------------
Layer(type)							Output Shape			Param #
===========================================================================
conv2d(Conv2D)						(None,28,28,32)			320
max_pooling2d(MaxPooling2D)			(None,14,14,32)			0
flatten(Flatten)					(None,6272)				0
dense(Dense)						(None,128)				802944
dense_1(Dense)						(None,10)				1290
===========================================================================
Total params:804,554
Trainable params:804,554
Non-trainable params:0
---------------------------------------------------------------------------

320=32*((3*3)+1)
6272=14*14*32

訓練

import os
# 訓練日誌存儲目錄
logdir='cnn-selu-callbacks'
if not os.path.exists(logdir):
	os.mkdir(logdir)
output_model_file=os.path.join(logdir,'model.h5')
callbacks=[
	#訓練完成後CML運行tensorboard --logdir=cnn-selu-callbacks啓動tensorboard服務(6006端口)
	keras.callbacks.TensorBoard(logdir),
	keras.callbacks.ModelCheckpoint(output_model_file,save_best_only=True),
	keras.callbacks.EarlyStopping(patience=5,min_delta=le-3),
]
history=model.fit(x_train_scaled,y_train,epochs=10,
	validation_data=(x_valid_scaled,y_valid),callbacks=callbacks)

RNN

ht=fW(ht1,xt)h_t=f_W(h_{t-1},x_t)

LSTM

影評分析

import

import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
import numpy as np
import sklearn
import pandas as pd
import os
import sys
import time
import tensorflow tf

from tensorflow import keras

load

npz=np.load(r'data\indb_data_train.npz')
x_train=npz['inputs']
y_train=npz['targets']

#x_test y_test

預處理

imdb=keras.datasets.imdb
word_index=imdb.get_word_index()
# print(len(word_index))
word_index={k:(v+3) for k,v in word_index.items()}
word_index['<PAD>']=0
word_index['<START>']=1
word_index['<UNK>']=2
word_index['<END>']=3
reverse_word_index=dict([(value,key) for key,value in word_index.items()])

進入神經網絡的每段文字應當具有相同長度,過長的文字需要截斷,過短的問題需要填充空白字符

max_length=500
x_train=keras.preprocession.sequence.pad_sequences(x_train,
	value=word_index['<PAD>'],padding='post',maxlen=max_length)

#x_test

model

embedding層生成詞向量Word2Vec,embedding_dim爲每個單詞的詞向量維度

embedding_dim=16
batch_size=512
vocab_size=10000

rnn_model=keras.models.Sequential([
	keras.layers.Embedding(input_dim=vocab_size,output_dim=embedding_dim,input_length=max_length),
	keras.layers.Bidirectional(keras.layers.SimpleRNN(units=32,return_sequences=True)),
	keras.layers.Bidirectional(keras.layers.SimpleRNN(units=32,return_sequences=False)),
	keras.layers.Dense(64,activation='relu'),
	keras.layers.Dense(1,activation='sigmoid'),
])
#rnn_model.summary()

其中return_sequences用於標識下一層是否還是RNN

損失函數&優化方法

rnn_model.compile(optimizer='adam',loss='binary_crossentropy',metrics=['accuracy'])

模型訓練

history=rnn_model.fit(x_train,y_train,epochs=10,
	batch_size=batch_size,validation_split=0.2)

打印輸出

def plot_learning_curves(history,label,epochs,min_value,max_value):
	data={}
	data[label]=history.history[label]
	data['val_'+label]=history.history['val_'+label]
	pd.DataFrame(data).plot(figsize=(8,5))
	plt.grid(True)
	plt.axis([0,epochs,min_value,max_value])
	plt.show()

plot_learning_curves(history,'accuracy',10,0,1)
plot_learning_curves(history,'loss',10,0,1)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章