| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127 |
- #%%
- import tensorflow as tf
- from tensorflow import keras
- from tensorflow.keras import layers,Sequential,losses,optimizers,datasets
- #%%
- x = tf.constant([2.,1.,0.1])
- layer = layers.Softmax(axis=-1)
- layer(x)
- #%%
- def proprocess(x,y):
- x = tf.reshape(x, [-1])
- return x,y
- # x: [60k, 28, 28],
- # y: [60k]
- (x, y), (x_test,y_test) = datasets.mnist.load_data()
- # x: [0~255] => [0~1.]
- x = tf.convert_to_tensor(x, dtype=tf.float32) / 255.
- y = tf.convert_to_tensor(y, dtype=tf.int32)
- # x: [0~255] => [0~1.]
- x_test = tf.convert_to_tensor(x_test, dtype=tf.float32) / 255.
- y_test = tf.convert_to_tensor(y_test, dtype=tf.int32)
- train_db = tf.data.Dataset.from_tensor_slices((x,y))
- train_db = train_db.shuffle(1000).map(proprocess).batch(128)
- val_db = tf.data.Dataset.from_tensor_slices((x_test,y_test))
- val_db = val_db.shuffle(1000).map(proprocess).batch(128)
- x,y = next(iter(train_db))
- print(x.shape, y.shape)
- #%%
- from tensorflow.keras import layers, Sequential
- network = Sequential([
- layers.Dense(3, activation=None),
- layers.ReLU(),
- layers.Dense(2, activation=None),
- layers.ReLU()
- ])
- x = tf.random.normal([4,3])
- network(x)
- #%%
- layers_num = 2
- network = Sequential([])
- for _ in range(layers_num):
- network.add(layers.Dense(3))
- network.add(layers.ReLU())
- network.build(input_shape=(None, 4))
- network.summary()
- #%%
- for p in network.trainable_variables:
- print(p.name, p.shape)
- #%%
- # 创建5层的全连接层网络
- network = Sequential([layers.Dense(256, activation='relu'),
- layers.Dense(128, activation='relu'),
- layers.Dense(64, activation='relu'),
- layers.Dense(32, activation='relu'),
- layers.Dense(10)])
- network.build(input_shape=(4, 28*28))
- network.summary()
- #%%
- # 导入优化器,损失函数模块
- from tensorflow.keras import optimizers,losses
- # 采用Adam优化器,学习率为0.01;采用交叉熵损失函数,包含Softmax
- network.compile(optimizer=optimizers.Adam(lr=0.01),
- loss=losses.CategoricalCrossentropy(from_logits=True),
- metrics=['accuracy'] # 设置测量指标为准确率
- )
- #%%
- # 指定训练集为db,验证集为val_db,训练5个epochs,每2个epoch验证一次
- history = network.fit(train_db, epochs=5, validation_data=val_db, validation_freq=2)
- #%%
- history.history # 打印训练记录
- #%%
- # 保存模型参数到文件上
- network.save_weights('weights.ckpt')
- print('saved weights.')
- del network # 删除网络对象
- # 重新创建相同的网络结构
- network = Sequential([layers.Dense(256, activation='relu'),
- layers.Dense(128, activation='relu'),
- layers.Dense(64, activation='relu'),
- layers.Dense(32, activation='relu'),
- layers.Dense(10)])
- network.compile(optimizer=optimizers.Adam(lr=0.01),
- loss=tf.losses.CategoricalCrossentropy(from_logits=True),
- metrics=['accuracy']
- )
- # 从参数文件中读取数据并写入当前网络
- network.load_weights('weights.ckpt')
- print('loaded weights!')
- #%%
- # 新建池化层
- global_average_layer = layers.GlobalAveragePooling2D()
- # 利用上一层的输出作为本层的输入,测试其输出
- x = tf.random.normal([4,7,7,2048])
- out = global_average_layer(x) # 池化层降维
- print(out.shape)
- #%%
- # 新建全连接层
- fc = layers.Dense(100)
- # 利用上一层的输出作为本层的输入,测试其输出
- x = tf.random.normal([4,2048])
- out = fc(x)
- print(out.shape)
- #%%
|