tensorflow复现VGG16及遇到问题

记录一下学习过程中所遇的一些问题,方便日后查阅。
用tensorflow框架复现一下VGG16模型

VGG-16一共16层,可分为五个大块,各个层用的卷积核都是33 步长1,池化用22 步长2
第一块两个卷积 一个池化 深度64
第二块两个卷积 一个池化 深度128
第三块三个卷积 一个池化 深度 256
第四块三个卷积 一个池化 深度 512
第五块三个卷积 一个池化 深度 512
最后三个全连接,原模型神经元个数4096个,其他值也可以 原模型输出1000类,可根据自己认为需求进行修改

问题:
一:在将模型搭建好后(无正则化,含dropout,rule激活),优化函数使用Adam,学习率初始为0.001(递减),在进行训练后发现LOSS初始值极大(几百),正确率在30%,且出现LOSS减少而正确率却在不断下降的问题。
起初怀疑是Adam函数的运算量过大导致内存出错,
由于模型架构中

loss = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(logits=logits, labels=y_))
learning_rate = tf.placeholder(dtype='float', name='learning_rate')
train_op = tf.train.AdamOptimizer(learning_rate).minimize(loss)
correct_prediction = tf.equal(tf.cast(tf.argmax(logits, 1), tf.int32), tf.cast(tf.argmax(y_, 1), tf.int32))
acc = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))

可以看出 loss在减小 问题不大, 关键在于acc 而acc和loss的区别就在于 在计算acc之前有一个优化函数的计算,所以极有可能是运算量过大出错。
但是在将优化函数换为SGD后扔存在这个问题。

进而怀疑是网络架构问题,是否由于网络层次过深而导致。
在将网络换为四层卷积一个池化 三个全连接后 没有发现问题。
故应该是网络架构问题,之后在网络中的各个层后加入batch_normalization,
此时,不会再出现loss过大问题,且loss在不断下降,但仍然出现acc不上升的问题。

下一步要进一步精简网络尝试。

二:在进行训练时的数据是已经处理过的.npy数据,整个train集(含val)大小3G多,
在直接读入后 造成电脑卡死情况,采取分割.npy数据的方式继续导入

x_npy = np.load('F:/bishe/NEW/x_train.npy')
y_npy = np.load('F:/bishe/NEW/y_train.npy')
x_train, x_val, y_train, y_val = train_test_split(x_npy, y_npy, test_size=0.1, random_state=40)
nums = x_train.shape[0]
num = math.ceil(x_train.shape[0]/3)
x_npy1 = x_train[0:num]
x_npy2 = x_train[num:2*num]
x_npy3 = x_train[2*num:nums]
y_npy1 = y_train[0:num]
y_npy2 = y_train[num:2*num]
y_npy3 = y_train[2*num:nums]
print(nums)
print(x_npy1.shape[0])
print(x_npy2.shape[0])
print(x_npy3.shape[0])
np.save(os.path.join(os.getcwd(),'x_train1.npy'),x_npy1)
np.save(os.path.join(os.getcwd(),'x_train2.npy'),x_npy2)
np.save(os.path.join(os.getcwd(),'x_train3.npy'),x_npy3)
np.save(os.path.join(os.getcwd(),'y_train1.npy'),y_npy1)
np.save(os.path.join(os.getcwd(),'y_train2.npy'),y_npy2)
np.save(os.path.join(os.getcwd(),'y_train3.npy'),y_npy3)
np.save(os.path.join(os.getcwd(),'y_val.npy'),y_val)
np.save(os.path.join(os.getcwd(),'x_val.npy'),x_val)

此后每次导入需要读取的批次,电脑内存使用大幅降低(原7.8 现稳定在5左右)

对于问题一的解决:

在发现问题一时 设置的loss及acc输出为每一次迭代都输出 所以在最初始的时候可能出现波动大的问题。
再将输出设置为每十步输出一层 可以看出结果是在收敛的。
如下:
第1次迭代,train loss: 10.752131 train acc: 0.225000 lr: 0.001000
第1次迭代,val loss: 5.226247 val acc: 0.425000 lr: 0.001000
第11次迭代,train loss: 0.662952 train acc: 0.725000 lr: 0.001000
第11次迭代,val loss: 0.776423 val acc: 0.725000 lr: 0.001000
第21次迭代,train loss: 0.648543 train acc: 0.750000 lr: 0.001000
第21次迭代,val loss: 0.590871 val acc: 0.750000 lr: 0.001000
第31次迭代,train loss: 0.521123 train acc: 0.825000 lr: 0.001000
第31次迭代,val loss: 0.419332 val acc: 0.850000 lr: 0.001000
第41次迭代,train loss: 0.653275 train acc: 0.850000 lr: 0.000750
第41次迭代,val loss: 0.573315 val acc: 0.850000 lr: 0.000750
第51次迭代,train loss: 0.317870 train acc: 0.900000 lr: 0.000750
第51次迭代,val loss: 0.554917 val acc: 0.750000 lr: 0.000750
第61次迭代,train loss: 0.236718 train acc: 0.900000 lr: 0.000750
第61次迭代,val loss: 0.256582 val acc: 0.900000 lr: 0.000750
第71次迭代,train loss: 0.143120 train acc: 0.925000 lr: 0.000750
第71次迭代,val loss: 0.332731 val acc: 0.825000 lr: 0.000750
第81次迭代,train loss: 0.179183 train acc: 0.925000 lr: 0.000100
第81次迭代,val loss: 0.300221 val acc: 0.900000 lr: 0.000100
第91次迭代,train loss: 0.016300 train acc: 1.000000 lr: 0.000100
第91次迭代,val loss: 0.199386 val acc: 0.900000 lr: 0.000100
第101次迭代,train loss: 0.121653 train acc: 0.950000 lr: 0.000100
第101次迭代,val loss: 0.044486 val acc: 0.975000 lr: 0.000100
第111次迭代,train loss: 0.028860 train acc: 0.975000 lr: 0.000100
第111次迭代,val loss: 0.579328 val acc: 0.900000 lr: 0.000100
第121次迭代,train loss: 0.016226 train acc: 1.000000 lr: 0.000100
第121次迭代,val loss: 0.185061 val acc: 0.950000 lr: 0.000100
第131次迭代,train loss: 0.000344 train acc: 1.000000 lr: 0.000100
第131次迭代,val loss: 0.323078 val acc: 0.900000 lr: 0.000100
第141次迭代,train loss: 0.001631 train acc: 1.000000 lr: 0.000100
第141次迭代,val loss: 0.410976 val acc: 0.925000 lr: 0.000100
第151次迭代,train loss: 0.017172 train acc: 1.000000 lr: 0.000100
第151次迭代,val loss: 0.659347 val acc: 0.925000 lr: 0.000100
第161次迭代,train loss: 0.001449 train acc: 1.000000 lr: 0.000025
第161次迭代,val loss: 0.250248 val acc: 0.950000 lr: 0.000025
第171次迭代,train loss: 0.009112 train acc: 1.000000 lr: 0.000025
第171次迭代,val loss: 0.384092 val acc: 0.875000 lr: 0.000025
第181次迭代,train loss: 0.000005 train acc: 1.000000 lr: 0.000025
第181次迭代,val loss: 0.048897 val acc: 0.975000 lr: 0.000025
第191次迭代,train loss: 0.002062 train acc: 1.000000 lr: 0.000025
第191次迭代,val loss: 1.177598 val acc: 0.925000 lr: 0.000025
训练完毕

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值