通道顺序与pytorch不一致; [batch,height,width,channel]
0、numpy的属性
xx.ndim xx.shape xx.dtype
np.expand_dims(resize(mask_, (IMG_HEIGHT, IMG_WIDTH), mode='constant', preserve_range=True), axis=-1) #增加最后一维度
1、创建张量tensor
1.1 constant生成
tf.constant(张量内容,dtype=数据类型(可选))
1.2、numpy转Tensor
tf.convert_to_tensor(数据名,dtype=数据类型(可选))
1.3、创建全0、1及指定值的张量
tf.zeros(维度) tf.zeros([2,3])
tf.ones(维度)
tf.fill(维度,指定值)
1.4 生成随机数
正态分布 tf.random.normal(维度,mean=均值,stddev=标准差)
2、常用函数
强制转换数据类型
tf.cast(张量名,dtype=数据类型)
维度上的最大值、最小值、平均值、和
tf.reduce_min(张量名) 维度上的最大值
tf.reduce_max(张量名) 维度上的最大值
axis操作维度方向
tf.reduce_mean(张量名,axis=操作轴)
tf.reduce_sum(张量名,axis=操作轴)
将变量标记为’可训练’ ,标记待训练的参数
tf.Variable()
数学运算函数
加减乘除:tf.add(张量1,张量2) tf.subtract tf.multiply tf.divide
平方、次方、开方:tf.square tf.pow(张量名,n次方) tf.sqrt
矩阵乘:tf.matmul
生成输入特征/标签对 tf.data.Dataset.from_tensor_sliceswith tf.GradientTape() as tape:
data = tf.data.Dataset.from_tensor_slices((输入特征,标签))
tf.GradientTape() 实现某个函数对指定参数的求导运算
with结构记录计算过程,gradient求出张量的梯度
with tf.GradientTape() as tape:
若干个计算过程
grads = tape.gradient(函数loss, 对谁求导w)
one-hot encoding
tf.one_hot(待转换数据,depth=几分类)
tf.nn.softmax使输出符合概率分布
softmax(yi)= /
assign_sub w参数更新
assign_sub(需要自减的内容) 减去更换参数的值并返回
tf.argmax返回张量沿指定维度最大值索引
tf.argmax(张量名,axis=操作轴)
训练参数不像pytorch样可跟踪的,需用with tf.GradientTape() as tape:
with tf.GradientTape() as tape: predictions = model(images) loss = loss_object(labels, predictions) gradients = tape.gradient(loss, model.trainable_variables) optimizer.apply_gradients(zip(gradients, model.trainable_variables))
二、tensorflow.keras 里常用的模块有
layers:包含Dense, Conv2D,Flatten,Dropout,MaxPool2D,BatchNormalization, Activation,
optimizers:Adam,
models:Sequential,
datasets:mnist,fashion_mnist,
卷积就是特征提取器:CBAPD
C: Conv2D(filters,kernel_size,padding)
B:BatchNormalization() 批标准化
A:Activation 激活
P:MaxPool2D
D:Dropout(概率值)
keras数据集下载的地方:C:\Users\zjcnzcl\.keras
plot_imgs = np.hstack(imgs) #水平方向拼接
#plt.imshow(plot_imgs,cmap='gray') matplotlib还要学习下
三、tf.keras搭建六步法:
1.import 2.train和test
3.顺序结构:model=tf.keras.models.Sequential([网络层结构]) 前向传播
model = models.models.Sequential()
model.add()的形式
实例化形式:
class MyModel(Model)
model= MyModel
class MyModel(Model):
def __init__(self):
super(MyModel, self).__init__()
#定义网络结构块
def call(self, x):
#调用网络结构块,实现前向传播
return y
model = MyModel() #实例化
3、或非顺序结构 函数式API
model = models.Model(inputs= input_tensor, outputs = output_tensor)
4.model.compile(optimizer=优化器,loss=损失函数,metrics=['准确率']) 优化器、损失函数、评测指标
损失函数(目标函数):选择损失函数,训练过程中将其最小化;
二分类:二元交叉熵 binary crossentropy
多分类:分类交叉熵 categorical crossentropy
回归:均方误差 mean-squared error
优化器:基于损失函数,如何对网络更新;
metrics 评价指标;给人客观的数据分析;
5.model.fit 执行训练过程,输入训练集和测试集的输入特征和标签,batch.epoch
6.model.summary 打印网络结构和参数统计
3model=tf.keras.models.Sequential([网络层结构])举例:
拉直层:tf.keras.layers.Flatten()
全连接层:tf.keras.layers.Dense(神经元个数,activation='激活函数',kernel_regularizer=哪种正则化)
activation可选: relu softmax sigmoid tanh
kernel_regularizer可选:tf.keras.regularizers.l1() tf.keras.regularizers.l2() l1和l2正则化;
卷积层:tf.keras.layers.Conv2D(filters=卷积核个数,kernel_size='卷积核尺寸',strides=卷积步长,padding=valid or same)
4.model.compile(optimizer=优化器,loss=损失函数,metrics=['准确率'])
optimizer:字符串形式或函数形式:sgd adagrad adam adadelta
用函数形式还可以设置参数
loss可选:字符串或函数形式:mse
tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False)
metrics(度量指标:准确度等):
‘accuracy':y_和y都是数值,如y_=[1] y=[1]
‘categorical_accuracy':y_和y都是独热码(概率分布),如y_=[0,1,0] y=[0.256,0.695.0.048']
‘sparse_categorical_accuracy’: y_是数值,y是独热码(概率分布)
标签转换成one-hot形式:train_labels = to_categorical(train_labels)
5model.fit(训练集的输入特征,训练集的标签,batch_size=,epochs=validation data=(测试集的输入特征,测试集的标签):validation_split=从训练集划分多少比例给测试集,validation freq=多少次epoch测试一次,callbacks=[cp_callback])
cp_callback = tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_save_path, save_weights_only=True, save_best_only=True)
6、model.summary() 打印网络结构及参数
自制数据集:解决本领域应用
数据增强:扩充数据集
断点续训:存取模型
参数提取:把参数存入文本
acc/loss可视化:查看训练效果
利用已经有的数据集下载的效果:
mnist = tf.keras.datasets.mnist
下载的格式为:mnist.npz 解压后发现有四个文件x_train.npz, y_train.npz, x_test.npz, y_test.npz
均为<class 'numpy.ndarray'>格式