ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

【人工智能】实验二基于CNN的图像分类

2021-12-06 20:33:33  阅读:227  来源: 互联网

标签:acc loss 200 人工智能 300 tf 图像 CNN 100


实验主要分为四个步骤:

  1. load datasets
  2. build network
  3. train
  4. test

构建的网络模型VGG13  一共13层

俺们老师给的待完善的代码如下,需要自己填写带下划线的部分

import  tensorflow as tf
from    tensorflow.keras import layers, optimizers, datasets, Sequential
import  os

os.environ['TF_CPP_MIN_LOG_LEVEL']='2'
tf.random.set_seed(2345)

conv_layers = [ # 5 units of conv + max pooling
    #Please build vgg13 network according to the demonstration in readme file, bellow is a instance for unit 1
    #Please complete other parts. (unit 2 to unit 5)
    # unit 1
    layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    # unit 2
    #____________________________________________________________________________
    #____________________________________________________________________________
    #____________________________________________________________________________

    # unit 3
    #____________________________________________________________________________
    #____________________________________________________________________________
    #____________________________________________________________________________

    # unit 4
    #____________________________________________________________________________
    #____________________________________________________________________________
    #____________________________________________________________________________

    # unit 5
    #____________________________________________________________________________
    #____________________________________________________________________________
    #____________________________________________________________________________

]



def preprocess(x, y):
    # [0~1]
    x = tf.cast(x, dtype=tf.float32) / 255.
    y = tf.cast(y, dtype=tf.int32)
    return x,y


(x,y), (x_test, y_test) = datasets.cifar100.load_data()
y = tf.squeeze(y, axis=1)
y_test = tf.squeeze(y_test, axis=1)
print(x.shape, y.shape, x_test.shape, y_test.shape)


train_db = tf.data.Dataset.from_tensor_slices((x,y))
train_db = train_db.shuffle(1000).map(preprocess).batch(128)

test_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
test_db = test_db.map(preprocess).batch(64)

sample = next(iter(train_db))
print('sample:', sample[0].shape, sample[1].shape,
      tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))


def main():

    # [b, 32, 32, 3] => [b, 1, 1, 512]
    conv_net = Sequential(conv_layers)
# Please add your code in blank
    fc_net = Sequential([
        layers.Dense(____________________________),
        layers.Dense(____________________________),
        layers.Dense(100, activation=None), #you can try other activation function to evaluate and compare
    ])
# Please add your code in blank
    conv_net.build(input_shape=[None, ____, _____, ___])
    fc_net.build(input_shape=[None, ____])
    optimizer = optimizers.Adam(lr=1e-4)

    # [1, 2] + [3, 4] => [1, 2, 3, 4]
    variables = conv_net.trainable_variables + fc_net.trainable_variables

    for epoch in range(50):

        for step, (x,y) in enumerate(train_db):

            with tf.GradientTape() as tape:
                # [b, 32, 32, 3] => [b, 1, 1, 512]
                out = conv_net(x)
                # flatten, => [b, 512]
                out = tf.reshape(out, [-1, 512])
                # [b, 512] => [b, 100]
                logits = fc_net(out)
                # [b] => [b, 100]
                y_onehot = tf.one_hot(y, depth=100)
                # compute loss
                loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)
                loss = tf.reduce_mean(loss)
# Please add your code in blank
            grads = tape.gradient(___________, ______________)
            optimizer.apply_gradients(zip(__________, ___________))

            if step %100 == 0:
                print(epoch, step, 'loss:', float(loss))



        total_num = 0
        total_correct = 0
        for x,y in test_db:

            out = conv_net(x)
            out = tf.reshape(out, [-1, 512])
            logits = fc_net(out)
            prob = tf.nn.softmax(logits, axis=1)
            pred = tf.argmax(prob, axis=1)
            pred = tf.cast(pred, dtype=tf.int32)

            correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)
            correct = tf.reduce_sum(correct)

            total_num += x.shape[0]
            total_correct += int(correct)

        acc = total_correct / total_num
        print(epoch, 'acc:', acc)



if __name__ == '__main__':
    main()

这是我完善过后的代码

import tensorflow as tf
from tensorflow.keras import layers, optimizers, datasets, Sequential
import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'
tf.random.set_seed(2345)

