文章目录
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
h t = f W ( h t − 1 , x t ) h_t=f_W(h_{t-1},x_t) ht=fW(ht−1,xt)
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)