python制作训练集_利用Tensorflow简单实现VGGNet,从数据集制作到训练完成测试
VGGNet_TF
利用Tensorflow簡單實現VGGNet,從數據集制作到訓練完成測試
參考:《Tensorflow實戰》《Tensorflow 實戰Google深度學習框架》
學習Tensorflow,拿VGG16練練手,沒有其他騷操作,只有數據集制作,訓練及測試。
create_tfrecords.py為生成tfrecords數據腳本
VGG16.py為網絡結構定義文件
train.py為訓練腳本
test.py為測試腳本
制作tfrecord數據文件
下載17flowers數據集,解壓到目錄下
VGGNet
|__ 17flowers
|__ 0
|__ xxx.JPEG
|__ 1
|__ xxx.JPEG
|__ 2
|__ xxx.JPEG
執行create_tfrecords.py腳本,會在根目錄下生成train.tfrecords文件,也可在腳本中指定生成路徑
訓練自己的數據
修改腳本中,模型保存位置及tfrecord數據所在路徑,執行train.py腳本即可訓練
訓練完成后生成模型文件,執行test.py腳本即可進行測試
test文件夾中的圖片名字前面數字即為所屬類別
網絡結構,VGG16.py
卷積和全連接權重初始化定義了3種方式:
1.預訓練模型參數
2.截尾正態,參考書上采用該方式
3.xavier,網上blog有采用該方式
通過參數finetrun和xavier控制選擇哪種方式,有興趣的可以都試試
def conv(x, d_out, name, fineturn=False, xavier=False):
d_in = x.get_shape()[-1].value
with tf.name_scope(name) as scope:
# Fine-tuning
if fineturn:
kernel = tf.constant(data_dict[name][0], name="weights")
bias = tf.constant(data_dict[name][1], name="bias")
print "fineturn"
elif not xavier:
kernel = tf.Variable(tf.truncated_normal([3, 3, d_in, d_out], stddev=0.1), name='weights')
bias = tf.Variable(tf.constant(0.0, dtype=tf.float32, shape=[d_out]),
trainable=True,
name='bias')
print "truncated_normal"
else:
kernel = tf.get_variable(scope+'weights', shape=[3, 3, d_in, d_out],
dtype=tf.float32,
initializer=tf.contrib.layers.xavier_initializer_conv2d())
bias = tf.Variable(tf.constant(0.0, dtype=tf.float32, shape=[d_out]),
trainable=True,
name='bias')
print "xavier"
conv = tf.nn.conv2d(x, kernel,[1, 1, 1, 1], padding='SAME')
activation = tf.nn.relu(conv + bias, name=scope)
print_layer(activation)
return activation
訓練的時候loss有不收斂的情況,可以適當的調整學習率。
kee_prob設置為0.5的時候,雖然loss下降到很低,但是測試的效果很差,因為這個糾結了好久。后來改為0.8感覺還可以,可能是因為數據集太少的原因。
神經網絡中的超參數各有各的作用,寫完網絡在訓練的過程中,權重初始化方式,學習率的選擇,dropout概率的選擇不同都會對訓練產生影響,如果想做到指哪打哪還得多積累積累經驗。雖然網絡可以work,但還是隱隱約約感覺有哪里不對,后期還得優化優化,如有錯誤歡迎指正交流~
總結
以上是生活随笔為你收集整理的python制作训练集_利用Tensorflow简单实现VGGNet,从数据集制作到训练完成测试的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vb double显示最大精度_个人信息
- 下一篇: idea创建包怎么让包分层_开一家早餐店