# 首先我们知道Sequential这个容器,接受一个13层的list.我们先组成list;网络的第一部分。
conv_layers = [  # 5 units of conv + max pooling
    # unit 1
    layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(64, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    # unit 2
    layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(128, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    # unit 3
    layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(256, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    # unit 4
    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same'),

    # unit 5
    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.Conv2D(512, kernel_size=[3, 3], padding="same", activation=tf.nn.relu),
    layers.MaxPool2D(pool_size=[2, 2], strides=2, padding='same')

]


# 进行数据预处理,仅仅是类型的转换。    [0~1]
def preprocess(x, y):
    x = tf.cast(x, dtype=tf.float32) / 255.
    y = tf.cast(y, dtype=tf.int32)
    return x, y


# load datasets 根据要求使用的是cifar100
(x, y), (x_test, y_test) = datasets.cifar100.load_data()
y = tf.squeeze(y)  # 或者tf.squeeze(y, axis=1)把1维度的squeeze掉。
y_test = tf.squeeze(y_test)  # 或者tf.squeeze(y, axis=1)把1维度的squeeze掉。
print(x.shape, y.shape, x_test.shape, y_test.shape)
# 训练集
train_db = tf.data.Dataset.from_tensor_slices((x, y))
train_db = train_db.shuffle(1000).map(preprocess).batch(128)
# 测试集
test_db = tf.data.Dataset.from_tensor_slices((x_test, y_test))
test_db = test_db.map(preprocess).batch(128)

# 测试一下sample的形状。
sample = next(iter(train_db))
print('sample:', sample[0].shape, sample[1].shape,
      tf.reduce_min(sample[0]), tf.reduce_max(sample[0]))  # 值范围为[0,1]


def main():
    # 把参数放进Sequential容器
    # 输入:[b, 32, 32, 3] => 输出[b, 1, 1, 512]
    conv_net = Sequential(conv_layers)
    # conv_net.build(input_shape=[None, 32, 32, 3])
    # x = tf.random.normal([4, 32, 32, 3])
    # out = conv_net(x)
    # print(out.shape)

    # 创建全连接层网络;网络的第二部分;第二部分的输入为第一部分的输出。
    fc_net = Sequential([
        layers.Dense(256, activation=tf.nn.relu),
        layers.Dense(128, activation=tf.nn.relu),
        layers.Dense(100, activation=None),
    ])

    # 这里其实把一个网络分成2个来写,
    conv_net.build(input_shape=[None, 32, 32, 3])
    fc_net.build(input_shape=[None, 512])
    # 创建一个优化器
    optimizer = optimizers.Adam(lr=1e-4)
    conv_net.summary()
    fc_net.summary()

    # 下面的+表示拼接。python中的list列表拼接,2个列表变为一个。
    # 例如:[1, 2] + [3, 4] => [1, 2, 3, 4]
    variables = conv_net.trainable_variables + fc_net.trainable_variables
    for epoch in range(50):

        for step, (x, y) in enumerate(train_db):
            with tf.GradientTape() as tape:
                # [b, 32, 32, 3] => [b, 1, 1, 512]
                out = conv_net(x)
                # 之后squeeze或者reshape为平坦的flatten;flatten, => [b, 512]
                out = tf.reshape(out, [-1, 512])
                # 送入全连接层输入,得到输出logits
                # [b, 512] => [b, 100]
                logits = fc_net(out)
                # [b] => [b, 100]转换为热编码。
                y_onehot = tf.one_hot(y, depth=100)
                # compute loss   结果维度[b]
                loss = tf.losses.categorical_crossentropy(y_onehot, logits, from_logits=True)
                loss = tf.reduce_mean(loss)

            # 梯度求解
            grads = tape.gradient(loss, variables)
            # 梯度更新
            optimizer.apply_gradients(zip(grads, variables))

            if step % 100 == 0:
                print(epoch, step, 'loss:', float(loss))

        # 做测试
        total_num = 0
        total_correct = 0
        for x, y in test_db:
            out = conv_net(x)
            out = tf.reshape(out, [-1, 512])
            logits = fc_net(out)
            # 预测可能性。
            prob = tf.nn.softmax(logits, axis=1)
            pred = tf.argmax(prob, axis=1) 
            pred = tf.cast(pred, dtype=tf.int32)

            # 拿到预测值pred和真实值比较。
            correct = tf.cast(tf.equal(pred, y), dtype=tf.int32)
            correct = tf.reduce_sum(correct)

            total_num += x.shape[0]
            total_correct += int(correct)  # 转换为numpy数据

        acc = total_correct / total_num
        print(epoch, 'acc:', acc)
        # colab源码:https://github.com/jupyter/colaboratory


if __name__ == '__main__':
    main()

在我机子上跑的结果,从上午十点开始跑的,一直跑了有十个小时,才跑了7/10,还没跑完。好慢啊。

Model: "sequential"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 conv2d (Conv2D)             (None, 32, 32, 64)        1792      
                                                                 
 conv2d_1 (Conv2D)           (None, 32, 32, 64)        36928     
                                                                 
 max_pooling2d (MaxPooling2D  (None, 16, 16, 64)       0         
 )                                                               
                                                                 
 conv2d_2 (Conv2D)           (None, 16, 16, 128)       73856     
                                                                 
 conv2d_3 (Conv2D)           (None, 16, 16, 128)       147584    
                                                                 
 max_pooling2d_1 (MaxPooling  (None, 8, 8, 128)        0         
 2D)                                                             
                                                                 
 conv2d_4 (Conv2D)           (None, 8, 8, 256)         295168    
                                                                 
 conv2d_5 (Conv2D)           (None, 8, 8, 256)         590080    
                                                                 
 max_pooling2d_2 (MaxPooling  (None, 4, 4, 256)        0         
 2D)                                                             
                                                                 
 conv2d_6 (Conv2D)           (None, 4, 4, 512)         1180160   
                                                                 
 conv2d_7 (Conv2D)           (None, 4, 4, 512)         2359808   
                                                                 
 max_pooling2d_3 (MaxPooling  (None, 2, 2, 512)        0         
 2D)                                                             
                                                                 
 conv2d_8 (Conv2D)           (None, 2, 2, 512)         2359808   
                                                                 
 conv2d_9 (Conv2D)           (None, 2, 2, 512)         2359808   
                                                                 
 max_pooling2d_4 (MaxPooling  (None, 1, 1, 512)        0         
 2D)                                                             
                                                                 
=================================================================
Total params: 9,404,992
Trainable params: 9,404,992
Non-trainable params: 0
_________________________________________________________________
Model: "sequential_1"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 dense (Dense)               (None, 256)               131328    
                                                                 
 dense_1 (Dense)             (None, 128)               32896     
                                                                 
 dense_2 (Dense)             (None, 100)               12900     
                                                                 
=================================================================
Total params: 177,124
Trainable params: 177,124
Non-trainable params: 0
_________________________________________________________________
0 0 loss: 4.605703830718994
0 100 loss: 4.573154449462891
0 200 loss: 4.274768829345703
0 300 loss: 4.280937194824219
0 acc: 0.0626
1 0 loss: 4.13004207611084
1 100 loss: 4.003829002380371
1 200 loss: 3.8823888301849365
1 300 loss: 4.033702373504639
1 acc: 0.0968
2 0 loss: 3.9909071922302246
2 100 loss: 3.92575740814209
2 200 loss: 3.734340190887451
2 300 loss: 3.5258753299713135
2 acc: 0.1601
3 0 loss: 3.586297035217285
3 100 loss: 3.733517646789551
3 200 loss: 3.234541654586792
3 300 loss: 3.192173957824707
3 acc: 0.2045
4 0 loss: 3.4989943504333496
4 100 loss: 3.281524658203125
4 200 loss: 3.20217227935791
4 300 loss: 3.265291690826416
4 acc: 0.2305
5 0 loss: 3.2033958435058594
5 100 loss: 2.947575569152832
5 200 loss: 2.8855361938476562
5 300 loss: 2.885098934173584
5 acc: 0.2497
6 0 loss: 2.8828682899475098
6 100 loss: 3.0514018535614014
6 200 loss: 2.7332396507263184
6 300 loss: 3.0623221397399902
6 acc: 0.2771
7 0 loss: 3.0236001014709473
7 100 loss: 2.7354226112365723
7 200 loss: 2.4895710945129395
7 300 loss: 2.585233211517334
7 acc: 0.2853
8 0 loss: 2.621670722961426
8 100 loss: 2.807131767272949
8 200 loss: 2.6461825370788574
8 300 loss: 2.770937204360962
8 acc: 0.3049
9 0 loss: 2.8133463859558105
9 100 loss: 2.390254020690918
9 200 loss: 2.6979241371154785
9 300 loss: 2.122256278991699
9 acc: 0.3216
10 0 loss: 2.4884862899780273
10 100 loss: 2.3237156867980957
10 200 loss: 1.976022481918335
10 300 loss: 1.9411729574203491
10 acc: 0.341
11 0 loss: 2.3988051414489746
11 100 loss: 2.157597541809082
11 200 loss: 1.783387541770935
11 300 loss: 2.2747488021850586
11 acc: 0.3428
12 0 loss: 2.081052780151367
12 100 loss: 1.9125139713287354
12 200 loss: 1.9749314785003662
12 300 loss: 1.9473168849945068
12 acc: 0.3481
13 0 loss: 1.9426753520965576
13 100 loss: 1.6028225421905518
13 200 loss: 1.654457688331604
13 300 loss: 1.5368409156799316
13 acc: 0.348
14 0 loss: 1.9074410200119019
14 100 loss: 1.2604421377182007
14 200 loss: 1.33577299118042
14 300 loss: 1.4747681617736816
14 acc: 0.3456
15 0 loss: 1.408400535583496
15 100 loss: 1.4740254878997803
15 200 loss: 1.0276473760604858
15 300 loss: 1.2776360511779785
15 acc: 0.3468
16 0 loss: 1.1048237085342407
16 100 loss: 1.0582349300384521
16 200 loss: 0.7934116721153259
16 300 loss: 0.9454417824745178
16 acc: 0.3392
17 0 loss: 1.0203744173049927
17 100 loss: 0.5127657651901245
17 200 loss: 0.6567991971969604
17 300 loss: 0.74583899974823
17 acc: 0.3313
18 0 loss: 0.6991515159606934
18 100 loss: 0.49814605712890625
18 200 loss: 0.5801453590393066
18 300 loss: 0.5829309225082397
18 acc: 0.3317
19 0 loss: 0.4286673367023468
19 100 loss: 0.5325354337692261
19 200 loss: 0.3180204927921295
19 300 loss: 0.48299315571784973
19 acc: 0.3328
20 0 loss: 0.5821853280067444
20 100 loss: 0.24863868951797485
20 200 loss: 0.25470632314682007
20 300 loss: 0.23631633818149567
20 acc: 0.3273
21 0 loss: 0.328163743019104
21 100 loss: 0.19887247681617737
21 200 loss: 0.20321449637413025
21 300 loss: 0.37942832708358765
21 acc: 0.3366
22 0 loss: 0.3218492865562439
22 100 loss: 0.3823566734790802
22 200 loss: 0.2301541566848755
22 300 loss: 0.23679348826408386
22 acc: 0.3281
23 0 loss: 0.4278489351272583
23 100 loss: 0.17314794659614563
23 200 loss: 0.19846001267433167
23 300 loss: 0.15466056764125824
23 acc: 0.3397
24 0 loss: 0.3409762978553772
24 100 loss: 0.19322939217090607
24 200 loss: 0.2183304876089096
24 300 loss: 0.10360629856586456
24 acc: 0.3304
25 0 loss: 0.184882253408432
25 100 loss: 0.15770471096038818
25 200 loss: 0.11995077133178711
25 300 loss: 0.17878545820713043
25 acc: 0.3261
26 0 loss: 0.14563722908496857
26 100 loss: 0.10653193295001984
26 200 loss: 0.06353025138378143
26 300 loss: 0.10915520042181015
26 acc: 0.3338
27 0 loss: 0.159509539604187
27 100 loss: 0.049696896225214005
27 200 loss: 0.05399111658334732
27 300 loss: 0.13322849571704865
27 acc: 0.3307
28 0 loss: 0.36089855432510376
28 100 loss: 0.08262927830219269
28 200 loss: 0.18748503923416138
28 300 loss: 0.10662227123975754
28 acc: 0.3373
29 0 loss: 0.12509845197200775
29 100 loss: 0.08384230732917786
29 200 loss: 0.10343224555253983
29 300 loss: 0.13146759569644928
29 acc: 0.3421
30 0 loss: 0.16149979829788208
30 100 loss: 0.09493231028318405
30 200 loss: 0.11518850922584534
30 300 loss: 0.2519652545452118
30 acc: 0.3253
31 0 loss: 0.16040371358394623
31 100 loss: 0.08821642398834229
31 200 loss: 0.11975134164094925
31 300 loss: 0.2427465319633484
31 acc: 0.3342
32 0 loss: 0.11135876178741455
32 100 loss: 0.11297046393156052
32 200 loss: 0.11937586963176727
32 300 loss: 0.04514150321483612
32 acc: 0.3312
33 0 loss: 0.10594180226325989
33 100 loss: 0.15190201997756958
33 200 loss: 0.0702848881483078
33 300 loss: 0.03502190113067627
33 acc: 0.3291
34 0 loss: 0.15665759146213531
34 100 loss: 0.1422211229801178
34 200 loss: 0.08091887831687927
34 300 loss: 0.1349743902683258
34 acc: 0.3378
35 0 loss: 0.11525900661945343

建议上colab上跑去,我也想去colab上跑,chrome打不开,卡在了第一步T_T。

标签:acc,loss,200,人工智能,300,tf,图像,CNN,100
来源: https://blog.csdn.net/weixin_45906196/article/details/121754619

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有