图片是由一堆像素点构成的,现在我们假设一张图片(只含4个像素点):
图片都有一个得分函数Y,得出的分数代表这张图片像狗的分数,这个得分越高,说明这张图片越像狗:
如果用python实现上述函数,最好使用2个矩阵进行相乘,转化为矩阵乘法:
目前为止,这个函数只能给狗这个类别打分,分数越高越像狗。
假如我们现在还想再加入一个打分函数,给猫打分,那么就有2个函数了。
转化为矩阵乘法:
那么我们就可以根据这两个得分的高低判断是猫还是狗了。
如果还有其他的类别,可以继续加入。
如果将这些分数送入softmax函数,便能得出概率了。
续:
在tensorflow中实现上述问题:利用手写数字作为数据集,图像大小为28*28
28*28=784
给图像标号,图像大小为28*28=784,一共有784个像素点,
标记为x1, x2, x3, x4............x783, x784
每个类别都有自己的参数:
每个像素点与对应位置参数相乘
这就得到了10个得分,那个得分高,图像的类别就是哪一类。
转换为矩阵乘法:
为了方便矩阵乘法,图像要展成一个向量。
from tensorflow.keras.datasets import mnist
from tensorflow.keras import Model
from tensorflow.keras import layers
import tensorflow as tf
(x_train, y_train), (x_test, y_test) = mnist.load_data()
class MyDNN(Model):
def __init__(self):
super(MyDNN, self).__init__()
self.Flatten = layers.Flatten(input_shape=(28, 28))
self.Dense = layers.Dense(10, activation="softmax", use_bias=False)
def call(self, inputs, training=None, mask=None):
x = self.Flatten(inputs)
x = self.Dense(x)
return x
loss_fn = tf.keras.losses.SparseCategoricalCrossentropy(from_logits=True)
net = MyDNN()
net.compile(optimizer="adam", loss=loss_fn, metrics=['accuracy'])
net.fit(x_train, y_train, epochs=5)