我在这个领域是新手,可能这就是我感到困惑的原因。我无法得到所需的结果,因为准确率非常低,这意味着我做错了什么。
图中显示的是一个RNN结构,模型接收输入(x),通过NNAF(激活函数)处理,然后通过移位操作符将一个值传回以便在未来使用(与vRNN相同)。这个图表更像是控制理论中的动态系统。
import sklearnimport pandas as pdfrom keras.models import Sequentialfrom keras.layers import Densefrom keras.layers import LSTMimport matplotlib.pyplot as pltimport sklearn.model_selectionfrom tensorflow.keras import layersdata= pd.read_csv("u.csv")#print(data.head())plt.plot(data)plt.show()import tensorflowx=data.iloc[:,:3].valuesy=data.iloc[:,-1].valuesn_features = 1n_steps = 3x_train, x_test, y_train, y_test = sklearn.model_selection.train_test_split(x,y, test_size=0.1)xtr=x_train# create and fit the networkn_features = 1x_train = x_train.reshape((x_train.shape[0], x_train.shape[1], n_features))model = Sequential()# expected input data shape: (batch_size, timesteps, data_dim)model = tensorflow.keras.Sequential()model.add(layers.Embedding(input_dim=3, output_dim=1)) # returns a sequence of vectors of dimension model.add(layers.SimpleRNN(2, return_sequences=True)) # returns a sequence of vectors of dimension model.add(layers.SimpleRNN(2)) # return a single vector of dimension 32model.add(Dense(1, activation='softmax'))model.compile(optimizer='adam', loss='mse')model.fit(x_train, y_train)x_test = x_test.reshape((x_test.shape[0], x_test.shape[1], n_features))y_pred=model.predict(x_train)#print(x_train.shape)#print(y_train.shape)print(model.layers[0].get_weights()[0]) # W - input weightsprint(model.layers[0].get_weights()[1]) # U - recurrent weightsprint(model.layers[0].get_weights()[2]) # b - outputm=model.layers[0].get_weights()[0]
回答:
如果你想使用PyTorch创建神经网络,存在多种类型的神经网络,以下是三种主要的构建块:
FFN :
- 前馈神经网络
- CNN : 卷积神经网络
- RNN : 循环神经网络(LSTM是RNN的一种类型,你可以使用下面的RNN代码并修改它以获得LSTM,如果你觉得困难,请告诉我,我会发布修改方法)
我们从FNN开始:FNN由三层组成:
- 输入层
- 隐藏层
- 输出层
在MNIST的情况下,每个输入层形状不同,并且各有其行为
- FNN : 平坦的28*28
- CNN : 通道,28,28 : 主要用于图像
- RNN : 每步输入28,总共28个时间步 : 用于时间序列数据类型 [视频,文本,音频]
FNN的代码是:
import torchimport torch.nn as nnfrom torch.autograd import Variableimport torchvision.datasets as dsetsimport torchvision.transforms as transformstrain_dataset = dsets.MNIST(root="./data", train=True, transform=transforms.ToTensor(), download=True )test_dataset = dsets.MNIST(root="./data", train=False, transform=transforms.ToTensor())batch_size=100n_iters = 3000n_epochs = n_iters / (len(train_dataset)/batch_size)n_epochs = int(n_epochs)train_dataloader = torch.utils.data.DataLoader(dataset=train_dataset, batch_size=batch_size, shuffle=True)test_dataloader = torch.utils.data.DataLoader(dataset=test_dataset, batch_size=batch_size, shuffle=False)class FeedforwardNNModelSIG(nn.Module): def __init__(self,input_dim,hidden_dim,output_dim): super().__init__() #线性层 self.fc1=nn.Linear(input_dim,hidden_dim) #非线性层 self.sigmoid=nn.Sigmoid() #线性层(输出层) self.fc2=nn.Linear(hidden_dim,output_dim) def forward(self,x): # 线性 out = self.fc1(x) # 非线性 out = self.sigmoid(out) # 线性(输出层) out = self.fc2(out) return outinput_dim=28*28hidden_dim=50output_dim=10model = FeedforwardNNModelSIG(input_dim,hidden_dim,output_dim)criterion = nn.CrossEntropyLoss()learning_rate = 0.1optimizer = torch.optim.SGD(model.parameters(),lr=learning_rate)iter=0for epoch in range(n_epochs): for i,(images, labels) in enumerate(train_dataloader): ##1 将输入/标签转换为变量 images = Variable(images.view(-1,28*28)) labels = Variable(labels) ##2 清除梯度 optimizer.zero_grad() ##3 获取给定输入的输出 outputs = model(images) ##4 获取损失 loss = criterion(outputs,labels) ##5 获取相对于参数的梯度 loss.backward() ##6 使用梯度更新参数 optimizer.step() ##7 重复 iter +=1 if iter % 500 == 0 : correct = 0. total = 0. # 遍历测试数据集 for images,labels in test_dataloader: images = Variable(images.view(-1,28*28)) labels = Variable(labels) outputs = model(images) # 获取预测的最大值 _,predicted=torch.max(outputs.data,1) # 标签的数量 total += labels.size(0) # 总正确预测 correct += (predicted==labels).sum() accuracy = 100*(correct/total) print("Iteration: {} , Loss:{} , Accuracy:{}".format(iter,loss.data,accuracy))