深度学习与机器学习啃书(10.20)

深度学习 神经网络的数据类型

  • 1 神经网络的基本架构
  • 2 神经网络入门

1 神经网络的基本架构

1)神经网络的核心组件是层,即依靠对输入数据的“筛选”进行模型的训练。同时,要想训练网络,我们还需要选择编译步骤的三个参数:

  • 损失函数(loss function):用于衡量训练数据上的性能
  • 优化器:(optimizer):基于训练数据和损失函数来更新网络的机制
  • 监控指标:即训练还需关注的部分,如精度等

2)在神经网络当中是如何表示数据的?
一般来说,数据都存储在多维的Numpy数组当中,称之为张量(tensor),张量也可以看作是一个数字的容器,是矩阵向任意一个维度的推广,将张量的维度称为轴(axis)。

数据类型 解释
标量(0D张量) 仅包含一个数字的张量(Numpy中的一个float32或者float64),可以通过ndim属性进行调用;x = np.array(12)
向量(1D张量) 一维张量只有一个轴;x = np.array([12,3,4,15,1])
矩阵(2D张量) 二维张量有2个轴;x = np.array([12,3,4,15,1],[16,3,4,17,9],[12,3,0,28,5])
3D矩阵或更高维向量 3D张量即由多个矩阵合成一个数组,更高维则由低维所合成;x = np.array([[12,3,4,,15,1],[16,3,4,,17,9],[12,3,0,28,5]],[[12,3,4,,15,1],[16,3,4,,17,9],[12,3,0,28,5]],[[12,3,4,,15,1],[16,3,4,,17,9],[12,3,0,28,5]])

张量由三个关键的属性进行定义:

  1. 轴的个数(阶):即ndim
  2. 形状:即显示张量沿每个轴的维度大小,如3D张量示例的形状为:(3,3,5)
  3. 数据类型:dtype

一般可以对张量进行切片操作,比如data[10:100, :, :],其中:表示该轴全选。同时还有数据批量操作,一般将第一个轴叫做批量轴或者批量维度。在现实世界中:

3)基于梯度的优化:
即小批量随机数据下降(小随机SGD):

  1. 抽样训练样本x和对应目标y组成的数据批量
  2. 在x上运行网络,得到预测值y_pred
  3. 计算网络在这批数据上的损失,用于衡量y_pred和y之间的距离
  4. 计算损失相对于网络参数的梯度(即一次反向传播(backward pass))
  5. 将参数沿梯度的反方向移动一点,从而使这批数据上的损失可以小一点。

2 神经网络入门

from tensorflow.keras.datasets import reuters
from tensorflow.keras.utils.np_utils import to_categorical
import numpy as np
from tensorflow.keras import models
from tensorflow.keras import layers
from tensorflow.keras import optimizers
import matplotlib.pyplot as plt

(train_data, train_labels), (test_data, test_labels) = reuters.load_data(num_words = 10000)

#对索引进行解码
word_index = reuters.get_word_index()
reverse_word_index = dict([value, key] for (key, value) in word_index.items())
#0\1\2是为padding、start of sequence、unknown分别保留的索引
decoded_newswire = ''.join([reverse_word_index.get(i-3,'?') for i in train_data[0]])

#对数据进行编码
def vectorize_sequences(sequences, dimension = 10000):
    results = np.zeros((len(sequences), dimension))
    for i, sequence in enumerate(sequences):
        results[i, sequence] = 1.
    return results
x_train = vectorize_sequences(train_data)
x_test = vectorize_sequences(test_data)

def to_one_hot(labels, dimension = 46):
    results = np.zeros((len(labels), dimension))
    for i, label in enumerate(labels):
        results[i,label] = 1.
    return results
one_hot_train_labels = to_one_hot(train_labels)
one_hot_test_labels = to_one_hot(test_labels)
#one_hot_train_labels = to_categorical(train_labels)
#one_hot_test_labels = to_categorical(test_labels)

model = models.Sequential()
model.add(layers.Dense(64, activation='relu',input_shape=(10000,)))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(46, activation='softmax'))
#意味着对每个输入样本,都将会输出一个46维的向量
model.compile(optimizer='rmsprop', loss= 'categorical_crossentropy', metrics=['accuracy'])
#留出验证集
x_val = x_train[:1000]
partial_x_train = x_train[1000:]
y_val = one_hot_train_labels[:1000]
partial_y_train = one_hot_train_labels[1000:]
#模型训练
history = model.fit(partial_x_train,partial_y_train,
                    epochs=20,batch_size=512,
                    validation_data=(x_val,y_val))
#损失曲线和精度曲线的绘制
loss = history.history['loss']
val_loss = history.history['val_loss']
epochs = range(1, len(loss)+1)
plt.plot(epochs, loss, 'bo', label='Training loss')
plt.plot(epochs, val_loss, 'b', label='Validation loss')
plt.title('Training and Validation loss')
plt.xlabel('Epoches')
plt.ylabel('Loss')
plt.legend()
plt.show()

你可能感兴趣的:(深度学习,机器学习,python)