文章目录
一、例子
1.代码
这里是一个我写的简单的例子,代码如下:
import numpy as np
import tensorflow as tf
from tensorflow.keras import Model
from tensorflow.keras.layers import Conv2D,BatchNormalization,Activation,MaxPool2D,Dropout,Flatten,Dense
path=r'C:\Users\67368\Desktop\python深度学习\训练集和测试集'
x_train_path=path+'\minist_x_train.npy'
y_train_path=path+'\minist_y_train.npy'
x_train=np.load(x_train_path)
print(len(x_train))
print(x_train.shape)
#x_train=np.reshape(x_train,(len(x_train),80,57,3))
y_train=np.load(y_train_path)
#y_train=np.reshape(x_train,(len(y_train),(14,20)))
#测试输入的训练集
'''
for i in range(len(y_train)):
print(x_train[i])
print(len(x_train[i]))
print(i)
print(y_train[i])
print('*'*30)
'''
'''
i=9
plt.imshow(x_train[i])
print(y_train[i])
plt.show()
'''
class Mymodel(Model):
def __init__(self):
super(Mymodel, self).__init__()
self.c1 = Conv2D(filters=4, kernel_size=(3, 3), activation='relu')
self.p1 = MaxPool2D(pool_size=(2, 2), strides=2)
#self.c2 = Conv2D(filters=3, kernel_size=(3, 3), activation='sigmoid')
#self.p2 = MaxPool2D(pool_size=(2, 2), strides=2)
self.flatten = Flatten()
self.f1 = Dense(14, activation='softmax', kernel_regularizer=tf.keras.regularizers.l2())
def call(self, x):
x = self.c1(x)
x = self.p1(x)
x = self.flatten(x)
y = self.f1(x)
return y
model = Mymodel()
'''
model=tf.keras.models.Sequential( [
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(14,activation='softmax',kernel_regularizer=tf.keras.regularizers.l2())])
'''
#4model.compile()
model.compile(optimizer=tf.keras.optimizers.SGD(lr=0.1),
loss=tf.keras.losses.SparseCategoricalCrossentropy(from_logits=False),
metrics=['sparse_categorical_accuracy']
)
model.fit(x_train,y_train,batch_size=32,epochs=80,validation_split=0.2,validation_freq=1)
np.set_printoptions(threshold=np.inf)
model.summary()
#C:\Users\67368\Desktop\python深度学习\深度学习笔记
path=r'C:\Users\67368\Desktop\python深度学习\深度学习笔记'
model.save_weights('quanzhong\model_cnn__try1.ckpt')
file=open(path+'\weight.txt','w')
for v in model.trainable_variables:#tf.all_variables返回的是所有变量的列表
file.write(str(v.name)+'\n')
file.write('*'*30)
file.write(str(v.shape)+'\n')
file.write('*'*30)
file.write(str(v.numpy())+'\n')
file.close()
2.运行的summary
summary如下:
________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
conv2d (Conv2D) multiple 112
max_pooling2d (MaxPooling2D multiple 0
)
flatten (Flatten) multiple 0
dense (Dense) multiple 17654
=================================================================
Total params: 17,766
Trainable params: 17,766
Non-trainable params: 0
_________________________________________________________________
Process finished with exit code 0
二、解释
conv2d (Conv2D) multiple 112
这里的112是卷积核3*3和通道数3还有filters=4相乘,再加上filters=4
即3×3×3×4+4=112。
dense (Dense) multiple 17654
17654的过程是45×32×3的图片经过卷积核3×3后变为43×30,这里为什么不是43×30×3呢?卷积过程中,输入层有多少个通道,滤波器就要有多少个通道,也就是3×3其实是3×3×3,然后由三个通道上(i,j)处的卷积结果相加然后再取激活函数值得到的。所以是43×30。由于我们的filters=4,所以最后的输出为43×30×4。
然后经过池化由于步长是2,变成了21×15×4,由于我这里的类别是14种,所以参数个数就是21×15×4×14+14=17654。
和summary答案一样了。